Сборка uClinux для ПЛИС?
Я хочу собрать Linux для моего Altera DE2-115, который соединяется с последовательным портом. Теперь я вижу панику ядра от последовательного порта, когда я пытаюсь запустить его:
0.000000] Linux version 4.8.0+ (developer@developer-Latitude-E7450) (gcc version 6.2.0 (Sourcery CodeBench Lite 207
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] early_console initialized at 0xe8001400
[ 0.000000] On node 0 totalpages: 32768
[ 0.000000] free_area_init_node: node 0, pgdat c05d88f0, node_mem_map c0699740
[ 0.000000] Normal zone: 288 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 32768 pages, LIFO batch:7
[ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[ 0.000000] pcpu-alloc: [0] 0
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32480
[ 0.000000] Kernel command line: debug console=ttyAL0,115200
[ 0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[ 0.000000] Sorting __ex_table...
[ 0.000000] allocated 131072 bytes of page_ext
[ 0.000000] Memory: 122900K/131072K available (4215K kernel code, 166K rwdata, 1456K rodata, 164K init, 740K bss, 81)
[ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] NR_IRQS:64 nr_irqs:64 0
[ 0.000000] Kernel panic - not syncing: 1 timer is found, it needs 2 timers in system
[ 0.000000]
[ 0.000000] ---[ end Kernel panic - not syncing: 1 timer is found, it needs 2 timers in system
[ 0.000000]
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
[ 0.000000] Kernel panic - not syncing: Oops
[ 0.000000] ---[ end Kernel panic - not syncing: Oops
[ 0.000000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.000000] ea = c0003de4, ra = c028ac84, cause = 15
Было много шагов, и я попытаюсь восстановить с двумя таймерами, но вы можете сказать мне, как я должен это сделать? Какая информация больше нужна? Я сильно изменился в make menuconfig
но теперь я доказал, что его можно начать и увидеть с помощью minicom через последовательный порт. Я использовал .sof
от друга, у которого была очень урезанная версия uClinux, и она тоже была старой. У него был только root-доступ, и я пытаюсь сделать так, чтобы вы могли войти в систему. Файл dts выглядит следующим образом.
/*
* This devicetree is generated by sopc2dts version unknown on Mon Mar 13 18:52:55 CET 2017
* Sopc2dts is written by Walter Goossens <waltergoossens@home.nl>
* in cooperation with the nios2 community <nios2-dev@lists.rocketboards.org>
*/
/dts-v1/;
/ {
model = "ALTR,qsys";
compatible = "ALTR,qsys";
#address-cells = <1>;
#size-cells = <1>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu: cpu@0x0 {
device_type = "cpu";
compatible = "altr,nios2-16.1", "altr,nios2-1.1";
reg = <0x00000000>;
interrupt-controller;
#interrupt-cells = <1>;
altr,exception-addr = <3221225504>; /* embeddedsw.dts.params.altr,exception-addr type NUMBER */
altr,fast-tlb-miss-addr = <3355447296>; /* embeddedsw.dts.params.altr,fast-tlb-miss-addr type NUMBER */
altr,has-initda = <1>; /* embeddedsw.dts.params.altr,has-initda type NUMBER */
altr,has-mmu = <1>; /* embeddedsw.dts.params.altr,has-mmu type NUMBER */
altr,has-mul = <1>; /* embeddedsw.dts.params.altr,has-mul type NUMBER */
altr,implementation = "fast"; /* embeddedsw.dts.params.altr,implementation type STRING */
altr,pid-num-bits = <8>; /* embeddedsw.dts.params.altr,pid-num-bits type NUMBER */
altr,reset-addr = <3221225472>; /* embeddedsw.dts.params.altr,reset-addr type NUMBER */
altr,tlb-num-entries = <256>; /* embeddedsw.dts.params.altr,tlb-num-entries type NUMBER */
altr,tlb-num-ways = <16>; /* embeddedsw.dts.params.altr,tlb-num-ways type NUMBER */
altr,tlb-ptr-sz = <8>; /* embeddedsw.dts.params.altr,tlb-ptr-sz type NUMBER */
clock-frequency = <50000000>; /* embeddedsw.dts.params.clock-frequency type NUMBER */
dcache-line-size = <32>; /* embeddedsw.dts.params.dcache-line-size type NUMBER */
dcache-size = <2048>; /* embeddedsw.dts.params.dcache-size type NUMBER */
icache-line-size = <32>; /* embeddedsw.dts.params.icache-line-size type NUMBER */
icache-size = <4096>; /* embeddedsw.dts.params.icache-size type NUMBER */
}; //end cpu@0x0 (cpu)
}; //end cpus
memory {
device_type = "memory";
reg = <0x08001000 0x00000400>,
<0x00000000 0x08000000>;
}; //end memory
sopc0: sopc@0 {
device_type = "soc";
ranges;
#address-cells = <1>;
#size-cells = <1>;
compatible = "ALTR,avalon", "simple-bus";
bus-frequency = <50000000>;
jtag: serial@0x8001440 {
compatible = "altr,juart-16.1", "altr,juart-1.0";
reg = <0x08001440 0x00000008>;
interrupt-parent = <&cpu>;
interrupts = <1>;
}; //end serial@0x8001440 (jtag)
timer: timer@0x8001420 {
compatible = "altr,timer-16.1", "altr,timer-1.0";
reg = <0x08001420 0x00000020>;
interrupt-parent = <&cpu>;
interrupts = <0>;
clock-frequency = <50000000>; /* embeddedsw.dts.params.clock-frequency type NUMBER */
}; //end timer@0x8001420 (timer)
uart: serial@0x8001400 {
compatible = "altr,uart-16.1", "altr,uart-1.0";
reg = <0x08001400 0x00000020>;
interrupt-parent = <&cpu>;
interrupts = <2>;
clock-frequency = <50000000>; /* embeddedsw.dts.params.clock-frequency type NUMBER */
current-speed = <115200>; /* embeddedsw.dts.params.current-speed type NUMBER */
}; //end serial@0x8001400 (uart)
}; //end sopc@0 (sopc0)
chosen {
bootargs = "debug console=ttyAL0,115200";
}; //end chosen
}; //end /
1 ответ
Вы не запускаете Linux на плате "Altera DE2-115", вы запускаете его на оборудовании, встроенном в FPGA (поскольку используемый в плате чип Cyclone IV E "EP4CE115" не является SoC и не имеет никаких "жестких ядер"). "какой-то ARM Cortex-A9 или как). Невозможно полностью ответить на этот вопрос без подробностей аппаратного обеспечения, которое вы внедрили, поскольку ПЛИС позволяют реализовывать что угодно (что вписывается в используемую ПЛИС).
Ваше ядро и ваша реализация nios 2 несовместимы. Можете ли вы восстановить поток битов FPGA, у вас есть проект quartus / qsys с nios 2 и его настройками?
Вы должны проверить, сколько таймеров реализовано в вашем nios, поскольку вашему ядру требуется два из них, что видно при первой "панике":
[ 0.000000] Kernel panic - not syncing: 1 timer is found, it needs 2 timers in system
Это требование относится только к архитектуре nios2, оно исходит из кода инициализатора времени: http://lxr.free-electrons.com/source/arch/nios2/kernel/time.c?v=4.8#L341
341 void __init time_init(void)
343 struct device_node *np;
344 int count = 0;
345
346 for_each_compatible_node(np, NULL, ALTR_TIMER_COMPATIBLE)
347 count++;
348
349 if (count < 2)
350 panic("%d timer is found, it needs 2 timers in system\n", count);
Перестройка ядра Linux 4.8 не поможет, так как этот код всегда безоговорочно компилируется в него: http://lxr.free-electrons.com/source/arch/nios2/kernel/Makefile?v=4.8 20 obj-y += time.o
И ваша сборка ядра правильная или почти правильная, так как она загружается.
Что вы должны сделать - предоставить необходимые таймеры в вашем программном ядре, переконфигурировав проект qsys (добавьте второй таймер, подключите его, как первый, но по другому адресу и новому идентификатору прерывания; другие параметры должны соответствовать требованиям Linux altera). Затем перестройте поток битов с помощью quartus (он длинный). А также зарегистрируйте новый таймер в дереве устройств с правильными смещениями / идентификатором irq, затем заново связайте ядро с device tree и повторно загрузите поток битов FPGA и образ linux в FPGA / Flash.
Требования к двум таймерам для ядер 3.19+ перечислены по адресу https://rocketboards.org/foswiki/view/Documentation/NiosIILinuxUserManual (commit http://lkml.iu.edu/hypermail/linux/kernel/1507.0/01501.html?)
Ядро v3.19 и выше При использовании ядра 3.19 и выше следует отметить несколько вещей:
- Набор инструментов: Sourcery CondeBench Lite 2014.05-47 и выше
- Аппаратное обеспечение: 2 таймера в системе nios2
- DTS: маленькая буква для префикса altr в файле dts, например: altr,has-mmu; совместимый = "altr,juart-1.0";
Или вы можете попробовать ядро старше 3.19, которое может работать с одним таймером.