天天看點

AM335x(TQ335x)學習筆記——挂載Ramdisk

上篇文章中我們已經能夠通過u-boot啟動核心了,但是沒有能夠啟動成功,從核心的log中可以看出,核心啟動失敗的原因是沒有挂載到root檔案系統,本文将使用busybox制作根檔案系統并打包成ramdisk供u-boot啟動核心使用。

(1)制作根檔案系統

使用busybox建構根檔案系統的步驟可以參考本部落格的另外一篇文章,該文章連結如下:

S5PV210(TQ210)學習筆記——核心移植與檔案系統建構

需要補充的是,文章"S5PV210(TQ210)學習筆記——核心移植與檔案系統建構"中記錄rootfs檔案系統建構時漏掉了一步,沒有在etc/sysconfig/目錄下建立HOSTNAME檔案,可以手動添加HOSTNAME檔案,其内容為主機名稱,本文使用了tq335x。在rootfs目錄可以通過如下指令建立:

echo tq335x > etc/sysconfig/HOSTNAME
           

本文在已制作好的rootfs基礎上,制作ramdisk。

(2)制作ramdisk

制作ramdisk的方式很多,最友善的是使用指令genext2fs。ubuntu作業系統上可以通過apt-get工具直接安裝genext2fs工具:

sudo apt-get install genext2fs
           

其它作業系統也有類似的管理工具,這裡就不一一列舉了,下面使用genext2fs打包rootfs目錄。指令如下:

genext2fs -b 4096 -d rootfs/ ramdisk
           

然後使用gzip指令壓縮ramdisk:

gzip -9 -f ramdisk
           

執行完成該指令後可以得到檔案ramdisk.gz。

由于u-boot啟動核心使用的ramdisk需要有u-boot的image頭,故需要使用編譯u-boot時生成的工具mkimage将ramdisk.gz制作為ramdisk.img。其中,工具mkimage位于u-boot的tools目錄下,制作ramdisk.img的指令如下:

u-boot-2014.10/tools/mkimage -A arm -O linux -T ramdisk -C none -a 0x88080000 -n "ramdisk" -d ramdisk.gz ramdisk.img
           

指令中mkimage前的路徑根據自己實際執行的路徑指定即可。

這樣,就完成了u-boot可以使用的ramdisk制作,然後将ramdisk.img拷貝到SD卡的boot目錄下即可。

(3)挂載ramdisk

老式的ATAGS方式啟動核心時使用ATAG傳遞bootargs給核心,由于本文使用的dtb方式啟動核心,故采取dtb的chosen方式傳遞bootargs給核心。

Step1: 修改核心配置

make ARCH=arm menuconfig
           

進入配置項:

Boot options  --->
           

按N鍵取消配置項:

[ ] Use appended device tree blob to zImage (EXPERIMENTAL)
           

官方核心預設啟用了該項配置。啟用該項配置後核心相容老式的ATAGS方式核心啟動,關閉後則使用新式的dtb方式啟動,故此處禁用了此項配置。

按ESC儲存配置後退出menuconfig畫面,重新編譯核心:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
           

Step2:添加bootargs到dtb

切換到核心目錄arch/arm/boot/dts/,拷貝am335x-evm.dts為tq335x.dts:

cp am335x-evm.dts tq335x.dts
           

打開tq335x.dts,在memory項後通過chosen方式添加bootargs,添加内容如下:

memory {
	device_type = "memory";
	reg = <0x80000000 0x10000000>; /* 256 MB */
};

chosen {
	bootargs = "console=ttyO0,115200n8 root=/dev/ram0";
};

...
           

其中chosen節點是新添加的,memory節點是原有的。

接下來重新編譯dtb:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tq335x.dtb
           

将新編譯得到的tq335x.dtb拷貝到SD的boot目錄下。至此,準備工作就完成了,下面我們使用新制作的ramdisk.img和tq335x.dtb啟動核心。

Step3:使用新制作的ramdisk.img和tq335x.dtb啟動核心

将SD插到開發闆上,給開發闆上電(開發闆切換到SD卡啟動模式),可以通過按任意鍵打斷核心啟動進入u-boot指令模式(由于之前沒有配置u-boot的bootcmd環境變量,而預設的u-boot環境無法啟動核心,故,開發闆上電後不按鍵的話也會進入u-boot的指令行模式)。

首先是加載核心到DRAM:

load mmc 0 ${loadaddr} /boot/zImage
           

其中,${loadaddr}在u-boot的環境變量中預設指定為0x82000000,這裡可以直接打數字。

然後是加載dtb到DRAM:

load mmc 0 ${fdtaddr} /boot/tq335x.dtb
           

${fdtaddr}的預設值是0x88000000。

接下來加載ramdisk到DRAM:

load mmc 0 ${rdaddr} /boot/ramdisk.img
           

${rdaddr}的預設值是0x88080000

最後就是将ramdisk和dtb的加載位址作為參數啟動核心:

bootz ${loadaddr} ${rdaddr} ${fdtaddr}
           

至此,Linux核心已經能夠正常啟動并進入終端模式了。

啟動Log如下:

Hit any key to stop autoboot:  0 
U-Boot# load mmc 0 ${fdtaddr} /boot/tq335x.dtb
34781 bytes read in 9 ms (3.7 MiB/s)
U-Boot# load mmc 0 ${loadaddr} /boot/zImage
4377824 bytes read in 242 ms (17.3 MiB/s)
U-Boot# load mmc 0 ${rdaddr} /boot/ramdisk.img
1120934 bytes read in 68 ms (15.7 MiB/s)
U-Boot# bootz ${loadaddr} ${rdaddr} ${fdtaddr}
Kernel image @ 0x82000000 [ 0x000000 - 0x42cce0 ]
## Loading init Ramdisk from Legacy Image at 88080000 ...
   Image Name:   ramdisk
   Created:      2014-11-18  15:47:41 UTC
   Image Type:   ARM Linux RAMDisk Image (uncompressed)
   Data Size:    1120870 Bytes = 1.1 MiB
   Load Address: 88080000
   Entry Point:  88080000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 88000000
   Booting using the fdt blob at 0x88000000
   Loading Ramdisk to 8feee000, end 8ffffa66 ... OK
   Loading Device Tree to 8fee2000, end 8feed7dc ... OK


Starting kernel ...


[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.17.2 ([email protected]) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1) ) #1 SMP Tue Nov 18 22:49:31 CST 2014
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine model: TI AM335x EVM
[    0.000000] cma: Reserved 16 MiB at 9e800000
[    0.000000] Memory policy: Data cache writeback
[    0.000000]   HighMem zone: 1048574 pages exceeds freesize 0
[    0.000000] CPU: All CPU(s) started in SVC mode.
[    0.000000] AM335X ES2.1 (sgx neon )
[    0.000000] PERCPU: Embedded 9 pages/cpu @dfa9a000 s14336 r8192 d14336 u36864
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 129792
[    0.000000] Kernel command line: console=ttyO0,115200n8 root=/dev/ram0
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Memory: 483692K/523264K available (5668K kernel code, 647K rwdata, 2208K rodata, 406K init, 8210K bss, 39572K reserved, 0K highmem)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xffe00000   (2048 kB)
[    0.000000]     vmalloc : 0xe0800000 - 0xff000000   ( 488 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xe0000000   ( 512 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .text : 0xc0008000 - 0xc07b9478   (7878 kB)
[    0.000000]       .init : 0xc07ba000 - 0xc081f800   ( 406 kB)
[    0.000000]       .data : 0xc0820000 - 0xc08c1d08   ( 648 kB)
[    0.000000]        .bss : 0xc08c1d08 - 0xc10c68e0   (8211 kB)
[    0.000000] Hierarchical RCU implementation.
[    0.000000]  RCU restricting CPUs from NR_CPUS=2 to nr_cpu_ids=1.
[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
[    0.000000] NR_IRQS:16 nr_irqs:16 16
[    0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
[    0.000000] Total of 128 interrupts on 1 active controller
[    0.000000] OMAP clockevent source: timer2 at 24000000 Hz
[    0.000013] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns
[    0.000061] OMAP clocksource: timer1 at 24000000 Hz
[    0.000795] Console: colour dummy device 80x30
[    0.000847] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
[    0.000856] ... MAX_LOCKDEP_SUBCLASSES:  8
[    0.000863] ... MAX_LOCK_DEPTH:          48
[    0.000870] ... MAX_LOCKDEP_KEYS:        8191
[    0.000878] ... CLASSHASH_SIZE:          4096
[    0.000885] ... MAX_LOCKDEP_ENTRIES:     32768
[    0.000892] ... MAX_LOCKDEP_CHAINS:      65536
[    0.000900] ... CHAINHASH_SIZE:          32768
[    0.000907]  memory used by lock dependency info: 5167 kB
[    0.000915]  per task-struct memory footprint: 1152 bytes
[    0.000956] Calibrating delay loop... 996.14 BogoMIPS (lpj=4980736)
[    0.079037] pid_max: default: 32768 minimum: 301
[    0.079438] Security Framework initialized
[    0.079564] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.079576] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.081769] CPU: Testing write buffer coherency: ok
[    0.082962] CPU0: thread -1, cpu 0, socket -1, mpidr 0
[    0.083084] Setting up static identity map for 0x8055f030 - 0x8055f0a0
[    0.086327] Brought up 1 CPUs
[    0.086347] SMP: Total of 1 processors activated.
[    0.086357] CPU: All CPU(s) started in SVC mode.
[    0.088983] devtmpfs: initialized
[    0.097743] VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 3
[    0.132789] omap_hwmod: tptc0 using broken dt data from edma
[    0.133139] omap_hwmod: tptc1 using broken dt data from edma
[    0.133467] omap_hwmod: tptc2 using broken dt data from edma
[    0.141252] omap_hwmod: debugss: _wait_target_disable failed
[    0.198964] pinctrl core: initialized pinctrl subsystem
[    0.201633] regulator-dummy: no parameters
[    0.231057] NET: Registered protocol family 16
[    0.239540] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.241725] cpuidle: using governor ladder
[    0.241754] cpuidle: using governor menu
[    0.253658] OMAP GPIO hardware version 0.1
[    0.268591] omap-gpmc 50000000.gpmc: could not find pctldev for node /[email protected]/nandflash_pins_s0, deferring probe
[    0.268635] platform 50000000.gpmc: Driver omap-gpmc requests probe deferral
[    0.273243] No ATAGs?
[    0.273274] hw-breakpoint: debug architecture 0x4 unsupported.
[    0.316650] edma-dma-engine edma-dma-engine.0: TI EDMA DMA engine driver
[    0.318001] vbat: 5000 mV 
[    0.318774] lis3_reg: no parameters
[    0.322209] SCSI subsystem initialized
[    0.323028] usbcore: registered new interface driver usbfs
[    0.323207] usbcore: registered new interface driver hub
[    0.327009] usbcore: registered new device driver usb
[    0.327877] omap_i2c 44e0b000.i2c: could not find pctldev for node /[email protected]/pinmux_i2c0_pins, deferring probe
[    0.327917] platform 44e0b000.i2c: Driver omap_i2c requests probe deferral
[    0.327972] omap_i2c 4802a000.i2c: could not find pctldev for node /[email protected]/pinmux_i2c1_pins, deferring probe
[    0.327995] platform 4802a000.i2c: Driver omap_i2c requests probe deferral
[    0.332363] Switched to clocksource timer1
[    0.477595] NET: Registered protocol family 2
[    0.479415] TCP established hash table entries: 4096 (order: 2, 16384 bytes)
[    0.479601] TCP bind hash table entries: 4096 (order: 5, 147456 bytes)
[    0.480965] TCP: Hash tables configured (established 4096 bind 4096)
[    0.481157] TCP: reno registered
[    0.481186] UDP hash table entries: 256 (order: 2, 20480 bytes)
[    0.481375] UDP-Lite hash table entries: 256 (order: 2, 20480 bytes)
[    0.482657] NET: Registered protocol family 1
[    0.484656] RPC: Registered named UNIX socket transport module.
[    0.484680] RPC: Registered udp transport module.
[    0.484690] RPC: Registered tcp transport module.
[    0.484699] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.485566] Trying to unpack rootfs image as initramfs...
[    0.487045] rootfs image is not initramfs (no cpio magic); looks like an initrd
[    0.497016] Freeing initrd memory: 1092K (cfeee000 - cffff000)
[    0.497514] hw perfevents: enabled with armv7_cortex_a8 PMU driver, 5 counters available
[    0.501968] futex hash table entries: 256 (order: 2, 16384 bytes)
[    0.507634] VFS: Disk quotas dquot_6.5.2
[    0.507781] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[    0.510254] NFS: Registering the id_resolver key type
[    0.510637] Key type id_resolver registered
[    0.510653] Key type id_legacy registered
[    0.510794] jffs2: version 2.2. (NAND) (SUMMARY)  漏 2001-2006 Red Hat, Inc.
[    0.511229] msgmni has been set to 978
[    0.516624] io scheduler noop registered
[    0.516656] io scheduler deadline registered
[    0.516726] io scheduler cfq registered (default)
[    0.519057] pinctrl-single 44e10800.pinmux: 142 pins at pa f9e10800 size 568
[    0.522800] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    0.528945] omap_uart 44e09000.serial: no wakeirq for uart0
[    0.529540] 44e09000.serial: ttyO0 at MMIO 0x44e09000 (irq = 88, base_baud = 3000000) is a OMAP UART0
[    1.236732] console [ttyO0] enabled
[    1.245368] omap_rng 48310000.rng: OMAP Random Number Generator ver. 20
[    1.277842] brd: module loaded
[    1.297230] loop: module loaded
[    1.303764] mtdoops: mtd device (mtddev=name/number) must be supplied
[    1.313662] usbcore: registered new interface driver asix
[    1.319456] usbcore: registered new interface driver ax88179_178a
[    1.326006] usbcore: registered new interface driver cdc_ether
[    1.332305] usbcore: registered new interface driver smsc95xx
[    1.338427] usbcore: registered new interface driver net1080
[    1.344489] usbcore: registered new interface driver cdc_subset
[    1.350791] usbcore: registered new interface driver zaurus
[    1.356854] usbcore: registered new interface driver cdc_ncm
[    1.364965] usbcore: registered new interface driver cdc_wdm
[    1.371056] usbcore: registered new interface driver usb-storage
[    1.377647] usbcore: registered new interface driver usbtest
[    1.388450] mousedev: PS/2 mouse device common for all mice
[    1.399599] omap_rtc 44e3e000.rtc: rtc core: registered 44e3e000.rtc as rtc0
[    1.407152] 44e3e000.rtc: already running
[    1.411995] i2c /dev entries driver
[    1.415787] Driver for 1-wire Dallas network protocol.
[    1.428670] omap_wdt: OMAP Watchdog Timer Rev 0x01: initial timeout 60 sec
[    1.438626] omap_hsmmc 48060000.mmc: unable to get vmmc regulator -517
[    1.446110] platform 48060000.mmc: Driver omap_hsmmc requests probe deferral
[    1.454198] ledtrig-cpu: registered to indicate activity on CPUs
[    1.461042] usbcore: registered new interface driver usbhid
[    1.466922] usbhid: USB HID core driver
[    1.472270] oprofile: using arm/armv7
[    1.476763] TCP: cubic registered
[    1.480243] Initializing XFRM netlink socket
[    1.484880] NET: Registered protocol family 17
[    1.489611] NET: Registered protocol family 15
[    1.494616] Key type dns_resolver registered
[    1.499266] omap_voltage_late_init: Voltage driver support not added
[    1.505960] sr_dev_init: No voltage domain specified for smartreflex0. Cannot initialize
[    1.514433] sr_dev_init: No voltage domain specified for smartreflex1. Cannot initialize
[    1.523926] ThumbEE CPU extension supported.
[    1.528444] Registering SWP/SWPB emulation handler
[    1.533522] SmartReflex Class3 initialized
[    1.547402] omap-gpmc 50000000.gpmc: GPMC revision 6.0
[    1.554563] nand: device found, Manufacturer ID: 0xec, Chip ID: 0xd3
[    1.561211] nand: Samsung NAND 1GiB 3,3V 8-bit
[    1.565966] nand: 1024MiB, SLC, page size: 2048, OOB size: 64
[    1.571968] nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled
[    1.578104] omap2-nand: probe of omap2-nand.0 failed with error -22
[    1.691744] tps65910 0-002d: No interrupt support, no core IRQ
[    1.709178] vrtc: 1800 mV 
[    1.712892] vrtc: supplied by vbat
[    1.719981] vio: at 1500 mV 
[    1.723353] vio: supplied by vbat
[    1.730169] vdd_mpu: 912 <--> 1312 mV at 1325 mV 
[    1.735377] vdd_mpu: supplied by vbat
[    1.742659] vdd_core: 912 <--> 1150 mV at 1137 mV 
[    1.747889] vdd_core: supplied by vbat
[    1.754583] vdd3: 5000 mV 
[    1.760090] vdig1: at 1800 mV 
[    1.763611] vdig1: supplied by vbat
[    1.769998] vdig2: at 1800 mV 
[    1.773480] vdig2: supplied by vbat
[    1.779839] vpll: at 1800 mV 
[    1.783256] vpll: supplied by vbat
[    1.789576] vdac: at 1800 mV 
[    1.792977] vdac: supplied by vbat
[    1.799236] vaux1: at 1800 mV 
[    1.802749] vaux1: supplied by vbat
[    1.809109] vaux2: at 3300 mV 
[    1.812606] vaux2: supplied by vbat
[    1.818973] vaux33: at 3300 mV 
[    1.822579] vaux33: supplied by vbat
[    1.829010] vmmc: 1800 <--> 3300 mV at 3300 mV 
[    1.834051] vmmc: supplied by vbat
[    1.840026] vbb: at 3000 mV 
[    1.843609] vbb: supplied by vbat
[    1.848858] omap_i2c 44e0b000.i2c: bus 0 rev0.11 at 400 kHz
[    1.862630] omap_i2c 4802a000.i2c: bus 1 rev0.11 at 100 kHz
[    1.972271] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6
[    1.978680] davinci_mdio 4a101000.mdio: detected phy mask ffffffde
[    1.988850] libphy: 4a101000.mdio: probed
[    1.993152] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver unknown
[    2.001513] davinci_mdio 4a101000.mdio: phy[5]: device 4a101000.mdio:05, driver unknown
[    2.011094] cpsw 4a100000.ethernet: Detected MACID = c4:ed:ba:88:b5:e4
[    2.022260] input: [email protected] as /devices/[email protected]/input/input0
[    2.032966] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
[    2.041988] sr_init: No PMIC hook to init smartreflex
[    2.047636] sr_init: platform driver register failed for SR
[    2.071187] lis3_reg: disabling
[    2.078305] RAMDISK: gzip image found at block 0
[    2.088654] mmc0: host does not support reading read-only switch. assuming write-enable.
[    2.114634] mmc0: new high speed SDHC card at address aaaa
[    2.124023] mmcblk0: mmc0:aaaa SL16G 14.8 GiB 
[    2.145511]  mmcblk0:
[    2.264995] VFS: Mounted root (ext2 filesystem) readonly on device 1:0.
[    2.273502] devtmpfs: mounted
[    2.277355] Freeing unused kernel memory: 404K (c07ba000 - c081f000)
----------mount all..........
----------Starting mdev......


Please press Enter to activate this console. 
@tq335x #ls
HOSTNAME    dev         lib         mnt         sbin        usr
bin         etc         linuxrc     proc        sys         var
boot        home        lost+found  root        tmp
           

(4)小結

到目前為止,已經能夠成功啟動核心了,接下來我們會在新核心的基礎上添加tq335x闆載驅動。

本文作者:girlkoo

本文連結:http://blog.csdn.net/girlkoo/article/details/41258583

本文在該文章制作好的rootfs基礎上,制作ramdisk。

繼續閱讀