這裡僅僅是移植成功內核,可以掛載文件系統運行,至於驅動會陸續添加。
第一步:到內核官網上下載最新的內核,我下載的是linux-3.3-rc3.tar.bz2。
第二步:解壓內核,進入arch/arm/mach-s3c64xx目錄下,看到不少6410的板級文件,我們這裡選擇mini6410開開展工作,在目錄下將mach-mini6410.c文件復制一份,命名為:mach-jfj6410.c。這裡我們將文件裡面關於mini6410的字樣都修改為jfj6410.但是這裡要注意,MACHINE_START(JFJ6410, "JFJ6410")這裡的JFJ6410要使用大寫,稍候說明為什麼。大家都知道在一個目錄下添加了文件後,都應該修改當前目錄下的Kconfig和Makefile兩個文件,這是Linux系統編譯的要求。至於怎麼修改,仔細看一下文件內容我相信大家都知道。
Kconfig文件是進行make menuconfig時出現的配置選項,這裡我們添加了自己的板級文件肯定要添加配置選項。內容可以復制MINI6410的。如下:
[plain]
- config MACH_JFJ6410
- bool "JFJ6410"
- select CPU_S3C6410
- select S3C_DEV_HSMMC
- select S3C_DEV_HSMMC1
- select S3C64XX_SETUP_SDHCI
- select S3C_DEV_USB_HOST
- select S3C_DEV_NAND
- select S3C_DEV_FB
- select S3C64XX_SETUP_FB_24BPP
- select SAMSUNG_DEV_ADC
- select SAMSUNG_DEV_TS
- help
- Machine support for the JFJKJ JFJ6410
這裡你應該能夠看出之前為什麼要在那個地方單獨使用大寫了吧,就是為了保持一致。
Makefile文件就是說明要編譯的文件,以及編譯的規則,這裡顯然就是要編譯我們自己的板級文件mach-jfj6410.c,具體如下:
[plain]
- obj-$(CONFIG_MACH_JFJ6410) += mach-jfj6410.o
第三步:配置內核,make menuconfig。這裡我是使用內核自帶的s3c6400_defconfig文件進行修改的,這樣比較簡單,呵呵。基本去掉了大部分的驅動,留下了串口驅動和NAND驅動。
第四步:編譯make zImage。呵呵,這樣就生成了我們需要的內核。
第五步:燒寫,測試內核。因為我們是測試內核,所以U-Boot以及根文件系統都是使用之前的,這裡沒有移植yaffs,所以我目前使用cramfs格式的文件系統。
啟動開發板後出現了如下的錯誤:
[html]
- end_request: I/O error, dev mtdblock2, sector 0
- FAT: unable to read boot sector
- VFS: Cannot open root device "mtdblock2" or unknown-block(31,2)
- Please append a correct "root=" boot option; here are the available partitions:
- 1f00 192 mtdblock0 (driver?)
- 1f01 1856 mtdblock1 (driver?)
- 1f02 30720 mtdblock2 (driver?)
- 1f03 32768 mtdblock3 (driver?)
- Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
後來上網查了很久才發現是驅動的問題。U-boot使用軟件ECC,我們在配置NAND驅動的時候提示是否選擇使用NAND硬件ECC,我試了一下,無論你選不選都出現這個問題,我才發現,它的配置包含三重含義,選中--->使用硬件ECC;不選--->使用NAND的軟件ECC(和U-Boot的軟件ECC不是一回事);而我們這裡需要的是不使用NAND的ECC,也就是禁止,不然就會和U-Boot沖突,出現上面的錯誤。要禁止NAND的ECC,我們修改drivers/mtd/nand/s3c2410.c這個文件,在845行的地方。
源代碼為:
[html]
- chip->ecc.mode = NAND_ECC_SOFT;
修改為:
[html]
- chip->ecc.mode = NAND_ECC_NONE;
這就是當我們不選中的時候,不是使用NAND的軟件ECC,而是不使用NAND的ECC。
再次編譯內核,燒寫後正常運行,打印的信息如下:
[html]
- Starting kernel ...
-
- Uncompressing Linux... done, booting the kernel.
- Booting Linux on physical CPU 0
- Linux version 3.3.0-rc3 (chenlong12580@chenlong12580) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #4 Mon Feb 13 14:58:00 CST 2012
- CPU: ARMv6-compatible processor [410fb766] revision 6 (ARMv7), cr=00c5387d
- CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
- Machine: JFJ6410
- Memory policy: ECC disabled, Data cache writeback
- CPU S3C6410 (id 0x36410101)
- S3C24XX Clocks, Copyright 2004 Simtec Electronics
- camera: no parent clock specified
- S3C64XX: PLL settings, A=532000000, M=532000000, E=24000000
- S3C64XX: HCLK2=266000000, HCLK=133000000, PCLK=66500000
- mout_apll: source is fout_apll (1), rate is 532000000
- mout_epll: source is epll (1), rate is 24000000
- mout_mpll: source is mpll (1), rate is 532000000
- usb-bus-host: source is clk_48m (0), rate is 48000000
- audio-bus: source is mout_epll (0), rate is 24000000
- audio-bus: source is mout_epll (0), rate is 24000000
- audio-bus: source is mout_epll (0), rate is 24000000
- irda-bus: source is mout_epll (0), rate is 24000000
- camera: no parent clock specified
- CPU: found DTCM0 8k @ 00000000, not enabled
- CPU: moved DTCM0 8k to fffe8000, enabled
- CPU: found DTCM1 8k @ 00000000, not enabled
- CPU: moved DTCM1 8k to fffea000, enabled
- CPU: found ITCM0 8k @ 00000000, not enabled
- CPU: moved ITCM0 8k to fffe0000, enabled
- CPU: found ITCM1 8k @ 00000000, not enabled
- CPU: moved ITCM1 8k to fffe2000, enabled
- Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024
- Kernel command line: root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200
- PID hash table entries: 1024 (order: 0, 4096 bytes)
- Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
- Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
- Memory: 256MB256MB = 256MB total
- Memory: 257500k/257500k available, 4644k reserved, 0K highmem
- Virtual kernel memory layout:
- vector : 0xffff0000 - 0xffff1000 ( 4 kB)
- DTCM : 0xfffe8000 - 0xfffec000 ( 16 kB)
- ITCM : 0xfffe0000 - 0xfffe4000 ( 16 kB)
- fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
- vmalloc : 0xd0800000 - 0xff000000 ( 744 MB)
- lowmem : 0xc0000000 - 0xd0000000 ( 256 MB)
- modules : 0xbf000000 - 0xc0000000 ( 16 MB)
- .text : 0xc0008000 - 0xc01d90b8 (1861 kB)
- .init : 0xc01da000 - 0xc01f5000 ( 108 kB)
- .data : 0xc01f6000 - 0xc0216a40 ( 131 kB)
- .bss : 0xc0217024 - 0xc0246c58 ( 192 kB)
- SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
- NR_IRQS:246
- VIC @f6000000: id 0x00041192, vendor 0x41
- VIC @f6010000: id 0x00041192, vendor 0x41
- Console: colour dummy device 80x30
- Calibrating delay loop... 528.79 BogoMIPS (lpj=2643968)
- pid_max: default: 32768 minimum: 301
- Mount-cache hash table entries: 512
- CPU: Testing write buffer coherency: ok
- Setting up static identity map for 0x5015e320 - 0x5015e37c
- gpiochip_add: registered GPIOs 38 to 53 on device: GPF
- gpiochip_add: registered GPIOs 74 to 89 on device: GPI
- gpiochip_add: registered GPIOs 91 to 102 on device: GPJ
- gpiochip_add: registered GPIOs 161 to 176 on device: GPO
- gpiochip_add: registered GPIOs 178 to 192 on device: GPP
- gpiochip_add: registered GPIOs 194 to 202 on device: GPQ
- gpiochip_add: registered GPIOs 144 to 159 on device: GPN
- gpiochip_add: registered GPIOs 0 to 7 on device: GPA
- gpiochip_add: registered GPIOs 9 to 15 on device: GPB
- gpiochip_add: registered GPIOs 17 to 24 on device: GPC
- gpiochip_add: registered GPIOs 26 to 30 on device: GPD
- gpiochip_add: registered GPIOs 32 to 36 on device: GPE
- gpiochip_add: registered GPIOs 55 to 61 on device: GPG
- gpiochip_add: registered GPIOs 137 to 142 on device: GPM
- gpiochip_add: registered GPIOs 63 to 72 on device: GPH
- gpiochip_add: registered GPIOs 104 to 119 on device: GPK
- gpiochip_add: registered GPIOs 121 to 135 on device: GPL
- jfj6410: Option string jfj6410=0
- jfj6410: selected LCD display is 480x272
- S3C6410: Initialising architecture
- bio: create slab <bio-0> at 0
- io scheduler noop registered
- io scheduler deadline registered
- io scheduler cfq registered (default)
- start plist test
- end plist test
- Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
- s3c6400-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 69) is a S3C6400/10
- console [ttySAC0] enabled
- s3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 70) is a S3C6400/10
- s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 71) is a S3C6400/10
- s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 72) is a S3C6400/10
- brd: module loaded
- loop: module loaded
- S3C24XX NAND Driver, (c) 2004 Simtec Electronics
- s3c24xx-nand s3c6400-nand: Tacls=4, 30ns Twrph0=8 60ns, Twrph1=6 45ns
- s3c24xx-nand s3c6400-nand: System booted from NAND
- s3c24xx-nand s3c6400-nand: NAND ECC disabled
- NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
- NAND_ECC_NONE selected by board driver. This is not recommended!
- Scanning device for bad blocks
- Bad eraseblock 1050 at 0x000008340000
- Bad eraseblock 1076 at 0x000008680000
- Bad eraseblock 1211 at 0x000009760000
- Bad eraseblock 1949 at 0x00000f3a0000
- Creating 4 MTD partitions on "nand":
- 0x000000000000-0x000000100000 : "Bootloader"
- 0x000000100000-0x000000600000 : "Kernel"
- 0x000000600000-0x000007e00000 : "User"
- 0x000007e00000-0x000010000000 : "File System"
- mousedev: PS/2 mouse device common for all mice
- VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
- VFS: Mounted root (cramfs filesystem) readonly on device 31:2.
- Freeing init memory: 108K
- mount: mounting none on /proc/bus/usb failed: No such file or directory
- hwclock: can't open '/dev/misc/rtc': No such file or directory
- depmod: chdir(3.3.0-rc3): No such file or directory
- [01/Jan/1970:00:00:07 +0000] boa.c:173 - unable to create socket: Function not implemented
-
- open device leds: No such file or directory
- /usr/sbin/alsactl: load_state:1610: No soundcards found...
-
- ifconfig: socket: Function not implemented
- Try to bring eth0 interface up......cat: can't open '/sys/class/net/eth0/address': No such file or directory
- ifconfig: socket: Function not implemented
- route: socket: Function not implemented
- /etc/init.d/ifconfig-eth0: line 6: can't create /etc/resolv.conf: Read-only file system
- Done
-
- Please press Enter to activate this console.
- [root@JFJ6410 /]# ls
- bin etc lib mnt proc sbin tmp var
- dev home linuxrc opt root sys usr www
- [[email protected] /]#