linux 移植遇到的問題備份

今天移植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 ([email protected]) (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 <[email protected]>, 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章