系統(tǒng)移植實(shí)驗(yàn)手冊(cè)_第1頁(yè)
系統(tǒng)移植實(shí)驗(yàn)手冊(cè)_第2頁(yè)
系統(tǒng)移植實(shí)驗(yàn)手冊(cè)_第3頁(yè)
系統(tǒng)移植實(shí)驗(yàn)手冊(cè)_第4頁(yè)
系統(tǒng)移植實(shí)驗(yàn)手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩73頁(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)介

嵌入式學(xué)院實(shí)驗(yàn)手冊(cè)系統(tǒng)移植部分嵌入式學(xué)院教材開(kāi)發(fā)部編著(內(nèi)部資料,請(qǐng)勿外傳)嵌入式學(xué)院(2011)版權(quán)所有V3.0目錄TOC目錄 2實(shí)驗(yàn)一交叉工具鏈的安裝 3實(shí)驗(yàn)二u-boot的燒寫及使用 5實(shí)驗(yàn)三u-boot-2011.09的移植 10實(shí)驗(yàn)四內(nèi)核的配置和編譯 23實(shí)驗(yàn)五網(wǎng)卡驅(qū)動(dòng)的移植 25實(shí)驗(yàn)六LED驅(qū)動(dòng)的移植 28實(shí)驗(yàn)七Nandflash驅(qū)動(dòng)的移植 31實(shí)驗(yàn)八LCD驅(qū)動(dòng)的移植 35實(shí)驗(yàn)九USB驅(qū)動(dòng)的移植 36實(shí)驗(yàn)十SD卡驅(qū)動(dòng)的移植 40實(shí)驗(yàn)十一yaffs2文件系統(tǒng)的移植 42實(shí)驗(yàn)十二內(nèi)核調(diào)試 44實(shí)驗(yàn)十三內(nèi)存調(diào)試 46實(shí)驗(yàn)十四文件系統(tǒng)的移植 49實(shí)驗(yàn)十五UDEV的移植 55華清遠(yuǎn)見(jiàn)--嵌入式學(xué)院第二期課程實(shí)驗(yàn)手冊(cè)v2.0PAGE66實(shí)驗(yàn)一交叉工具鏈的安裝【實(shí)驗(yàn)?zāi)康摹?了解交叉工具鏈的編譯過(guò)程及其使用。 說(shuō)明:在實(shí)驗(yàn)中命令行提示符為“$”表示在主機(jī)上運(yùn)行,“#”表示在目標(biāo)板上運(yùn)行【實(shí)驗(yàn)環(huán)境】ubuntu10.10發(fā)行版FS_S5PC100平臺(tái)【實(shí)驗(yàn)步驟】 1、如果要自己編譯工具鏈,從以下鏈接下載源碼 crosstools-ng下載地址/download/crosstool-ng/ 同時(shí)對(duì)每一個(gè)版本都有相應(yīng)的補(bǔ)丁我們盡量把這些補(bǔ)丁打上,這些補(bǔ)丁的下載地址是/download/crosstool-ng/01-fixes/2、工具的安裝在使用之前先安裝下列軟件$sudoapt-getinstallgawkautotools-devautomaketexinfolibtoolcvspatchbisonflexlibncurses5-dev為了節(jié)約時(shí)間,我們已下載了相關(guān)的安裝包,大家可以在本地安裝$sudodpkg-itools/*.deb解壓工具鏈壓縮包$cd~$tarxvfarm-none-linux-gnueabi.tar.bz2$mvarm-2010.09toolchain環(huán)境變量的添加修改文件/etc/bash.bashrc添加如下內(nèi)容exportPATH=$PATH:/home/linux/toolchain/bin重啟配置文件$source/etc/bash.bashrc工具鏈的測(cè)試$arm-none-linux-gnueabi-gcc–vUsingbuilt-inspecs.Target:arm-none-linux-gnueabiConfiguredwith:/home/linux/src/gcc-4.5.1/configure--build=i686-build_pc-linux-gnu--host=i686-build_pc-linux-gnu--target=arm-none-linux-gnueabi--prefix=/home/linux/toolchain--with-sysroot=/home/linux/toolchain/arm-none-linux-gnueabi//sys-root--enable-languages=c,c++,fortran--disable-multilib--with-arch=armv5te--with-float=soft--with-pkgversion=crosstool-NG-1.8.1-none--disable-sjlj-exceptions--enable-__cxa_atexit--disable-libmudflap--with-gmp=/home/linux/toolchain/toolchain-build/targets/arm-none-linux-gnueabi/build/static--with-mpfr=/home/linux/toolchain/toolchain-build/targets/arm-none-linux-gnueabi/build/static--enable-threads=posix--enable-target-optspace--with-local-prefix=/home/linux/toolchain/arm-none-linux-gnueabi//sys-root--disable-nls--enable-symvers=gnu--enable-c99--enable-long-longThreadmodel:posixgccversion4.5.1(SourceryG++Lite)這個(gè)時(shí)候我們的交叉工具鏈就安裝好了實(shí)驗(yàn)二u-boot的燒寫及使用【實(shí)驗(yàn)?zāi)康摹?了解u-boot-2011.09的代碼結(jié)構(gòu)及移植方法。【實(shí)驗(yàn)環(huán)境】ubuntu10.10發(fā)行版u-boot-2011.09FS_S5PC100平臺(tái)交叉編譯器arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】u-boot的燒寫 先認(rèn)真閱讀FS_S5PC100平臺(tái)用戶手冊(cè)關(guān)閉開(kāi)發(fā)板電源,將撥碼開(kāi)關(guān)SW1調(diào)至0001(usb啟動(dòng)模式)后打開(kāi)電源加載運(yùn)行USBInstaller_DDR2.binUSBPortTransmitTransmit,選中image目錄下的USBInstaller_DDR2.bin 加載運(yùn)行u-boot.binUSBPortTransmitTransmit,選中image目錄下的u-boot.bin如下圖所示串口終端下能看到如下內(nèi)容(如果有倒計(jì)時(shí)數(shù)字,按任意鍵出現(xiàn)提示符) 針對(duì)有些學(xué)生DNW不能用,刪除C盤下的dnw.ini即可。設(shè)置并保存環(huán)境變量#printenv//查看環(huán)境變量的值并按如下設(shè)置#setenvbaudrate115200#setenvethaddr11:22:33:44:55:66#setenvgatewayip#setenvserverip00//serverip要和虛擬機(jī)的ip相同#setenvipaddr00//ipaddr也可以是192.168.1.x其他值#setenvnetmask保存環(huán)境變量#saveenv拷貝image/u-boot.bin到虛擬機(jī)/tftpboot目錄下燒寫u-boot.bin到nandflash起始地址#tftp20008000u-boot.bin#nanderase040000#nandwrite20008000040000關(guān)閉開(kāi)發(fā)板電源,將撥碼開(kāi)關(guān)SW1調(diào)至0000(nand啟動(dòng)模式)后打開(kāi)電源通過(guò)網(wǎng)絡(luò)加載內(nèi)核和文件系統(tǒng)設(shè)置內(nèi)核啟動(dòng)參數(shù)#setenvbootargsroot=nfsnfsroot=00:/source/rootfsip=00init=/linuxrcconsole=ttySAC0,115200#saveenv設(shè)置虛擬機(jī)拷貝/image/zImage到虛擬機(jī)/tftpboot目錄下解壓rootfs.tgz到虛擬機(jī)/source目錄下修改虛擬機(jī)nfs配置文件/etc/exports,添加如下內(nèi)容并重啟nfs服務(wù)/source/rootfs*(rw,sync,no_subtree_check,no_root_squash)$sudo/etc/init.d/nfs-kernel-serverrestart下載、啟動(dòng)內(nèi)核#tftp20008000zImage#go20008000從nandflash加載內(nèi)核和文件系統(tǒng)拷貝rootfs.cramfs到虛擬機(jī)/tftpboot目錄下燒寫內(nèi)核鏡像到nandflash#tftp20008000zImage#nanderase100000300000#nandwrite20008000100000300000 燒寫文件系統(tǒng)鏡像到nandflash#tftp20008000rootfs.cramfs#nanderase400000400000#nandwrite20008000400000400000設(shè)置啟動(dòng)參數(shù)#setenvbootdelay3#setenvbootcmdnandread20008000100000300000\;go20008000#setenvbootargsroot=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200#saveenv重新啟動(dòng)開(kāi)發(fā)板,u-boot自動(dòng)加載、執(zhí)行內(nèi)核u-boot其他命令u-boot支持的命令我們可以通過(guò)在終端上輸入”?”查看交叉編譯和交叉調(diào)試編輯程序源碼myapp.c交叉編譯后復(fù)制到/source/rootfs(編譯時(shí)添加選項(xiàng)-g)復(fù)制gdbserver到/source/rootfs(gdbserver在工具鏈安裝路徑下查找)在開(kāi)發(fā)板上如下運(yùn)行#gdbserver00:1234myapp&在主機(jī)上運(yùn)行交叉調(diào)試器$arm-none-linux-gnueabi-gdbmyapp在交叉調(diào)試器下和開(kāi)發(fā)板gdbserver建立連接(gdb)targetremote00:1234設(shè)置斷點(diǎn),輸入命令c開(kāi)始調(diào)試程序(注意觀察串口輸出)我們可以在板子上使用mount-onolock10:/home/kmart/2410/rootfstest/把虛擬機(jī)上的nfs目錄掛載到板子上的某一個(gè)目錄。實(shí)驗(yàn)三u-boot-2011.09的移植【實(shí)驗(yàn)?zāi)康摹?了解u-boot-2011.09的代碼結(jié)構(gòu)及移植方法?!緦?shí)驗(yàn)環(huán)境】ubuntu10.10發(fā)行版u-boot-2011.09FS_S5PC100平臺(tái)交叉編譯器arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】 說(shuō)明:后面實(shí)驗(yàn)中的命令行提示符是($)則為主機(jī)命令(主機(jī)上執(zhí)行),(#)則為開(kāi)發(fā)板命令(開(kāi)發(fā)板上執(zhí)行)一、建立自己的平臺(tái)下載源碼我們可以在下面這個(gè)網(wǎng)站上下載最新的和以前任一版本的ubootftp://ftp.denx.de/pub/u-boot/我們這里使用的是專門為三星平臺(tái)編寫的版本u-boot-samsung.tgz解壓uboot源碼并進(jìn)入目錄$tarxvfu-boot-samsung.tgz$cdu-boot-samsung添加fsc100平臺(tái)信息我們關(guān)心的板級(jí)相關(guān)文件或目錄u-boot-samsung/Makefileu-boot-samsung/boards.cfgu-boot-samsung/include/configs/smdkc100.hu-boot-samsung/arch/arm/cpu/armv7/start.Su-boot-samsung/board/samsung/smdkc100u-boot-samsung/arch/arm/libsmdkc100是使用s5pc100芯片的參考板,我們?cè)谄浠A(chǔ)之上移植fsc100$cdboard/samsung/$cp–asmdkc100fsc100$cdfsc100$mvsmdkc100.cfsc100.c$vimMakefile修改COBJS-y:=smdkc100.o為COBJS-y:=fsc100.o$cdinclude/configs$cpsmdkc100.hfsc100.h修改u-boot頂層目錄下的Makefile,指定交叉工具鏈$vimMakefile在ifeq($(HOSTARCH,$(ARCH))CROSS_COMPILE?=endif下添加:ifeq(arm,$(ARCH))CROSS_COMPILE?=arm-none-linux-gnueabi-endif在u-boot頂層目錄下的boards.cfg中添加fsc100配置信息$vimboards.cfg在smdkc100armarmv7smdkc100samsungs5pc1xx下添加:fsc100armarmv7fsc100samsungs5pc1xx編譯u-boot-samsung$makedistclean$makefsc100_config$make編譯完成后生成的u-boot.bin就是可執(zhí)行的鏡像文件。但是該文件只能在smdkc100平臺(tái)上運(yùn)行,我們需要對(duì)u-boot源代碼進(jìn)行相應(yīng)的修改。二、針對(duì)我們的fsc100平臺(tái)進(jìn)行相應(yīng)的移植修改include/configs/fsc100.h在#defineCONFIG_S5PC1001后添加#defineCONFIG_S5PC1XX1修改內(nèi)存基址#defineCONFIG_SYS_SDRAM_BASE0x30000000為#defineCONFIG_SYS_SDRAM_BASE0x20000000把#undefCONFIG_CMD_NAND改成#defineCONFIG_CMD_NAND在#defineCONFIG_CMD_NAND后添加#defineCONFIG_SYS_ICACHE_OFF 1注釋以下內(nèi)容#defineCONFIG_CMD_ONENAND注釋以下內(nèi)容#defineCONFIG_BOOTCOMMAND“runubifsbot”……#defineCONFIG_UPDATEB“updateb=……”注釋以下內(nèi)容#defineCONFIG_EXTRA_ENV_SETTINGS\……“ubi=enabled”修改提示符#defineCONFIG_SYS_PROMPT “SMDKC100#”為#defineCONFIG_SYS_PROMPT “FSC100#”修改內(nèi)核加載地址#defineCONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE為#defineCONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE+0x8000)修改內(nèi)存容量#definePHYS_SDRAM_1_SIZE (128<<20)為#definePHYS_SDRAM_1_SIZE (256<<20)修改環(huán)境變量存放位置#defineCONFIG_ENV_IS_IN_ONENAND 1為#defineCONFIG_ENV_IS_IN_NAND 1注釋以下內(nèi)容#defineCONFIG_USE_ONENAND_BOARD_INIT……#defineCONFIG_SYS_ONENAND_BASE 0xE7100000設(shè)置臨時(shí)棧地址,修改#defineCONFIG_SYS_INIT_SP_ADDR(CONFIG_SYS_LOAD_ADDR–0x1000000)為#defineCONFIG_SYS_INIT_SP_ADDR (0x22000)注釋以下內(nèi)容#ifdefCONFIG_CMD_NET……#endif/*CONFIG_CMD_NET*/添加NAND信息#defineCONFIG_SYS_MAX_NAND_DEVICE 1#defineCONFIG_SYS_NAND_MAX_CHIPS 1#defineCONFIG_SYS_NAND_BASE 0xE7200000#defineCONFIG_NAND_S5PC100 1#defineCONFIG_NAND_BL1_8BIT_ECC 1#defineCFG_NAND_HWECC 1#defineNAND_ENABLE_CE() (NFCONT_REG&=~(1<<1))#defineNAND_DISABLE_CE() (NFCONT_REG|=(1<<1))#defineNF_TRANSRnB()do{while(!(NFSTAT_REG&(1<<0)));}while(0)添加網(wǎng)卡信息#ifdefCONFIG_CMD_NET#defineCONFIG_CMD_PING 1#defineCONFIG_DRIVER_DM9000 1#defineCONFIG_DM9000_BASE 0x88000300#defineDM9000_IOCONFIG_DM9000_BASE#defineDM9000_DATA(CONFIG_DM9000_BASE+4)#defineCONFIG_DM9000_USE_16BIT#defineCONFIG_DM9000_NO_SROM 1#defineCONFIG_ETHADDR 11:22:33:44:55:66#defineCONFIG_IPADDR 00#defineCONFIG_SERVERIP 00#defineCNNFIG_GATEWAYIP #defineCONFIG_NETMASK #endif復(fù)制lowlevel_init.Smem_setup.S到board/samsung/fsc100上述代碼專門針對(duì)fsc100使用的內(nèi)存進(jìn)行初始化,可參考相關(guān)芯片手冊(cè)復(fù)制fsc100.c到board/smsung/fsc100覆蓋原來(lái)的fsc100.cfsc100.c包含的是板級(jí)初始化函數(shù)在board/samsung/fsc100/目錄下添加nand_cp.c#include<common.h>#ifdefCONFIG_S5PC1XX#include<asm/io.h>#include<linux/mtd/nand.h>#define_REG__(x)(*(volatileunsignedlong*)(x))#define_REGb__(x)(*(volatileunsignedchar*)(x))#defineNFCONT_REG_REG__(0xE7200004)#defineNFCMD_REG_REG__(0xE7200008)#defineNFADDR_REG_REG__(0xE720000C)#defineNFDATA8_REG_REGb__(0xE7200010)#defineNFSTAT_REG_REG__(0xE7200028)#defineNAND_CONTROL_ENABLE()(NFCONT_REG|=(1<<0))staticintnandll_read_page(uchar*buf,ulongaddr,intlarge_block){inti;intpage_size=512;if(large_block)page_size=2048;NAND_ENABLE_CE();NFCMD_REG=NAND_CMD_READ0;/*WriteAddress*/NFADDR_REG=0;if(large_block)NFADDR_REG=0;NFADDR_REG=(addr)&0xff;NFADDR_REG=(addr>>8)&0xff;NFADDR_REG=(addr>>16)&0xff;if(large_block)NFCMD_REG=NAND_CMD_READSTART;NF_TRANSRnB();for(i=0;i<page_size;i++){*buf++=NFDATA8_REG;}NAND_DISABLE_CE();return0;}staticintnandll_read_blocks(ulongdst_addr,ulongsize,intlarge_block){uchar*buf=(uchar*)dst_addr;inti,pages;uintpage_shift=9;if(large_block)page_shift=11;pages=size>>page_shift;for(i=0;i<pages;i++){nandll_read_page(buf,i,large_block);buf+=(1<<page_shift);}return0;}intcopy_uboot_to_ram(void){inti,large_block=0;vu_charid;NAND_CONTROL_ENABLE();NAND_ENABLE_CE();NFCMD_REG=NAND_CMD_READID;NFADDR_REG=0x0;/*waitforawhile*/for(i=0;i<200;i++);id=NFDATA8_REG;id=NFDATA8_REG;if(id>0x80)large_block=1;returnnandll_read_blocks(0x27E00000,0x40000,large_block);}#endif修改board/samsung/fsc100/Makefile把SOBJS :=lowlevel_init.o改成SOBJS :=lowlevel_init.omem_setup.onand_cp.o修改board/samsun/fsc100/config.mk把CONFIG_SYS_TEXT_BASE=0x34800000改成CONFIG_SYS_TEXT_BASE=0x27E00000修改arch/arm/cpu/armv7/start.S在call_board_init_f:之前添加如下代碼/*如果uboot不在內(nèi)存中,則從nand復(fù)制uboot到內(nèi)存中*/ldrr0,=0xff000fffbicr1,pc,r0ldrr2,_TEXT_BASEbicr2,r2,r0cmpr1,r2beqcall_board_init_fldrsp,=(0x22000000)blcopy_uboot_to_ramldrpc,=call_board_init_f鏈接文件的修改修改arch/arm/cpu/armv7/u-boot.lds為:…….text:{ arch/arm/cpu/armv7/start.o (.text) board/samsung/fsc100/libfsc100.o *(.text)}……復(fù)制s5pc100.hs5pc1x0.hhardware.h到arch/arm/include/asm/arch-s5pc1xx/復(fù)制s5p_nand.c到drivers/mtd/nand/修改drivers/mtd/nand/Makefile在COBJS-$(CONFIG_NAND_S3C64XX)+=s3c64xx.o后面添加COBJS-$(CONFIG_NAND_S5PC100)+=s5p_nand.o修改include/linux/mtd/mtd-abi.hstructnand_ecclayout{……structnand_oobfreeoobfree[MTD_MAX_OOBFREE_ENTRIES];uint32_tuseecc;uint32_treserved;};修改net/net.c,注釋以下內(nèi)容eth_halt();eth_set_current();if(eth_init(bd)<0){eth_halt();return-1;}注釋該文件中其他所有的eth_halt()在arch/arm/lib/board.c中添加網(wǎng)卡初始化代碼在eth_initialize(gd->bd);后面添加eth_init(gd->bd);修改網(wǎng)卡驅(qū)動(dòng)drivers/net/dm9xxx.c在函數(shù)dm9000_init中,DM9000_iow(DM9000_IMR,IMR_PAR);之后的內(nèi)容都注釋掉,直到該函數(shù)結(jié)束修改include/net.hstaticinlineintis_multicast_ether_addr(constu8*addr){ return(0x01==addr[0]);}修改net/tftp.c把#defineTIMEOUT5000UL改成#defineTIMEOUT50000ULgo命令的優(yōu)化修改該common/cmd_boot.cintdo_go(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[]){ulong

addr,rc;intrcode=0;

if(argc<2){returncmd_usage(cmdtp);/****************addedbyfarsight2011-12-18*****************/char*cmdline=getenv("bootargs");structparam_struct*kernel_params=(structparam_struct*)0x20000100;

printf("setuplinuxparametersat0x20000100\n");memset(kernel_params,0,sizeof(structparam_struct));kernel_params->u1.s.page_size=4096;kernel_params->u1.s.nr_pages=0x10000000>>12;memcpy(kernel_params->commandline,cmdline,strlen(cmdline)+1);printf("linuxcommandlineis:\"%s\"\n",cmdline);/***************************************************************/

addr=simple_strtoul(argv[1],NULL,16);

printf("##Startingapplicationat0x%08lX...\n",addr);

/*******************addedbyfarsight2011-12-18******************/__asm__("ldrr1,=1826\n""mov

ip,#0\n""mcr

p15,0,ip,c8,c7,0\n"

"mcr

p15,0,ip,c7,c5,0\n"

"mcr

p15,0,ip,c7,c5,6\n"

"mcr

p15,0,ip,c7,c10,4\n"

"mcr

p15,0,ip,c7,c5,4\n"

"mrc

p15,0,ip,c1,c0,0\n"

"bic

ip,ip,#0x00002000\n"

"bic

ip,ip,#0x00000007\n""orr

ip,ip,#0x00000002\n""orr

ip,ip,#0x00000800\n""bic

ip,ip,#0x00001000\n""mcr

p15,0,ip,c1,c0,0\n"

"movpc,%0\n""nop\n"::"r"(addr));/***************************************************************/

rc=do_go_exec((void*)addr,argc-1,argv+1);if(rc!=0)rcode=1;

printf("##Applicationterminated,rc=0x%lX\n",rc);returnrcode;}重新編譯$makedistclean$makefsc100_config$make這樣我們就得到能夠在fsc100平臺(tái)上使用的u-boot.bin實(shí)驗(yàn)四內(nèi)核的配置和編譯【實(shí)驗(yàn)?zāi)康摹?了解內(nèi)核的編譯過(guò)程及配置選項(xiàng)的內(nèi)容【實(shí)驗(yàn)環(huán)境】主機(jī):ubuntu10.10發(fā)行版目標(biāo)機(jī):FS_S5PC100平臺(tái)交叉編譯工具:arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】 解壓內(nèi)核將linux-2.6.35.tar.bz2拷貝到/home/linux下并解壓$tarxvflinux-2.6.35.tar.bz2$cdlinux-2.6.35修改內(nèi)核頂層目錄下的Makefile$vimMakefile修改:ARCH ?=$(SUBARCH)CROSS_COMPILE ?=CROSS_COMPILE ?=$(CONFIG_CROSS_COMPILE:"%"=%)為:ARCH ?=armCROSS_COMPILE ?=arm-none-linux-gnueabi-拷貝標(biāo)準(zhǔn)板配置文件$cparch/arm/configs/s5pc100_defconfig.config配置內(nèi)核$makemenuconfig該命令執(zhí)行時(shí)會(huì)彈出一個(gè)菜單,我們可以對(duì)內(nèi)核進(jìn)行詳細(xì)的配置。這里我們先查看一下,內(nèi)核都提供了那些功能!編譯內(nèi)核$makezImage通過(guò)上述操作我們能夠在arch/arm/boot目錄下生成一個(gè)zImage文件,這就是經(jīng)過(guò)壓縮的內(nèi)核鏡像。實(shí)驗(yàn)五網(wǎng)卡驅(qū)動(dòng)的移植【實(shí)驗(yàn)?zāi)康摹?通過(guò)上面的實(shí)驗(yàn)我們能夠獲得一個(gè)內(nèi)核,但是這個(gè)內(nèi)核只是一個(gè)最基本的配置,很多的功能并沒(méi)有包含。 網(wǎng)卡是嵌入式產(chǎn)品最常用的設(shè)備,這里我們需要完成網(wǎng)卡驅(qū)動(dòng)的移植。FS_S5PC100使用的是DM9000網(wǎng)卡,我們通過(guò)這個(gè)實(shí)驗(yàn)?zāi)軌蛄私馊绾卧趦?nèi)核中添加網(wǎng)卡驅(qū)動(dòng)及網(wǎng)絡(luò)功能的基本配置?!緦?shí)驗(yàn)環(huán)境】主機(jī):ubuntu10.10發(fā)行版目標(biāo)機(jī):FS_S5PC100平臺(tái)交叉編譯工具:arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】平臺(tái)代碼修改vimarch/arm/mach-s5pc100/mach-smdkc100.c添加需要的頭文件#ifdefined(CONFIG_DM9000)#include<linux/dm9000.h>#include<linux/irq.h>#endif平臺(tái)設(shè)備的添加/*DM9000Support*/#ifdefined(CONFIG_DM9000)staticstructresourcedm9000_resources[]={[0]={.start

=0x88000000,.end

=0x88000000+0x3,.flags

=IORESOURCE_MEM,},[1]={.start

=0x88000000+0x4,.end

=0x88000000+0x4+0x3,.flags

=IORESOURCE_MEM,},[2]={ .start=IRQ_EINT(10), .end=IRQ_EINT(10),.flags

=IORESOURCE_IRQ|IRQ_TYPE_LEVEL_HIGH,},};

staticstructdm9000_plat_datas5pc100_dm9000_platdata={.flags

=DM9000_PLATF_16BITONLY,.dev_addr[0]=0x00,.dev_addr[1]=0x00,.dev_addr[2]=0x3e,.dev_addr[3]=0x26,.dev_addr[4]=0x0a,.dev_addr[5]=0x00,};

staticstructplatform_devices5pc100_device_dm9000={.name

="dm9000",.id

=-1,.num_resources

=ARRAY_SIZE(dm9000_resources),.resource

=dm9000_resources,.dev={.platform_data=&s5pc100_dm9000_platdata,}};#endif平臺(tái)設(shè)備列表的添加:在smdkc100_device[]結(jié)構(gòu)體數(shù)組中添加如下內(nèi)容:#ifdefined(CONFIG_DM9000)&s5pc100_device_dm9000,#endif配置內(nèi)核$makemenuconfig網(wǎng)絡(luò)配置:[*]Networkingsupport(NEW)>Networkingoptions><*>Packetsocket<*>Unixdomainsockets[*]TCP/IPnetworking[*]IP:multicasting[*]IP:kernellevelautoconfiguration[*]IP:BOOTPsupport網(wǎng)卡驅(qū)動(dòng)配置DeviceDrivers>[*]Networkdevicesupport>[*]Ethernet(10or100Mbit)><*>DM9000support網(wǎng)絡(luò)文件系統(tǒng)的配置Filesystems>[*]NetworkFileSystems><*>NFSclientsuppor[*]NFSclientsupportforNFSversion3[*]NFSclientsupportfortheNFSv3ACLprotocolextension[*]RootfilesystemonNFS編譯內(nèi)核,并拷貝到tftpboot目錄下$makezImage$cparch/arm/boot/zImage/tftpboot啟動(dòng)開(kāi)發(fā)板,修改內(nèi)核啟動(dòng)參數(shù),通過(guò)NFS方式掛載根文件系統(tǒng)實(shí)驗(yàn)六LED驅(qū)動(dòng)的移植【實(shí)驗(yàn)?zāi)康摹框?qū)動(dòng)程序的靜態(tài)編譯和動(dòng)態(tài)編譯應(yīng)用程序如何打開(kāi)/操作設(shè)備【實(shí)驗(yàn)環(huán)境】主機(jī):ubuntu10.10發(fā)行版目標(biāo)機(jī):FS_S5PC100平臺(tái)交叉編譯工具:arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】修改內(nèi)核配置$makemenuconfigKernelFeatures> [*]UsetheARMEABItocompilethekernel [*]AllowoldABIbinariestorunwiththiskernel(EXPERIMENTAL)添加驅(qū)動(dòng)文件將實(shí)驗(yàn)代碼LED_TEST/fsc100_led_drv.c拷貝到drivers/char下修改drivers/char/Kconfig在menu"Characterdevices"下面添加如下內(nèi)容:configFSC100_LED tristate"FSC100LEDDeviceSupport" dependsonARCH_S5PC100 help supportleddeviceonFS_S5PC100developboard修改drivers/char/Makefile在obj-$(CONFIG_HANGCHECK_TIMER)+=hangcheck-timer.o下一行添加:obj-$(CONFIG_FSC100_LED)+=fsc100_led_drv.o交叉編譯測(cè)試程序fsc100_led_test.carm-none-linux-gnueabi-gccfsc100_led_test.c–o/source/rootfs/fsc100_led_test設(shè)置u-boot環(huán)境變量#setenvserverip00#setenvipaddr00#setenvbootcmdtftp20008000zImage\;go20008000#setenvbootargsroot=nfsnfsroot=00:/source/rootfsconsole=ttySAC0,115200init=/linuxrcip=00#saveenv靜態(tài)編譯LED驅(qū)動(dòng)配置內(nèi)核時(shí)按“空格”選擇,配置完成后保存退出$makemenuconfig DeviceDrivers> Characterdevices> <*>FSC100LEDDeviceSupport保存退出,重新編譯后把zImage拷貝到tftpboot下$makezImage$cparch/arm/boot/zImage/tftpboot重新啟動(dòng)開(kāi)發(fā)板,linux運(yùn)行起來(lái)后在終端下操作創(chuàng)建設(shè)備節(jié)點(diǎn)#mknod/dev/ledc2520運(yùn)行測(cè)試程序并觀察現(xiàn)象#./fsc100_led_test動(dòng)態(tài)編譯LED驅(qū)動(dòng)配置內(nèi)核時(shí)按“空格”選擇,配置完成后保存退出$makemenuconfig DeviceDrivers> Characterdevices> <M>FSC100LEDDeviceSupport保存退出,重新編譯后把zImage拷貝到tftpboot下,把驅(qū)動(dòng)模塊拷貝到/source/rootfs下$makezImagemodules$cparch/arm/boot/zImage/tftpboot$cpdrivers/char/fsc100_led_drv.ko/source/rootfs重新啟動(dòng)開(kāi)發(fā)板,linux運(yùn)行起來(lái)后在終端下操作創(chuàng)建設(shè)備節(jié)點(diǎn)#mknod/dev/ledc2520加載LED驅(qū)動(dòng)模塊#insmodfsc100_led_drv.ko運(yùn)行測(cè)試程序并觀察現(xiàn)象#./fsc100_led_test實(shí)驗(yàn)七Nandflash驅(qū)動(dòng)的移植【實(shí)驗(yàn)?zāi)康摹?Nandflash是嵌入式系統(tǒng)最常用的外部存儲(chǔ)設(shè)備,這里介紹Nandflash驅(qū)動(dòng)移植的過(guò)程。 說(shuō)明:在本系統(tǒng)移植課程實(shí)驗(yàn)中命令行提示符“$”表示是在主機(jī)上執(zhí)行,“#”表示在目標(biāo)板執(zhí)行【實(shí)驗(yàn)環(huán)境】主機(jī):ubuntu10.10發(fā)行版目標(biāo)機(jī):FS_S5PC100平臺(tái)交叉編譯工具:arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】添加針對(duì)我們平臺(tái)的Nandflash驅(qū)動(dòng)拷貝s3c_nand.c到drivers/mtd/nand下拷貝regs-nand.h到arch/arm/mach-s5pc100/include/mach下針對(duì)平臺(tái)上的nandflash設(shè)備,修改drivers/mtd/nand/nand_base.c第2812行for(i=0;i<5;i++)添加內(nèi)核配置選項(xiàng)修改drivers/mtd/nand/Kconfig添加如下內(nèi)容:configMTD_NAND_S3C

tristate"NANDFlashsupportforS3CSoC"

dependson(ARCH_S3C64XX||ARCH_S5P64XX||ARCH_S5PC1XX||ARCH_S5PC100)&&MTD_NAND

help

ThisenablestheNANDflashcontrollerontheS3C.

Noboardspecficsupportisdonebythisdriver,eachboard

mustadvertiseaplatform_deviceforthedrivertoattach.

configMTD_NAND_S3C_DEBUG

bool"S3CNANDdriverdebug"

dependsonMTD_NAND_S3C

help

EnabledebuggingoftheS3CNANDdriver

configMTD_NAND_S3C_HWECC

bool"S3CNANDHardwareECC"

dependsonMTD_NAND_S3C

help

EnabletheuseoftheS3C'sinternalECCgeneratorwhen

usingNAND.Earlyversionsofthechiphavehadproblemswith

incorrectECCgeneration,andifusingthese,thedefaultof

softwareECCispreferable.

IfyoulaydownadevicewiththehardwareECC,thenyouwill

currentlynotbeabletoswitchtosoftware,asthereisno

implementationforECCmethodusedbytheS3C修改drivers/mtd/nand/Makefile添加如下內(nèi)容:obj-$(CONFIG_MTD_NAND_S3C)

+=s3c_nand.o修改平臺(tái)代碼修改arch/arm/mach-s5pc100/mach-smdkc100.c添加如下內(nèi)容:添加頭文件#ifdefined(CONFIG_MTD_NAND_S3C)#include<linux/mtd/partitions.h>#include<linux/mtd/mtd.h>#include<plat/nand.h>#endif添加平臺(tái)設(shè)備#ifdefined(CONFIG_MTD_NAND_S3C)/*NandFlashSupport*/staticstructmtd_partitions5pc100_nand_part[]={

[0]={

.name

="bootloader",

.size

=SZ_1M,

.offset

=0,

},

[1]={

.name

="kernel",

.offset=MTDPART_OFS_APPEND,

.size

=SZ_1M*3,

},

[2]={

.name

="rootfs",

.offset =MTDPART_OFS_APPEND,

.size

=SZ_4M,

},

[3]={

.name

="usrfs",

.offset

=MTDPART_OFS_APPEND,

.size

=MTDPART_SIZ_FULL,

},};

structs3c_nand_mtd_infos5pc100_nand_mtd_part_info={

.chip_nr=1,

.mtd_part_nr=ARRAY_SIZE(s5pc100_nand_part),

.partition=s5pc100_nand_part,};

staticstructresources5pc100_nand_resource[]={

[0]={

.start=0xE7200000,

.end=0xE7200000+SZ_1M,

.flags=IORESOURCE_MEM,

}};

structplatform_devices5pc100_device_nand={

.name

="s5pc100-nand",

.id

=-1,

.num_resources

=ARRAY_SIZE(s5pc100_nand_resource),

.resource

=s5pc100_nand_resource,

.dev={

.platform_data=&s5pc100_nand_mtd_part_info,

}};#endif添加平臺(tái)設(shè)備列表在smdkc100_device[]結(jié)構(gòu)體數(shù)組中添加如下內(nèi)容:#ifdefined(CONFIG_MTD_NAND_S3C)

&s5pc100_device_nand,#endif修改arch/arm/plat-samsung/include/plat/nand.h添加如下內(nèi)容:structs3c_nand_mtd_info{

uintchip_nr;

uintmtd_part_nr;

structmtd_partition*partition;};配置內(nèi)核$makemenuconfigDeviceDrivers> <*>MemoryTechnologyDevice(MTD)support> [*]MTDpartitioningsupport<*>CachingblockdeviceaccesstoMTDdevices <*>NANDDeviceSupport> <*>NANDFlashsupportforS3CSoC [*]S3CNANDHardwareECCFileSystems>PartitionTypes>[*]Advancedpartitionselection[*]PCBIOS(MSDOSpartitiontables)support[*]BSDdisklabel(FreeBSDpartitiontables)support編譯內(nèi)核并拷貝到tftpboot下$makezImage$cparch/arm/boot/zImage/tftpboot測(cè)試啟動(dòng)目標(biāo)板,在目標(biāo)板上完成如下操作:#cat/proc/mtddev:sizeerasesizenamemtd0:0010000000020000"bootloader"mtd1:0030000000020000"kernel"mtd2:0040000000020000"rootfs"mtd3:0f80000000020000"usrfs"實(shí)驗(yàn)八 LCD驅(qū)動(dòng)移植【實(shí)驗(yàn)?zāi)康摹?了解交叉工具鏈的編譯過(guò)程及其使用。 說(shuō)明:在本系統(tǒng)移植課程實(shí)驗(yàn)中命令行提示符“$”表示是在主機(jī)上執(zhí)行,“#”表示在目標(biāo)板執(zhí)行【實(shí)驗(yàn)環(huán)境】主機(jī):ubuntu10.10發(fā)行版目標(biāo)機(jī):FS_S5PC100平臺(tái)交叉編譯工具:arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】修改arch/arm/mach-s5pc100/mach-smdkc100.c修改smdkc100_fb_win0結(jié)構(gòu)體內(nèi)容為:staticstructs3c_fb_pd_winsmdkc100_fb_win0={/*thisistoensureweusewin0*/.win_mode

={.pixclock=1000000000000ULL/((8+43+1+480)*(4+10+12+272)*80),.left_margin

=8,.right_margin

=43,.upper_margin

=4,.lower_margin

=12,.hsync_len

=1,.vsync_len

=10,.xres

=480,.yres

=272,},.max_bpp

=32,.default_bpp

=16,}; 修改drivers/video/Kconfig修改:dependson(FB&&ARCH_S3C64XX)為:dependson(FB&&ARCH_S3C64XX)||(FB&&ARCH_S5PC100) 配置內(nèi)核$makemenuconfigDeviceDrivers>Graphicssupport> <*>Supportforframebufferdevices><*>SamsungS3CframebuffersupportConsoledisplaydriversupport> <*>FramebufferConsolesupport[*]Bootuplogo>編譯內(nèi)核并拷貝到tftpboot下$makezImage$cparch/arm/boot/zImage/tftpboot測(cè)試插上屏,啟動(dòng)開(kāi)發(fā)板,能夠看到屏幕上顯示一個(gè)小企鵝就是移植成功了!實(shí)驗(yàn)九 USB驅(qū)動(dòng)的移植【實(shí)驗(yàn)?zāi)康摹?USB接口是現(xiàn)在計(jì)算機(jī)系統(tǒng)中最通用的一種接口, 說(shuō)明:在本系統(tǒng)移植課程實(shí)驗(yàn)中命令行提示符“$”表示是在主機(jī)上執(zhí)行,“#”表示在目標(biāo)板執(zhí)行【實(shí)驗(yàn)環(huán)境】主機(jī):ubuntu10.10發(fā)行版目標(biāo)機(jī):FS_S5PC100平臺(tái)交叉編譯工具:arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】添加針對(duì)我們板子的USB驅(qū)動(dòng)及相關(guān)頭文件拷貝ohci-s3c2410.c到drivers/usb/host/下拷貝regs-clock.h到arch/arm/mach-s5pc100/include/mach/下修改drivers/usb/Kconfig在:defaultyifARCH_S3C2410后添加:defaultyifARCH_S5PC100修改drivers/usb/host/ohci-hcd.c修改:#ifdefined(CONFIG_ARCH_S3C2410)||defined(CONFIG_ARCH_S3C64XX)為:#ifdefined(CONFIG_ARCH_S3C2410)||defined(CONFIG_ARCH_S3C64XX)||defined(CONFIG_ARCH_S5PC100)修改arch/arm/mach-s5pc100/include/mach/map.h添加如下內(nèi)容:#defineS3C_PA_USBHOST

(0xED400000)修改arch/arm/plat-samsung/dev-usb.c修改[1]={.start=IRQ_USBH,.end=IRQ_USBH,.flags=IORESOURCE_IRQ,}為:[1]={.start=IRQ_UHOST,.end=IRQ_UHOST,.flags=IORESOURCE_IRQ,}添加平臺(tái)設(shè)備修改arch/arm/mach-s5pc100/Kconfig在selectS3C_PL330_DMA后添加selectS3C_DEV_USB_HOST修改arch/arm/mach-s5pc100/mach-smdkc100.c添加頭文件#ifdefined(CONFIG_USB_SUPPORT)#include<plat/pll.h>#include<linux/usb/ch9.h>#include<mach/regs-clock.h>#endif添加平臺(tái)設(shè)備#ifdefined(CONFIG_USB_SUPPORT)voidusb_host_clk_en(void){

/*Settingtheepllclkto48MHz,P=3,M=96,S=3*/

writel((readl(S5P_EPLL_CON)&~(S5P_EPLL_MASK))|(S5P_EPLL_EN\

|S5P_EPLLVAL(96,3,3)),S5P_EPLL_CON);

writel((readl(S5P_CLK_SRC0)|S5P_CLKSRC0_EPLL_MASK),S5P_CLK_SRC0);

writel((readl(S5P_CLK_SRC1)&~S5P_CLKSRC1_UHOST_MASK),S5P_CLK_SRC1);

/*USBhostclockdividerratiois1*/

writel((readl(S5P_CLK_DIV2)&~S5P_CLKDIV2_UHOST_MASK),S5P_CLK_DIV2);

writel(readl(S5P_CLKGATE_D10)|S5P_CLKGATE_D10_USBHOST,S5P_CLKGATE_D10);

writel(readl(S5P_SCLKGATE0)|S5P_CLKGATE_SCLK0_USBHOST,S5P_SCLKGATE0);}EXPORT_SYMBOL(usb_host_clk_en);#endif添加平臺(tái)設(shè)備列表在smdkc100_device[]結(jié)構(gòu)體數(shù)組中添加如下內(nèi)容:#ifdefined(CONFIG_USB_SUPPORT)

&s3c_device_ohci,#endif配置內(nèi)核$makemenuconfigUSB控制器支持DeviceDrivers> [*]USBsupport> <*>SupportforHost-sideUSB <*>OHCIHCDsupportU盤支持DeviceDrivers> SCSIdevicesupport> <*>SCSIdevicesupport <*>SCSIdisksupport <*>SCSIgenericsupport <*>SCSImediachangersupportDeviceDrivers> [*]USBsupport><*>USBMassStoragesupport文件系統(tǒng)及語(yǔ)言配置:Filesystems>DOS/FAT/NTFilesystems><*>VFAT(Windows-95)fssupport

-*-Nativelanguagesupport><*>Codepage437(UnitedStates,Canada)<*>SimplifiedChinesecharset(CP936,GB2312)<*>NLSISO8859-1(Latin1;WesternEuropeanLanguages)<*>ASCII(UnitedStates)<*>NLSUTF-8編譯內(nèi)核并拷貝到tftpboot下$makezImage$cparch/arm/boot/zImage/tftpboot測(cè)試啟動(dòng)目標(biāo)板并在目標(biāo)板上完成如下操作:#mount-tvfat/dev/sda1/mnt#ls可以查看到U盤內(nèi)容,即完成實(shí)驗(yàn)。實(shí)驗(yàn)十 SD卡驅(qū)動(dòng)移植【實(shí)驗(yàn)?zāi)康摹?SD卡是嵌入式系統(tǒng)最常用的外部擴(kuò)展存儲(chǔ)設(shè)備,這里介紹SD驅(qū)動(dòng)移植的過(guò)程。 說(shuō)明:在系統(tǒng)移植課程實(shí)驗(yàn)中命令行提示符“$”表示是在主機(jī)上執(zhí)行,“#”表示在目標(biāo)板執(zhí)行【實(shí)驗(yàn)環(huán)境】主機(jī):ubuntu10.10發(fā)行版目標(biāo)機(jī):FS_S5PC100平臺(tái)交叉編譯工具:arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】 修改配置文件修改drivers/mmc/host/Kconfig修改:dependsonMMC_SDHCI&&(PLAT_S3C24XX||PLAT_S3C64XX)為:dependsonMMC_SDHCI&&(PLAT_S3C24XX||PLAT_S3C64XX||ARCH_S5PC100)修改driver/mmc/host/sdhci.c修改:mmc->f_min=host->max_clk/256;為mmc->f_min=host->max_clk/512;配置內(nèi)核$makemenuconfigSD卡驅(qū)動(dòng)配置:DeviceDrivers> <*>MMC/SD/SDIOcardsupport> <*>SDHCIsupportonSamsungS3CSoC [*]DMAsupportonS3CSDHCI編譯內(nèi)核并拷貝到tftpboot下$makezImage$cparch/arm/boot/zImage/tftpboot測(cè)試啟動(dòng)目標(biāo)板并在目標(biāo)板上完成如下操作:#mount-tvfat/dev/mmcblk0p1/mnt#ls可以查看到SD卡內(nèi)容,即完成實(shí)驗(yàn)。實(shí)驗(yàn)十一yaffs2文件系統(tǒng)的移植【實(shí)驗(yàn)?zāi)康摹?yaffs2文件系統(tǒng)是嵌入式系統(tǒng)中常用到的一種文件系統(tǒng),并且在主要用在nandflash上,這里我們?cè)趦?nèi)核里添加yaffs2的支持【實(shí)驗(yàn)環(huán)境】ubuntu10.10發(fā)行版FS_S5PC100平臺(tái)交叉編譯器arm-none-linux-gnueabi-gcc【實(shí)驗(yàn)步驟】 源碼下載 $wgethttp://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2.tar.gz解壓到內(nèi)核源碼linux-2.6.35同級(jí)目錄下 $tarxvfyaffs2.tar.gz往內(nèi)核打yaffs2補(bǔ)丁$cdyaffs2$./patch-ker.shc../linux-2.6.35配置內(nèi)核$cd../linux-2.6.35 $makemenuconfigFilesystems> [*]Miscellaneousfilesystems> <*>YAFFS2filesystemsupport -*-512byte/pagedevices -*-2048byte(orlarger)/pagedevices [*]Autoselectyaffs2 format [*] CacheshortnamesinRAM重新編譯內(nèi)核 $makezImage 拷貝內(nèi)核到開(kāi)發(fā)板上 $cparch/arm/boot/zImage/tftpboot重新啟動(dòng)開(kāi)發(fā)板#cat/proc/filesystemsnodev sysfsnodev rootfsnodev bdevnodev procnodev tmpfsnodev sockfsnodev usbfsnodev pipefsnodev anon_inodefsnodev rpc_pipefsnodev devpts ext3 ext2 cramfsnodev ramfs vfat msdos iso9660nodev nfsnodev jffs2 romfs yaffs yaff

溫馨提示

  • 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)論