посиживая на стареньком ядре 2.6.17.14, периодически прочесываю инет на предмет нового и полезного.
Сегодня наткнулся на упоминания что-дескать "патчим nuc900fb.c".. я бегом на kernel.org, вытащил сорцы 2.6.34-rc2
а там.. драйвер экрана, тачскрина, кейпада, rtc, nand, usb, ether, lm90(нахуа?), spi(мля!!!).. и все бы хорошо, но нет драйвера уарта. Спрашивается - и как отлаживать?
интересующий меня nuc900fb.c при беглом просмотре оказался похож на версию из 2.6.17 - никаких намеков на GDMA, 2D - Graphics, Hardware Cursor :(
зы а между тем, братья-китайцы явно не спят, что-то химичат тихой сапой.. и сообщество в гугле открыли (невнятное)
вот на такие таблицы приходится таращиться :)
Недавно начал переносить поддержку NUC9XX из ядра 2.6.17.14, которое шло к плате, на 2.6.32. Выходит зря :(. Пока удалось перенести только содержимое mach-nuc900 и драйвер UART. Здесь перенос осуществлялся довольно линейно: поменять пути h-файлов, обработчики прерываний, имена полей структур и еще что-то по мелочи. Драйвер fb таким образом тоже скомпилировал, но он почему-то не работает.
Но для многих драйверов, я так понял, такими простыми изменениями не отделаешься. Пытался перенести дрйвер SD, но там у Nuvoton'а какое-то безумие, вместо стандартного драйвера SD они сделали SCSI драйвер в который всю поддержку SD осуществляют сами.
а мое мнение - что не зря. "Зря" - это когда пасьянс раскладывают. А вот при переносе поддержки неизмеримо растет опыт работы, который может пригодиться в смежных областях.
у меня есть пара ядер (одно с denx.de второе откудато с *.uk) в одном видел поддерку uart для nuvoton, выглядело как надстройка для.. стандартного кома.. вроде даже работало
это связано с косяком в интерфейсах - Павел хорошо знает эту тему, да тут на форуме обсуждалось
я, когда скачал, заодно и патч прилагаемый вытянул (в развороте ~37МБ!). попробовал навесить на распакованное ядро - был невразумительно послан..
вдогонку - похоже в очередной раз перетряхнули структуру ядра и хидеров :(
вот плюну и пойду на QNX или WinCE смотреть :)
:))) я знал :)))
а чего не пишется? позаимствуй идею из линукс-версии или в qnx все совсем не так?
из меня драйверо-писатель - "никакой". сам прикалываюсь со своего very-ugly-style-code и с легкой завистью смотрю на чужие сорцы, в которых с элегантной легкостью оперируют указателями, ссылками, структурами
хм.. запустил сегодня ядро 2.6.34-rc2 посредством пинков и зуботычин. моментально заработал контроллер LCD - стабильная синхра (хотя в в драйвере режим 320х240), поднялась сеть, с часик повоевал с юсб - пока не срослось (а может и не должно)
в доказательство лог загрузки :)
## Starting application at 0x00008000 ...
Uncompressing Linux... done, booting the kernel.
Linux version 2.6.34-rc2 (root@debian) (gcc version 4.2.1) #14 PREEMPT Thu Mar 25 15:42:09 EDT 2010
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: W90P950EVB
Memory policy: ECC disabled, Data cache writeback
CPU type 0x02900910 is NUC910
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: root=/dev/ram0 console=ttyS0,115200n8 mem=64M initrd=0xa00000,4000000 rw
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 57684k/57684k available, 7852k reserved, 0K highmem
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.init : 0xc0008000 - 0xc0022000 ( 104 kB)
.text : 0xc0022000 - 0xc02e6000 (2832 kB)
.data : 0xc02fc000 - 0xc0313800 ( 94 kB)
Hierarchical RCU implementation.
NR_IRQS:32
Console: colour dummy device 80x30
Calibrating delay loop... 32.66 BogoMIPS (lpj=163328)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
devtmpfs: initialized
NET: Registered protocol family 16
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Switching to clocksource nuc900-timer1
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
Trying to unpack rootfs image as initramfs...
rootfs image is not initramfs (no cpio magic); looks like an initrd
Freeing initrd memory: 3904K
NetWinder Floating Point Emulator V0.97 (double precision)
ROMFS MTD (C) 2007 Red Hat, Inc.
msgmni has been set to 120
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
Console: switching to colour frame buffer device 40x15
fb0: nuc900fb frame buffer device
Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0xb8000000 (irq = 7) is a 16550
console [ttyS0] enabled
brd: module loaded
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
116x: driver isp116x-hcd, 03 Nov 2005
driver isp1362-hcd, 2005-04-04
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
sl811: driver sl811-hcd, 19 May 2005
r8a66597_hcd: driver r8a66597_hcd, 2009-05-26
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
mice: PS/2 mouse device common for all mice
i2c /dev entries driver
usbcore: registered new interface driver hiddev
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP cubic registered
RAMDISK: gzip image found at block 0
VFS: Mounted root (romfs filesystem) readonly on device 1:0.
devtmpfs: mounted
Freeing init memory: 104K
init started: BusyBox v1.9.1 (2009-09-09 10:35:27 EDT)
mount: mounting none on /dev/pts failed: No such file or directory
bash-3.2# ifconfig eth0 192.168.0.136 up
nuc900-emc nuc900-emc: eth0 is OPENED
bash-3.2# nuc900-emc nuc900-emc: eth0: Link now 100-FullDuplex
запустил сегодня ядро 2.6.34-rc2 посредством пинков и зуботычин
И сильно пришлось пинать, в смысле много ли надо править? Потребовались ли патчи? У меня LCD компилироваться вообще отказался - нет nuc900_driver_clksrc_div. Если закоментировать - то не работает.
Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0xb8000000 (irq = 7) is a 16550
И сильно пришлось пинать, в смысле много ли надо править? Потребовались ли патчи? У меня LCD компилироваться вообще отказался - нет nuc900_driver_clksrc_div. Если закоментировать - то не работает.
не-а, чисто чтобы ядро запустилось поправок минимум
- заглушить проверку правильности платы (я до сих пор не знаю, как это корректно сделать) меняю условный переход на безусловный в head-common.S
- поправить параметры Kernel command line на свои
- пробежаться по menuconfig с целью отключить заведомо лишнее и включить необходимое
- в драйвере фреймбуфера закомментировать ту строчку
после этого ядро должно собраться и запуститься
о фреймбуфере: экран не чистится, лого не выводится, вероятно это связано с заглушкой неописанной функции. сегодня нашел вот такой патч похоже надо с ним работать. в общем - работы над этим - начать и умереть :)))
Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0xb8000000 (irq = 7) is a 16550
Это тот самый драйвер-надстройка над комом?
похоже на то. как работает - ума не приложу, желание лазить в эту китайскую вязь стремительно уменьшается :)
Нашел еще один невнятный патч для фреймбуфера. А перед наложением поправил размер экрана под себя. Появился пингвин, но где-то традиционно чего-то не хватает, надо повнимательнее посмотреть регистры..
Патч брал тут в са-амом конце страницы.. вот так нынче выглядит экран с новым ядром
- заглушить проверку правильности платы (я до сих пор не знаю, как это корректно сделать) меняю условный переход на безусловный в head-common.S
Было сделано, правда немного по-другому, как у Nuvoton'а записью номера mach в регистр перед проверкой.
- поправить параметры Kernel command line на свои
- пробежаться по menuconfig с целью отключить заведомо лишнее и включить необходимое
само собой.
Оказалось я неверно воспринял прочитанное.
Во-первых, нет никакого отдельного драйвера-надстройки. Поскольку UART0 у NUC950 совместим со стандартным 16550, то они и используют стандартный драйвер, передавая ему начальный адрес группы регистров UART0 и номер прерывания. Пока не увидел в исходниках, не доходило. Соответственно, зря я выключил поддержку стандартого 8250/16550 в конфигурации и пытался мастерить аналог воображаемого драйвера-надстройки.
Во-вторых, я почему-то решил, что раз
то обязательно должен появится пингвин, раз не появляется - драйвер не работает, или до него вообще не доходит, а виснет где-то раньше.
Теперь консоль заработала, корневуха смонтировалась.
## Starting application at 0x00008000 ...
Uncompressing Linux... done, booting the kernel.
Linux version 2.6.34-rc2 (artem@ghalmek.malstream) (gcc version 4.4.3 (crosstool-NG-1.6.0) ) #13 PREEMPT Fri Mar 26
starting pid 230, tty '': '/etc/init.d/rcS'
mount: mounting /dev/mtdblock0 on /mnt/nand failed: No such file or directory
Initializing random number generator... done.
Starting network...
nuc900-emc nuc900-emc: eth0 is OPENED
route: SIOCADDRT: File exists
starting pid 254, tty '/dev/ttyS0': '/sbin/getty -L ttyS0 115200 vt100'
nuc900-emc nuc900-emc: eth0: Link now 100-FullDuplex
Welcome to SK-MNUC950 development board.
www.starterkit.ru
SK-MNUC950 login: root
Dec 31 17:00:12 login[254]: root login on 'ttyS0'
# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: seq=0 ttl=64 time=10.793 ms
64 bytes from 192.168.0.2: seq=1 ttl=64 time=0.947 ms
64 bytes from 192.168.0.2: seq=2 ttl=64 time=0.886 ms
64 bytes from 192.168.0.2: seq=3 ttl=64 time=0.934 ms
64 bytes from 192.168.0.2: seq=4 ttl=64 time=0.940 ms
64 bytes from 192.168.0.2: seq=5 ttl=64 time=0.893 ms
Нашел еще один невнятный патч для фреймбуфера.
Что-то он у меня не накладывается. Большинство его изменений уже есть в ядре. Надо разбираться.