Linux移植實(shí)驗(yàn)指導(dǎo)書(shū)-112_第1頁(yè)
Linux移植實(shí)驗(yàn)指導(dǎo)書(shū)-112_第2頁(yè)
Linux移植實(shí)驗(yàn)指導(dǎo)書(shū)-112_第3頁(yè)
Linux移植實(shí)驗(yàn)指導(dǎo)書(shū)-112_第4頁(yè)
Linux移植實(shí)驗(yàn)指導(dǎo)書(shū)-112_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux移植課實(shí)驗(yàn)指導(dǎo)書(shū)1 系統(tǒng)開(kāi)發(fā)環(huán)境的安裝和設(shè)置1.1 實(shí)驗(yàn)中所需要的主要軟件包實(shí)驗(yàn)中涉及到的軟件包主要有如下的一些:l arm-none-linux-gnueabi.tar.bz2:編譯uboot,核心以及busybox所需要的工具鏈。l uboot-1.1.6_akae24xx.tar.gz:針對(duì)akae2410和akae2440開(kāi)發(fā)板移植的ubootl kernel-2.6.27-android.tar.gz:支持akae2410和akae2440開(kāi)發(fā)板的Linux核心,版本為2.6.27,并且內(nèi)部也包括了google的android平臺(tái)上需要的驅(qū)動(dòng)l Linux-2.6.27.t

2、ar.gz:從Linux官方()下載的2.6.27的Linux核心,主要用于在其中加入對(duì)akae2410和akae2440開(kāi)發(fā)板的支持的實(shí)驗(yàn)l testinit.c:用于測(cè)試小系統(tǒng)的小程序l busybox-1.1.3.tar.bz2和busybox_config:busybox和其配置文件1.2 工具鏈的安裝和設(shè)置設(shè)目前的用戶名為akaedu,在home目錄下,主要的步驟為:1. 建立一個(gè)工作目錄名稱為L(zhǎng)inux-porting,并將工具鏈的壓縮包拷貝到該目錄下mkdir Linux-porting2. 將arm-none-linux-gnueabi.tar.bz

3、2解壓到該目錄下tar -jxvf arm-none-linux-gnueabi.tar.bz2 -C /home/akaedu/Linux-porting3. 設(shè)置工具鏈的路徑,將工具鏈的可執(zhí)行程序路徑加到PATH環(huán)境變量中,注意這個(gè)設(shè)置在退出終端后就沒(méi)有了,所以每次啟動(dòng)終端的時(shí)候都應(yīng)該執(zhí)行一次該命令export PATH=$PATH:/home/akaedu/Linux-porting/ arm-2008q3/bin/4. 測(cè)試工具鏈?zhǔn)欠衲苷9ぷ鳎绻磺姓#瑧?yīng)該能顯示該工具鏈的相關(guān)信息arm-none-linux-gnueabi-gcc -v1.3 TFTP和 NFS的配置1.3.1

4、 TFTP的配置1. 首先需要安裝tftpd的相關(guān)軟件包$ sudo apt-get install xinetd tftpd tftp2. 設(shè)置xinetd的tftp服務(wù),具體為在/etc/xinetd.d/目錄下創(chuàng)建一個(gè)tftp文件,并將如下的內(nèi)容拷貝到該文件中service tftpprotocol = udpport = 69socket_type = dgramwait = yesuser = nobodyserver = /usr/sbin/in.tftpdserver_args = /tftpbootdisable = no這里的server_args 后面的參數(shù)tftpboot

5、為tftp的存取目錄3. 創(chuàng)建tftp文件的存取目錄tftpboot,并修改其目錄的權(quán)限$ sudo mkdir /tftpboot$ sudo chmod -R 777 /tftpboot$ sudo chown -R nobody /tftpboot4. 重啟xinetd服務(wù)$ sudo /etc/init.d/xinetd restart$ sudo ifconfig eth0 1 upxinetd 網(wǎng)絡(luò)服務(wù)集1.3.2 NFS的配置1. 首先需要安裝nfs服務(wù)的相關(guān)軟件包sudo apt-get install nfs-kernel-server2. 創(chuàng)建nfs的

6、存取目錄rootfs,并修改其目錄的權(quán)限$ sudo mkdir /rootfs$ sudo chmod -R 777 /rootfs$ sudo chown -R nobody /rootfs3. 配置要輸出的目錄,可以在 /etc/exports 文件中添加該目錄/rootfs *(rw,no_root_squash,subtree_check,async)4. 重新啟動(dòng)nfs服務(wù)sudo /etc/init.d/nfs-kernel-server restart1.4 putty工具的安裝和配置putty是個(gè)簡(jiǎn)單實(shí)用的終端工具,使用上也比minicom要方便一點(diǎn)首先需要安裝該工具sudo

7、 apt-get install putty然后啟動(dòng)putty并進(jìn)行相關(guān)的配置putty &注意connection type設(shè)置為serial,speed設(shè)置為115200,為該連接作一個(gè)命名,這里是akaedu-target,點(diǎn)擊save進(jìn)行保存。用串口線將host和開(kāi)發(fā)板連接,點(diǎn)擊putty上的open,同時(shí)啟動(dòng)開(kāi)發(fā)板,這個(gè)時(shí)候應(yīng)該能進(jìn)入vivi或u-boot的命令界面。見(jiàn)下圖所示 圖11 putty的配置2 u-boot試驗(yàn)2.1 實(shí)驗(yàn)2-1:編譯u-boot這里生成的u-boot可以有兩個(gè)不同的版本,一個(gè)是可以直接燒到開(kāi)發(fā)板的NandFlash中并啟動(dòng)的版本,另外一個(gè)可以通過(guò)

8、tftp加載到內(nèi)存中運(yùn)行的版本,主要用于u-boot的調(diào)試1. 首先解壓uboot,之前應(yīng)確認(rèn)系統(tǒng)已經(jīng)正常的安裝了arm的工具鏈tar -zxvf uboot-1.1.6_akae24xx.tar.gzmake distclean不然出錯(cuò) 先要distclean2. 進(jìn)入uboot目錄對(duì)于2440開(kāi)發(fā)板,輸入make akae2440_config對(duì)于2410開(kāi)發(fā)板,輸入make akae2410_config3. 編譯可運(yùn)行于NandFlash上的uboot首先確認(rèn)includeconfigs目錄下的akae2410.h或akae2440.h中的代碼#if 0/* If we want to

9、 start u-boot from usb bootloader in NOR flash */#define CONFIG_SKIP_RELOCATE_UBOOT1#defineCONFIG_SKIP_LOWLEVEL_INIT1#else/* If we want to start u-boot directly from within NAND flash */#define CONFIG_S3C2410_NAND_BOOT1#define CONFIG_S3C2410_NAND_SKIP_BAD1#endif如果#if為1,則以調(diào)試方式對(duì)uboot進(jìn)行調(diào)試,否則代表可以將uboot燒

10、到flash上啟動(dòng),這里需要確認(rèn)#if為0。這里的定義主要用于控制在cpu/arm920t/start.S中的代碼在啟動(dòng)的時(shí)候是否從NANDflash上讀取u-boot代碼到內(nèi)存中執(zhí)行。保存文件退出后,在命令行上輸入make進(jìn)行編譯$ make編譯完成后,在目錄下應(yīng)該能生成一個(gè)u-boot.bin,將該文件拷貝到tftp的導(dǎo)出目錄中并重命名 $ sudo mv u-boot.bin /tftpboot/u-boot-nand.bin4. 編譯可以運(yùn)行在內(nèi)存中可以進(jìn)行調(diào)試的u-boot首先確認(rèn)include/configs目錄下的akae2410.h或akae2440.h中的代碼#if 1/*

11、If we want to start u-boot from usb bootloader in NOR flash */#define CONFIG_SKIP_RELOCATE_UBOOT1#defineCONFIG_SKIP_LOWLEVEL_INIT1#else/* If we want to start u-boot directly from within NAND flash */#define CONFIG_S3C2410_NAND_BOOT1#define CONFIG_S3C2410_NAND_SKIP_BAD1#endif保存文件退出后,在命令行上輸入make進(jìn)行編譯將#

12、if設(shè)置為1,保存后退出,然后在命令行輸入$ make clean$ make TEXT_BASE=0x33000000編譯完成后在目錄下同樣會(huì)生成一個(gè)u-boot.bin的文件,將該文件拷貝到tftp的導(dǎo)出目錄中并重命名 $ sudo mv u-boot.bin /tftpboot/u-boot-ram.binJflash t= flash類(lèi)型 d=延時(shí)2.2 實(shí)驗(yàn)2-2:調(diào)試并燒寫(xiě)u-boot2.2.1 將調(diào)試版本的u-boot加載到內(nèi)存中運(yùn)行如果開(kāi)發(fā)板上裝有vivi的情況下可以利用vivi的load和go命令來(lái)進(jìn)行,這里介紹的是利用u-boot的功能來(lái)加載u-boot的方法。首先應(yīng)該確認(rèn)

13、主機(jī)上的tftp的配置已經(jīng)完成,具體的配置可以參考1.3.1節(jié)的介紹。具體的步驟如下:1. 對(duì)uboot的ip進(jìn)行配置,這里設(shè)主機(jī)的ip為1(sudo ifconfig eth0 1),分配給開(kāi)發(fā)板的ip為2 ,則應(yīng)該在u-boot的命令行上輸入setenv ipaddr 2setenv netmask setenv serverip 1saveenv可以利用printenv來(lái)查看所設(shè)置的env是否正確,整個(gè)過(guò)程如下圖所示圖21 u-boot的env設(shè)置2.

14、確定主機(jī)和開(kāi)發(fā)板之間的網(wǎng)線連接正確,這可以利用u-boot中的ping命令進(jìn)行驗(yàn)證 ping 13. 確定之前的u-boot-ram.bin拷貝到tftp的導(dǎo)出目錄tftpboot中sudo cp u-boot-ram.bin /tftpboot4. 利用tftp命令將u-boot-ram.bin加載到0x33000000上tftpboot 0x33000000 u-boot-ram.bin5. 利用go命令跳轉(zhuǎn)到加載的u-boot上執(zhí)行g(shù)o 0x33000000整個(gè)過(guò)程如下圖所示圖22 tftp加載u-boot的過(guò)程2.2.2 將uboot燒到開(kāi)發(fā)板的Nandflash

15、中這里介紹通過(guò)u-boot的命令將u-boot燒寫(xiě)到NandFlash上的方法1. 首先通過(guò)tftp將u-boot的nand版本加載到內(nèi)存,這里設(shè)為0x32000000tftpboot 0x32000000 u-boot-nand.bin2. 在寫(xiě)入NandFlash前應(yīng)先將Flash地址0x0上的內(nèi)容擦除nand erase 0x0 0x500003. 將內(nèi)存中的u-boot-nand.bin寫(xiě)到Flash中nand write 0x32000000 0x0 0x500004. 輸入reset重啟開(kāi)發(fā)板reset整個(gè)過(guò)程如下圖所示圖23 u-boot的燒入過(guò)程 2.3 實(shí)驗(yàn)2-3:利用實(shí)現(xiàn)的

16、myboot命令啟動(dòng)Linux核心 1. 按照實(shí)驗(yàn)3-1的描述編譯并生成一個(gè)Linux核心,并將生成的核心zImage放到tftp的配置目錄/rootfs中sudo cp zImage /tftpboot2. 利用tftpboot命令將zImage通過(guò)網(wǎng)絡(luò)加載到內(nèi)存0x30008000tftpboot 0x30008000 zImage3. 利用myboot命令將引導(dǎo)核心myboot 0x30008000出現(xiàn)Uncompressing Linux. done, booting the kernel. 錯(cuò)誤解決方法:MACHINE_START(AKAE2440, "AKAE2440&q

17、uot;)/此處標(biāo)識(shí)修改整個(gè)過(guò)程見(jiàn)下圖所示圖24 利用myboot命令引導(dǎo)核心文字 1: 圖15 利用myboot命令引導(dǎo)核心3 Linux核心移植試驗(yàn)3.1 實(shí)驗(yàn)3-1:編譯和配置Linux核心(24xx平臺(tái))1. 首先解壓核心的壓縮包kernel-2.6.27-android.tar.gz,編譯的時(shí)候應(yīng)確認(rèn)系統(tǒng)已經(jīng)正常的安裝了arm的工具鏈tar -zxvf kernel-2.6.27-android.tar.gzcd kernel-2.6.27-android2. 導(dǎo)出核心編譯的時(shí)候需要的兩個(gè)環(huán)境變量ARCH和CROSS_COMPILE注意這個(gè)設(shè)置在退出終端后就沒(méi)有了,所以每次啟動(dòng)終端的

18、時(shí)候都應(yīng)該執(zhí)行一次該命令export ARCH=arm /ARCH體系結(jié)構(gòu)export CROSS_COMPILE=arm-linux- 交叉編譯器注意:arm 和arm-linux- 后面不能有空格3. 如果不愿意每次都輸入,可以直接修改核心的根目錄下的Makefile,將第197行這兩個(gè)環(huán)境變量修改為ARCH = armCROSS_COMPILE = arm-linux-4. 在核心的目錄下輸入make menuconfig進(jìn)行配置找到arch/arm/configs 目錄下的Mini2440-deconfig 或者 smdk2440-deconfig 為模板進(jìn)行裁剪。cp arch/ar

19、m/configs/mini2440-deconfig .configmake menuconfig必須打開(kāi) Kernel Features -> EABI (這個(gè)選項(xiàng)可以根據(jù)GCC版本決定,如果選用的GCC版本不支持EABI,則不用選)。進(jìn)入menuconfig后要先在systemtype->arm systemtype->samsung.配置的時(shí)候應(yīng)該要選中akae2410和akaed2440,如果一切正常的話選擇應(yīng)該是在System type-> S3C2410 Machines或System type-> S3C2440 Machines這兩個(gè)選擇項(xiàng)中,可

20、以參考下圖的選擇,這里是AKAE2410 或者AKAE2440圖31 akae2410的選擇核心的配置過(guò)程中,其它選項(xiàng)要求1. ext2文件系統(tǒng)支持2. nfs文件系統(tǒng)的支持3. ramdisk支持4. initrd支持5. ext2文件系統(tǒng)的支持在Filesystems選項(xiàng)中,如下圖所示圖32 ext2文件系統(tǒng)的支持NFS文件系統(tǒng)的支持也在File systems選項(xiàng)中,它的選項(xiàng)要更深一級(jí),請(qǐng)注意一定要選中”Root file system on NFS”這一項(xiàng),并且要先選中Networking support->Networking options->IP:kernel lev

21、erl autoconfiguration,否則沒(méi)有Root file system on NFS 選項(xiàng)。如下圖所示圖33 NFS文件系統(tǒng)的支持initrd的支持在General setup選項(xiàng)中,如下圖所示圖34 initrd的支持ramdisk的支持在 Device Drivers->Block devices選項(xiàng)中,如下圖所示圖35 ramdisk的支持目錄arch/arm/configs/下有一個(gè)akae24xx_config是一個(gè)參考配置,可以直接拷貝到核心根目錄下使用配置的是哪一個(gè)就需要拷貝哪一個(gè)mini2440/cp arch/arm/configs/akae24xx_co

22、nfig ./.config5.6. 輸入make編譯核心make輸入make V=1可以查看編譯核心的時(shí)候使用的編譯選項(xiàng)等,對(duì)解決核心的編譯問(wèn)題有一定的幫助。 出現(xiàn)error: 'PCIMEM_BASE' undeclared (first use in this function) 此類(lèi)錯(cuò)誤drivers/video/console/vgacon.c:292: error: PCIMEM_BASE ' undeclared (first use in this function) 解決方法:device drivers->Graphics support-&g

23、t;Console display driver support-> VGA text console /由于電腦顯卡需要PCI總線,所以要取消出現(xiàn)錯(cuò)誤ERROR: "ioport_map" drivers/net/wireless/orinoco/spectrum_cs.ko undefined!解決方案:首先把wirless中大多數(shù)選項(xiàng)取消,如果出現(xiàn)如下錯(cuò)誤ERROR: "ioport_map" drivers/char/tpm/tpm_atmel.ko undefined!在device drivers->character devic

24、es->取消 TPM hardware3.2 實(shí)驗(yàn)3-2:在官方的Linux核心上加入對(duì)akae24xx的支持3.2.1 akae2410平臺(tái)1. 首先在/arch/arm/mach-s2c2410目錄下編寫(xiě)mach-akae2410.c,具體的模式可以參考kernel-2.6.27-android下的代碼,請(qǐng)按課程中講解的內(nèi)容務(wù)必領(lǐng)會(huì)其中各個(gè)代碼的具體含義參考mini2440.c 或者smdk2440.c 復(fù)制兩個(gè)文件中的一個(gè),改為自己需要的文件mach-akae2410.c做如下修改2. 修改時(shí)鐘頻率:static void _init smdk2440_map_io(void) s

25、3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc); s3c24xx_init_clocks(12000000); s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs);其中smdk2440 這些名字可以不用改,但要保持函數(shù)里的命名 一致MACHINE_START(AKAE2440, "AKAE2440")/此處標(biāo)識(shí)修改 /* Maintainer: Ben Dooks <> */ .phy

26、s_io = S3C2410_PA_UART, .io_pg_offst = (u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .init_irq = s3c24xx_init_irq, .map_io = smdk2440_map_io, .init_machine = smdk2440_machine_init, .timer = &s3c24xx_timer,MACHINE_END 3. 修改Kconfig和Makefile,在Kconfig中加入co

27、nfig MACH_AKAE2410bool "AKAE2410"select CPU_S3C2410select S3C_DEV_USB_HOSTselect S3C_DEV_NANDhelp Say Y here if you are using the akaedu 2410 board在Makefile中加入obj-$(CONFIG_MACH_AKAE2410)+= mach-akae2410.o可以參考kernel-2.6.27-android目錄下的相關(guān)文件4. 在/arch/arm/tools的mach-types文件中的最后一行加入對(duì)AKAE2410的支持a

28、kae2410MACH_AKAE2410AKAE24101874 (此值由bootloader寫(xiě)定)5. 按照實(shí)驗(yàn)3-1的說(shuō)明對(duì)核心進(jìn)行配置,如果正常的話,在核心的菜單中應(yīng)該能看到實(shí)驗(yàn)3-1的圖中的選項(xiàng),選中aka2410。核心的配置同樣要保證對(duì)ext2文件系統(tǒng),ramdisk和initrd的支持3.2.2 akae2440平臺(tái)基本的過(guò)程和akae2410平臺(tái)的一致,修改和添加的文件應(yīng)該在/arch/arm/mach-s2c2440目錄下進(jìn)行,在/arch/arm/tools的mach-types文件中的最后一行加入對(duì)AKAE2440的支持為:akae2440MACH_AKAE2440AKAE

29、24401875 (此值由bootloader寫(xiě)定)1 添加nand flash 分區(qū)信息 (和u-boot分區(qū)信息保持一致)static struct mtd_partition akae2440_default_nand_part _initdata = 0 = .name= "u-boot",.size= 0x00100000,.offset= 0x00000000,1 = .name= "kernel",.size= 0x00200000,.offset= 0x00100000,2 = .name= "ext2",.size=

30、 0x01000000,.offset= 0x00300000,3 = .name= "temp",.offset= 0x01300000,.size= 0x02d00000,;static struct s3c2410_nand_set akae2440_nand_sets _initdata = 0 = .name= "nand",.nr_chips= 1,.nr_partitions= ARRAY_SIZE(akae2440_default_nand_part),.partitions= akae2440_default_nand_part,.fl

31、ash_bbt = 1, /* we use u-boot to create a BBT */,;static struct s3c2410_platform_nand akae2440_nand_info _initdata = .tacls= 0,.twrph0= 25,.twrph1= 15,.nr_sets= ARRAY_SIZE(akae2440_nand_sets),.sets= akae2440_nand_sets,.ignore_unset_ecc = 1,;在static void _init akae2440_machine_init(void)中添加s3c_nand_s

32、et_platdata(&akae2440_nand_info);在static struct platform_device *akae2440_devices _initdata中添加&s3c_device_nand,3.2.3 編譯核心可以按照實(shí)驗(yàn)3-1的說(shuō)明對(duì)核心進(jìn)行編譯,編譯后生成的zImage同樣也放到tftp的導(dǎo)出目錄tftpboot下,然后利用燒寫(xiě)在板子上的u-boot按照實(shí)驗(yàn)2-3介紹的方法對(duì)這個(gè)核心進(jìn)行引導(dǎo)和測(cè)試。3.3 實(shí)驗(yàn)3-3:生成ext2文件系統(tǒng)1. 首先利用dd命令產(chǎn)生一個(gè)image文件,注意大小不要超過(guò)6Msudo dd if=/dev/zero

33、 of=ext2fs.img bs=1k count=6144 messagedd 是 Linux/UNIX 下的一個(gè)非常有用的命令,作用是用指定大小的塊拷貝一個(gè)文件,并在拷貝的同時(shí)進(jìn)行指定的轉(zhuǎn)換。2. 然后將該image和環(huán)回設(shè)備連接在一起sudo losetup /dev/loop0 ext2fs.imglosetup用來(lái)將loop device與檔案或block device聯(lián)結(jié)、分離.以及查詢loop device目前的狀況3. 利用mke2fs對(duì)該image進(jìn)行格式化 sudo mke2fs -m 0 /dev/loop0mke2fs建立ext2文件系統(tǒng)4. 新建一個(gè)目錄,并將該目錄

34、掛載到和image連接的環(huán)回設(shè)備上mkdir temp操作temp都是在讀寫(xiě)ext2fs.imgsudo mount /dev/loop0 temp/5. 編寫(xiě)想要核心運(yùn)行的第一個(gè)程序程序?yàn)?include <stdio.h>int main(int argc, char * argv) int count = 0; while(1)printf("hello, my frist program, count=%dn", count+);sleep(1);6. 以靜態(tài)方式編譯該程序arm-none-linux-gnueabi-gcc -march=armv4t

35、-mtune=arm9tdmi -msoft-float -static -o testinit testmain.c /static靜態(tài)鏈接或者arm-none-linux-gnueabi-gcc -march=armv4t -mtune=arm9tdmi -static -o testinit testmain.c /static靜態(tài)鏈接7. 將編譯好的文件放在該temp目錄中,這里也就是這個(gè)testinitsudo cp testinit temp/8. 在temp目錄中創(chuàng)建目錄dev,并創(chuàng)建必要的設(shè)備文件sudo mkdir dev建立了DEV目錄后,把如下東西放到DEV目錄下sudo

36、 mknod console c 5 1sudo mknod ttySAC0 c 204 64sudo mknod ttySAC1 c 204 65sudo mknod ttyS0 c 4 64sudo mknod ttyS1 c 4 65sudo mknod tty1 c 4 1 sudo mknod mtdblock0 b 31 0 sudo mknod mtdblock1 b 31 1 sudo mknod mtdblock2 b 31 2 sudo mknod mtdblock3 b 31 3在此寫(xiě)一個(gè)shell 通過(guò) sh 來(lái)執(zhí)行在temp文件中的操作其實(shí)就是在ext2fs.img9

37、. umount該temp目錄,并解除和image之間的環(huán)回連接sudo umount temp/sudo losetup -d /dev/loop0這個(gè)時(shí)候就得到了一個(gè)最小的文件系統(tǒng),該文件系統(tǒng)中唯一的程序就是前面編寫(xiě)好的testinit程序,后面的實(shí)驗(yàn)中將讓核心在初始化的時(shí)候執(zhí)行的第一個(gè)程序就是它。在uboot中設(shè)置環(huán)境變量setenv init /testinit /加載的程序saveenv3.4 實(shí)驗(yàn)3-4:利用ramdisk實(shí)現(xiàn)該文件系統(tǒng)的掛載1. 在uboot中添加三個(gè)環(huán)境變量bootmode,init和rdsize,并分別將其設(shè)置為ramdisk,testinit和0x80000

38、0setenv bootmode ramdisk /用內(nèi)存模擬磁盤(pán)(文件系統(tǒng))setenv init /testinit /加載的程序setenv rdsize 0x800000 /加載大小setenv bootargs root=/dev/ram0 rw console=ttySAC0,115200 /設(shè)置根文件系統(tǒng)為ramdisksaveenv2. 將前面實(shí)驗(yàn)中得到的ext2fs.img拷貝到tftp的導(dǎo)出目錄tftpboot下sudo cp ext2fs.img /tftpboot3. 利用tftpboot命令將核心和ext2fs.img加載到內(nèi)存的0x30008000和0x308000

39、00這兩個(gè)地方tftpboot 0x30008000 zImagetftpboot 0x30800000 ext2fs.img4. 利用myboot程序引導(dǎo)核心, 這個(gè)時(shí)候應(yīng)該可以看到系統(tǒng)的第一個(gè)進(jìn)程,也就是testinit打印的字符myboot 0x30008000文件系統(tǒng)找不到是uboot傳遞參數(shù)不對(duì) 在arch/arm/plat-s3c24xx下面的common-smdk.c作mtd_partition的修改文件系統(tǒng)必須用整個(gè)過(guò)程如下圖所示圖36 ramdisk文件系統(tǒng)加載3.5 實(shí)驗(yàn)3-5:編譯和制作busybox小系統(tǒng) 1. 將前面的ext2fs.img重新mount到temp目錄上

40、sudo mount -o loop ext2fs.img temp/2. 將busybox解壓tar jxvf busybox-1.1.3.tar.bz23. 將busybox_config拷貝到解開(kāi)的目錄中并命名為.configcp busybox_config busybox-1.1.3/.config4. 對(duì)busybox進(jìn)行配置cd busybox-1.1.3make menuconfig配置的時(shí)候有如下的幾個(gè)要點(diǎn):/home/akaedu/linux-porting/arm-2010q1/binl 注意將安裝目錄設(shè)置為temp目錄,必須是絕對(duì)路徑,這個(gè)設(shè)置Busybox Setti

41、ngs-> Installation Options中l(wèi) Busybox Settings-> Build Options 中的設(shè)置為Build BusyBox as a static binary選上Cross Compiler prefix應(yīng)該設(shè)置為arm-none-linux-gnueabi-Any extra CFLAGS options for the compiler設(shè)置為-march=armv4t -mtune=arm9tdmi -msoft-float如下圖所示圖37 busybox的設(shè)置可以參考busybox_config中的配置5. 完成后進(jìn)行對(duì)busybox進(jìn)

42、行安裝,完成后在temp目錄下應(yīng)該可以看到幾個(gè)目錄和相應(yīng)的程序make defconfig/默認(rèn)設(shè)置sudo make install (或者sudo PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin make install)6. 完成后將temp目錄進(jìn)行umountsudo umount temp3.6 實(shí)驗(yàn)3-6:引導(dǎo)busybox小系統(tǒng)1. 前面實(shí)驗(yàn)中得到的ext2fs.img拷貝到tftp的導(dǎo)出目錄tftpboot下sudo cp ext2fs.img /tftpboot2. 修改先前設(shè)置的uboot參數(shù)init將其修改為/bin/sh

43、setenv init /bin/shsaveenv3. 利用tftpboot命令將核心和ext2fs.img加載到內(nèi)存的0x30008000和0x30800000這兩個(gè)地方tftpboot 0x30008000 zImagetftpboot 0x30800000 ext2fs.img4. 利用myboot加載Linux核心,加載成功后可以看到系統(tǒng)的標(biāo)準(zhǔn)shell界面3.7 實(shí)驗(yàn)3-7:在核心中添加網(wǎng)絡(luò)的功能,實(shí)現(xiàn)nfs方式的掛載核心中的代碼已經(jīng)有對(duì)cs8900芯片的支持,只需要對(duì)driver/net目錄下的cs89x0.c代碼作一定的修改就可以支持我們的開(kāi)發(fā)板。可以使用diff命令將kern

44、el-2.6.27-android.tar.gz和標(biāo)準(zhǔn)核心Linux-2.6.27.tar.gz中的cs89x0.c作一個(gè)對(duì)比,可以查看該文件的差異。理解這些差異,并將這些修改添加到標(biāo)準(zhǔn)核心Linux-2.6.27.tar.gz中并編譯。查看掛載是否成功用 :sudo mount -t nfs 1:/rootfs /home/akaedu/tntdrive/net 目錄下修改cs89x0.c1. 在開(kāi)始定義的時(shí)候,添加對(duì)板子網(wǎng)卡的支持#elif defined(CONFIG_MACH_AKAE2440)#include<asm/irq.h>static uns

45、igned int netcard_portlist _initdata= 0xe0000300, 0;static unsigned int cs8900_irq_map = IRQ_EINT9, 0, 0, 0;2.設(shè)置MAC地址在init cs89x0_probe1 中添加dev->dev_addr0 = 0x00;dev->dev_addr1 = 0x00;dev->dev_addr2 = 0xc0;dev->dev_addr3 = 0xff;dev->dev_addr4 = 0xee;dev->dev_addr5 = 0x08;set_mac_ad

46、dress(dev,dev->dev_addr);3. 在net_open 中找到#ifndef CONFIG_CS89x0_NONISA_IRQ 注釋掉改為#if !defined(CONFIG_MACH_AKAE2440)在接下來(lái)的位置 添加#ifdef CONFIG_MACH_AKAE2440set_irq_type(dev->irq,IRQ_TYPE_EDGE_RISING);#endif 并且在頭文件的位置 添加 #include<linux/irq.h>4. 在mach-akae2440.c文件中 在static struct map_desc akae24

47、40_iodesc _initdata里添加 /* cs8900 IO Space map */ .virtual = 0xe0000000,.pfn = _phys_to_pfn(S3C2410_CS3+0x01000000), .length = SZ_1M,.type = MT_DEVICE 5.如果make menuconfig 選項(xiàng)中沒(méi)有CS89x0選項(xiàng) ,修改drivers/net/Kconfig 文件找到config CS89x0 注釋掉下面的depends 一行文字。或者復(fù)制config CS89x0那段而后修改config CS89x0 (此處若要改為別的名字,則要改很多地方

48、)tristate "MY_CS89x0 support"depends on NET_ETHERNET | (ISA | EISA | MACH_IXDP2351 | ARCH_IXDP2X01 | ARCH_PNX010X | MACH_AKA2440)6.make menuconfig 在device Drivers->Network device support->Ethernet(10 or 100 Mbit)選上MY_CS89x0完成后可以通過(guò)nfs方式對(duì)Linux小系統(tǒng)進(jìn)行掛載,主要的過(guò)程如下:1. 參考1.3.2節(jié)中的方法對(duì)NFS進(jìn)行配置2. 按

49、照實(shí)驗(yàn)3-5的方法對(duì)busybox進(jìn)行編譯和配置,只是注意在設(shè)置安裝路徑的時(shí)候應(yīng)該設(shè)置成NFS的導(dǎo)出目錄/rootfs3. 按照實(shí)驗(yàn)3-5的方法對(duì)busybox進(jìn)行安裝sudo make install 在rootsf目錄下要建立/dev文件mknod console c 5 14. 啟動(dòng)開(kāi)發(fā)板,設(shè)置如下的一些環(huán)境變量setenv bootmode nfssetenv gateway 1setenv nfsroot /rootfs/nfsroot 是NFS是在那里/root 是文件系統(tǒng)的根 從何處開(kāi)始/root = /dev/nfs /這只是一個(gè)標(biāo)識(shí)不是實(shí)際存在savee

50、nv5. 利用tftpboot命令將核心加載到內(nèi)存的0x30008000處,并使用myboot引導(dǎo)核心tftpboot 0x30008000 zImagemyboot 0x300080003.8 實(shí)驗(yàn)3-8:將核心燒寫(xiě)到Flash中,實(shí)現(xiàn)系統(tǒng)自啟動(dòng)1. 重新編譯一個(gè)nand版本的u-boot,注意CONFIG_BOOTCOMMAND的設(shè)置為:#define CONFIG_BOOTCOMMAND "nand read 0x30008000 kernel 0x00200000; myboot 0x30008000"這是在u-boot啟動(dòng)的時(shí)候自動(dòng)會(huì)執(zhí)行的命令序列,以分號(hào)隔開(kāi)。這

51、里也就是將核心從kernel分區(qū)中讀出后通過(guò)myboot命令進(jìn)行引導(dǎo)2. 將生成的u-boot按照實(shí)驗(yàn)2-2的方法燒到開(kāi)發(fā)板上并重新啟動(dòng)開(kāi)發(fā)板3. 輸入mtdparts default設(shè)置默認(rèn)的分區(qū),并保存環(huán)境變量mtdparts default這個(gè)時(shí)候輸入printenv應(yīng)該能看見(jiàn)默認(rèn)的分區(qū)saveenv4. 將該核心通過(guò)tftpboot命令加載到內(nèi)存的0x32000000的位置tftpboot 0x32000000 zImage5. 將加載的核心燒到開(kāi)發(fā)板的分區(qū)kernel上nand erase kernel 0x200000 /flash必須先擦后寫(xiě)nand write 0x320000

52、00 kernel 0x2000006. 重新啟動(dòng)開(kāi)發(fā)板,等待5秒后系統(tǒng)就能自動(dòng)啟動(dòng)起來(lái)3.9 實(shí)驗(yàn)3-9: 制作一個(gè)通過(guò)init進(jìn)程啟動(dòng)的小系統(tǒng)1. 在rootfs目錄下建立一個(gè)目錄名為etc,并在該目錄下創(chuàng)建目錄init.dmkdir /rootfs/etcmkdir /rootfs/etc/init.d2. 在目錄etc下創(chuàng)建文件inittab,內(nèi)容為::sysinit:/etc/init.d/rcSttySAC0:respawn:-/bin/shtty1:respawn:-/bin/shtty2:askfirst:-/bin/sh:ctrlaltdel:/bin/umount -a -

53、r3. 在目錄init.d下創(chuàng)建文件rcS,這是一個(gè)shell腳本,內(nèi)容為:#! /bin/sh# Set the pathPATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH# Set the hostname.hostname -F /etc/HOSTNAME# mount proc and devpts filesystem/bin/mount -amount -t tmpfs mdev /devmdev -s#mount -o remount,rw /dev/root /#mount -n / -o rw,remountmount -t proc

54、/proc /procmount -t ramfs none /tmp#mount /dev/ptsif ! -f /etc/HOSTNAME ; then echo $HOSTNAME > /etc/HOSTNAMEfi4. 起動(dòng)開(kāi)發(fā)板,設(shè)置環(huán)境變量init為/bin/init5. 設(shè)置環(huán)境變量bootmode為nfssetenv bootmode nfssetenv init /bin/init6. 通過(guò)tftpboot加載核心,利用myboot引導(dǎo)該核心并掛載nfs文件系統(tǒng)tftpboot 0x30008000 zImagemyboot 0x300080007. 可以利用實(shí)驗(yàn)3-8的方法將修改燒到flash上,完成系統(tǒng)的自啟動(dòng)sudo ln -s busybox init /必須鏈接下面是編譯內(nèi)核驅(qū)動(dòng)要用到的:可以先不管 #!不是注釋 mount -a mount -t proc /proc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論