今天移植linux内核到开发板,真是问题重重,首先是机器码不对,而后又出现网卡驱动不对,紧接着又出现了文件系统不管挂载,不过还好,我遇到问题都比较
擅长去分析和解决,也许这就是程序员的有点吧!让我们看看下面的具体提示,然后分析下吧:
Start Linux ...
Copy linux kernel from 0x00240000 to 0x30008000, size = 0x00200000 ... Copy Kernel to SDRAM done,NOW, Booting Linux......
Uncompressing Linux....................................................................................................................... done, booting the kernel.
Linux version 2.6.30.4-GTStudio (root@localhost.localdomain) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #1 Sun Aug 4 17:27:48 CST 2013
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: GT2440
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
NR_IRQS:85
irq: clearing pending ext status 00000200
irq: clearing subpending status 00000003
irq: clearing subpending status 00000002
PID hash table entries: 256 (order: 8, 1024 bytes)
Console: colour dummy device 80x30
console [ttySAC0] enabled
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: 60956KB available (3432K code, 374K data, 104K init, 0K highmem)
SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 296 bytes
NET: Registered protocol family 16
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C24XX DMA Driver, (c) 2003-2004,2006 Simtec Electronics
DMA channel 0 at c4808000, irq 33
DMA channel 1 at c4808040, irq 34
DMA channel 2 at c4808080, irq 35
DMA channel 3 at c48080c0, irq 36
S3C244X: Clock Support, DVS off
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
s3c2440-i2c s3c2440-i2c: slave address 0x10
s3c2440-i2c s3c2440-i2c: bus frequency set to 97 KHz
s3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
cfg80211: Calling CRDA to update world regulatory domain
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
NET: Registered protocol family 1
yaffs Aug 4 2013 17:24:00 Installing.
msgmni has been set to 119
alg: No test for stdrng (krng)
io scheduler noop registered (default)
leds initialized
buttons initialized
adc initialized
s3c2440-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
loop: module loaded
Driver 'sd' needs updating - please use bus_type methods
cs89x0:cs89x0_probe(0x0)
cs89x0.c: v2.4.3-pre1 Russell Nelson <nelson@crynwr.com>, Andrew Morton
eth0: cs8900 rev J found at 0xc4a00300
cs89x0: Extended EEPROM checksum bad and no Cirrus EEPROM, relying on command line
cs89x0 media IRQ 53, programmed I/O, MAC 08:89:89:89:89:89
cs89x0_probe1() successful
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2440-nand s3c2440-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 162 at 0x000001440000
Bad eraseblock 219 at 0x000001b60000
Bad eraseblock 581 at 0x0000048a0000
Bad eraseblock 1322 at 0x00000a540000
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: S3C24XX OHCI
usb usb1: Manufacturer: Linux 2.6.30.4-GTStudio ohci_hcd
usb usb1: SerialNumber: s3c24xx
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
USB Serial support registered for pl2303
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver
s3c2410_udc: debugfs dir creation failed -19
s3c2440-usbgadget s3c2440-usbgadget: S3C2440: increasing FIFO to 128 bytes
mice: PS/2 mouse device common for all mice
GT2440 TouchScreen successfully loaded
input: GT2440 TouchScreen as /devices/virtual/input/input0
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
i2c /dev entries driver
Linux video capture interface: v2.00
zc0301: V4L2 driver for ZC0301[P] Image Processor and Control Chip v1:1.10
usbcore: registered new interface driver zc0301
gspca: main v2.5.0 registered
usbcore: registered new interface driver zc3xx
zc3xx: registered
usbcore: registered new interface driver uvcvideo
USB Video Class driver (v0.1.0)
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
s3c2440-sdi s3c2440-sdi: host detect has no irq available
mapped channel 0 to 0
s3c2440-sdi s3c2440-sdi: powered down.
s3c2440-sdi s3c2440-sdi: initialisation done.
s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: powered down.
usbcore: registered new interface driver usbhid
usbhid: v2.6:USB HID core driver
Advanced Linux Sound Architecture Driver Version 1.0.20.
No device for DAI UDA134X
No device for DAI s3c24xx-i2s
S3C24XX_UDA134X SoC Audio driver
UDA134X SoC Audio Codec
asoc: UDA134X <-> s3c24xx-i2s mapping ok
ALSA device list:
#0: S3C24XX_UDA134X (UDA134X)
TCP cubic registered
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
lib80211: common routines for IEEE802.11 drivers
s3c2410-rtc s3c2410-rtc: setting system clock to 2009-03-05 18:52:59 UTC (1236279179)
Root-NFS: No NFS server available, giving up.
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "mtdblock2" or unknown-block(2,0)
Please append a correct "root=" boot option; here are the available partitions:
1f00 262144 mtdblock0 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace:
[<c0026fd4>] (dump_backtrace+0x0/0x10c) from [<c029bbfc>] (dump_stack+0x18/0x1c)
r7:c380a0cb r6:c03a8060 r5:c380a000 r4:c381df40
[<c029bbe4>] (dump_stack+0x0/0x1c) from [<c029bc4c>] (panic+0x4c/0x124)
[<c029bc00>] (panic+0x0/0x124) from [<c0008e30>] (mount_block_root+0x178/0x234)
r3:00000000 r2:c38553ec r1:c381df40 r0:c03298a8
[<c0008cb8>] (mount_block_root+0x0/0x234) from [<c0008f9c>] (mount_root+0xb0/0xf4)
[<c0008eec>] (mount_root+0x0/0xf4) from [<c00090d8>] (prepare_namespace+0xf8/0x18c)
r7:c03a7a44 r6:c001e83c r5:c001e83c r4:c001e84c
[<c0008fe0>] (prepare_namespace+0x0/0x18c) from [<c0008478>] (kernel_init+0xc8/0xf4)
r7:00000000 r6:c001ddf4 r5:c001da9c r4:c001ddf4
[<c00083b0>] (kernel_init+0x0/0xf4) from [<c0037f30>] (do_exit+0x0/0x620)
r7:00000000 r6:00000000 r5:00000000 r4:00000000
首先,我将这段代码跟正常linux启动代码进行比较,发现存在两处缺少的地方,在启动代码中已经标出来了:
1.yaffs may31,2006 Installing
2.
Creating 3 MTD partitions on “NAND256MB 3,3V 8-bit”:
0x000000000000-0x000000040000:”uboot”
0x000000200000-0x000000500000:”kernel”
0x000000500000-0x000010000000:”yaffs2”
到网上查下,大概有两种说法:1、yaffs文件系统没有配置成功,File system->Miscellaneous file systems->YAFFS2 file systemsupport前面配置的是【M】,而不是【*】,出错就是因为这里配置的不对的原因。之前配置内核的时候本以为配置成【M】和【*】是没有影响的,原来 是大错特错,有些配置必须要【*】,系统才能正常启动。
2、将device drivers -> Memory Technology Device (MTD) support配置成【*】,同时在device drivers -> Memory Technology Device (MTD) support --->
发现里面有个选项:Caching block device access to MTD devices,也需要将其配置为【*】
但是,这两种方案都没有解决我的问题,由于担心我的Kconfig文件没写对,于是在编译好的linux内核目录下的fs/yaffs2目录下查看了下,发现存在yaffs_fs.o文件,这证明我的linxu内核已经添加了对yaffs2文件的支持,但为什么就是不显示 Creating 3 MTD partitions on “NAND256MB3,3V 8-bit”: 这句话呢?很是纠结,于是仔细看了下我的comm-gt2440.c文件,再跟别人的文件对比,发现少了Nand Flash的配置:
static struct mtd_partition smdk_default_nand_part[] = {
#if defined(CONFIG_64M_NAND)
[0] = {
.name = "boot",
.offset = 0,
.size = SZ_1M,
},
[1] = {
.name = "kernel",
.offset = SZ_1M + SZ_128K,
.size = SZ_4M,
},
[2] = {
.name = "yaffs2",
.offset = SZ_1M + SZ_128K + SZ_4M,
.size = SZ_64M - SZ_4M - SZ_1M - SZ_128K,
}
#elif defined(CONFIG_256M_NAND)
[0] = {
.name = "boot",
.offset = 0,
.size = SZ_1M,
},
[1] = {
.name = "kernel",
.offset = SZ_1M + SZ_128K,
.size = SZ_4M,
},
[2] = {
.name = "yaffs2",
.offset = SZ_1M + SZ_128K + SZ_4M,
.size = SZ_256M - SZ_4M - SZ_1M - SZ_128K,
}
#endif
};但是,记得我的配置放在了plat-s3c24xx文件目录下,于是到该目录下查看了下common-GTStudio.c文件存在如下的Nand Flash初始化配置:
static struct mtd_partition GTStudio_default_nand_part[] = {
#if defined(CONFIG_GTStudio_64MB_NAND)
[0] = {
.name = "uboot",
.offset = 0x00000000,
.size = 0x00040000,
},
[1] = {
.name = "kernel",
.offset = 0x00200000,
.size = 0x00200000,
},
[2] = {
.name = "yaffs2",
.offset = 0x00200000,
.size = 0x03BF8000,
}
#elif defined(CONFIG_GTStudio_more_than_256MB_NAND)
[0] = {
.name = "uboot",
.offset = 0x00000000,
.size = 0x00080000,
},
[1] = {
.name = "kernel",
.offset = 0x00240000,
.size = 0x00200000,
},
[2] = {
.name = "yaffs2",
.offset = 0x00440000,
.size = 0x0FB40000,
}
#endif
};
但是此处的uboot,kernel,yaffs2字样让我有种熟悉的赶紧,这不就是启动代码中缺少的3个MTD块吗。然后将问题定位到CONFIG_GTStudio_more_than_256MB_NAND的
定义上,明显,我的linux内核中没有这个宏定义,于是添加如下定义,具体如下:
->cd linux-2.6.30.4/drivers/mtd/nand
->vi Kconfig
;跳转到165行,编辑添加如下配置:
choice
prompt "Nand Flash Capacity select"
depends on MTD
help
GTStudio Board Nand Flash Capacity select
config GTStudio_64MB_NAND
boolean "64MB Nand for GTStudio Board"
depends on MTD
help
Set 64MB Nand parts
config GTStudio_more_than_256MB_NAND
boolean "256MB~1GB Nand for GTStudio Board"
depends on MTD
help
Set 256MB~1GB Nand parts
endchoice
->cd ../../../../ ;配置linux内核添加256MB nand flash支持
->make menuconfig ARCH=arm
在Device drivers->Momory Technology Device(MTD) support->Nand device support->S3C2410 Nand hardware Ecc下选中Nand Flash Capacity select,同时选择256MB~1GB Nand for GTStudio Board,Ok,重新编译,一切OK。