版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1http:/第第7 7章章 基于基于LinuxLinux的嵌入式系的嵌入式系統(tǒng)開發(fā)實例統(tǒng)開發(fā)實例 n主講:本章內(nèi)容n嵌入式多媒體播放系統(tǒng)1、開發(fā)環(huán)境的搭建2、Boot Loader移植3、嵌入式Linux內(nèi)核移植4、根文件系統(tǒng)移植5、應(yīng)用程序開發(fā)nPXA系列典型嵌入式系統(tǒng)開發(fā)環(huán)境的搭建nPXA255系統(tǒng)開發(fā)平臺介紹宿主機-目標機開發(fā)模式n搭建開發(fā)環(huán)境安裝Linux操作系統(tǒng)安裝xinetd安裝BOOTP安裝TFTP服務(wù)器n交叉編譯環(huán)境的搭建PXA255系統(tǒng)開發(fā)平臺介紹項目描述項目描述處理器PXA255USB Host2SlotSDRAMSamsung 2片64MBUSB Slave1SlotF
2、lashINTEL E28F128 2片32MBPCMCIA1Slot以太網(wǎng)卡CS8900A 10BaseT實時時鐘Real-time clock RTC4513聲卡AC97 Stereo audio紅外HDSL3600顯示屏LG TFT LCD 6.4英寸(640X480)CF1SlotJTAG20針界面串口9針宿主機-目標機開發(fā)模式安裝Linux操作系統(tǒng)nFedora 7BOOTP簡介nBOOTP服務(wù)的全稱是Bootstrap Protocol,是一種比較早出現(xiàn)的遠程啟動的協(xié)議,我們經(jīng)常用到的DHCP服務(wù)就是從BOOTP服務(wù)擴展而來的。nBOOTP協(xié)議使用TCP/IP網(wǎng)絡(luò)協(xié)議中的UDP 6
3、7/68兩個通訊端口。nBOOTP主要是用于無磁盤的客戶機從服務(wù)器得到自己的IP地址、服務(wù)器的IP地址、啟動映象文件名、網(wǎng)關(guān)IP等等。 TFTP簡介nTFTP可以看成一個簡化了的FTP,主要的區(qū)別是沒有用戶權(quán)限管理的功能,也就是說TFTP不需要認證客戶端的權(quán)限,這樣遠程啟動的客戶機在啟動一個完整的操作系統(tǒng)之前就可以通過TFTP下載啟動映象檔,而不需要證明自己是合法的用戶。 nTFTP在安裝時一定要設(shè)立一個單獨的目錄作為TFTP服務(wù)的根目錄,以減少安全隱患xinetd簡介n為了使用BOOTP和TFTP協(xié)議,首先要在宿主機上安裝xinetd。nxinetd是被動式的超級服務(wù),也就是服務(wù)程序是被ft
4、p, telnetd, pop3,imap, auth等應(yīng)用程序所啟動,平時則無須啟動。 安裝xinetdn進行安裝之前,首先用rpm命令查詢xinetd rpm包的安裝信息:n如果沒有安裝xinetd,可以從Linux安裝包中取得xinetd rpm包,并運行rpm命令進行安裝:n最后啟動xinetd,正常情況下,系統(tǒng)會顯示服務(wù)啟動信息:armlocalhost root# rpm qa | grep xinetdarmlocalhost root# rpm Uvh xinetd-pre15-2.i386.rpmarmlocalhost root# etc/rc.d/init.
5、d/xinetd start安裝BOOTPn先用rpm命令檢查是否已經(jīng)安裝BOOTP rpm包,如果沒有則參照xinetd rmp包的安裝方法進行安裝。n安裝完畢之后會生成/usr/sbin/bootpd文件,這個文件運行時會激發(fā)守護進程xinetd運行,需要創(chuàng)建/etc/xinetd.d/bootp文件并進行如下設(shè)置: armlocalhost root# cd /etc/xinetd.darmlocalhost xinetd.d# vi bootpService bootpsdisable = nosocket_type = dgramprotocol = udpwait = yesuse
6、r = rootserver = /usr/sbin/bootpd配置bootptab 在目標板上發(fā)送BOOTP請求時,宿主機上安裝的BOOTP服務(wù)器(bootpd)根據(jù)/etc/bootptab中定義的目標機信息來生成BOOTP響應(yīng)包以作應(yīng)答。所以為了使用BOOTP,需事先在/etc/bootptab中輸入目標機的Mac地址和分配的IP等信息,如下圖:字段ht表示Hardware Type,因為使用10Mb Ethernet,所以設(shè)置為1(Ethernet);ha表示Hardware Address,是發(fā)送bootp請求的目標機的Mac地址;ip表示分配給目標機的IP地址;sm表示Subne
7、t Mask,應(yīng)與宿主機相同。 armlocalhost xinetd.d# vi /etc/bootptabtest:ht = 1:ha = 0 x151436188A11:ip = 95:sm = 安裝TFTP服務(wù)器n首先應(yīng)確認宿主機上是否正確安裝了TFTP rpm包。安裝以后,會生成/etc/xinetd.d/tftp文件。如同BOOTP一樣,TFTP也將激發(fā)守護進程xinetd的執(zhí)行,需要對/etc/xinetd.d/tftp檔進行如右所示修改:n為了操作方便,通常需要在根目錄下建立一個/tftpboot目錄,并將server_args設(shè)
8、置為該目錄(當然也可以自行設(shè)定其他目錄)。 Service tftpdisable = nosocket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /tftpboot搭建交叉編譯環(huán)境n交叉編譯就是在一個架構(gòu)下編譯另一個架構(gòu)的目標文件n采用何種交叉編譯器產(chǎn)生何種格式的目標文件還要取決于目標機的操作系統(tǒng)。nLinux應(yīng)用程序編譯時,需要交叉編譯Gcc,而Gcc最終輸出的是匯編語言源程序。想要進一步編譯成我們所需要的機器代碼,需要引入一些新的工具,比如,匯編程序
9、等。Binutils工具集提供了一些這樣的工具。另外,對C語言而言,需要有相應(yīng)的函數(shù)庫支持C語言源程序的編譯。而在Linux中應(yīng)用最多的就是glibc 。GCC、Binutils和glibcngcc是Linux中最重要的軟件開發(fā)工具,是一組編譯工具的總稱。它是GNUC和C+的編譯程序。gcc編譯程序能將C、C+語言源程序、匯編程序化序和目標程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件的名字,gcc將生成一個名為a.out的文件。nBinutils是一套用來構(gòu)造和使用二進制的工具集,其中兩個最為關(guān)鍵的binutils是GNU鏈接器ld和GNU匯編程序as,這兩個工具是GNU工具鏈中的兩個完
10、整部分,通常是由Gcc前端進行驅(qū)動的。nglibc是提供系統(tǒng)調(diào)用和基本函數(shù)的 C 庫,比如open, malloc, printf等等。所有動態(tài)連接的程序都要共享它(除了kernel、bootload、和其它完全不用C庫的功能代碼),因此glibc的存在有利益小系統(tǒng)或嵌入系統(tǒng)縮減系統(tǒng)總代碼尺寸與存放空間。 實驗n內(nèi)容:編譯安裝交叉編譯器n相關(guān)源碼:binutils-2.19.tar.bz2 gcc-2.95.3.gz glibc -2.3.2.gz glibc-Linuxthreads-2.3.2.tar.gz Linux-2.6.10.gz patch-2.6.10-bk4.bz2Boot
11、Loader移植nBoot Loader功能nBoot Loader啟動流程n常見的幾種Boot LoadernU-Boot分析與移植U-Boot啟動代碼分析U-Boot移植過程U-Boot的燒寫n仿真器與JTAGBoot Loader功能nBoot Loader是系統(tǒng)加電后運行的第一段軟件代碼。通過這段代碼,我們可以初始化硬設(shè)備、建立內(nèi)存空間的映像圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。 Boot Loader啟動流程n操作系統(tǒng)的角度看,Boot Loader的總目標就是正確地調(diào)用內(nèi)核來執(zhí)行 n大多數(shù)Boot Loader都分為階段1和階段2
12、兩大部分 階段1實現(xiàn)依賴于CPU體系結(jié)構(gòu)的代碼 階段2實現(xiàn)一些復雜的功能 Boot Loader的第一階段nBoot Loader的階段1通常用匯編語言編寫,主要包括以下步驟:a. 硬件設(shè)備初始化。b. 為加載 Boot Loader 的 階段2 準備 RAM 空間。 c. 拷貝 Boot Loader 的 階段2 到 RAM 空間中。 d. 設(shè)置好堆棧。 e. 跳轉(zhuǎn)到 階段2 的 C 入口點。 Boot Loader的第二階段nBoot Loader的階段2通常由C語言編寫,主要包括以下步驟:a. 初始化本階段要使用到的硬件設(shè)備。b. 檢測系統(tǒng)內(nèi)存映射(memory map)。 c. 將 k
13、ernel 映像和根文件系統(tǒng)映像從 flash 上讀到 RAM 空間中。 d. 為內(nèi)核設(shè)置啟動參數(shù)。e. 跳轉(zhuǎn)到內(nèi)核入口地址常見的Boot LoadernBLOB:最后版本為blob-2.0.5nArmboot:http:/ nRedboot:http:/ nBios-lt:http:/ U-BOOT源代碼結(jié)構(gòu):board:一些已有開發(fā)板相關(guān)的文件 common:與體系結(jié)構(gòu)無關(guān)的文件,實現(xiàn)各種命令的C文件 cpu:CPU相關(guān)文件 disk:disk驅(qū)動的分區(qū)處理代碼doc:說明文檔 drivers:通用設(shè)備驅(qū)動程序 fs:支持文件系統(tǒng)的文件 net:與網(wǎng)絡(luò)有關(guān)的代碼 lib_arm:與ARM體
14、系結(jié)構(gòu)相關(guān)的代碼tools:創(chuàng)建S-Record格式文件 和U-BOOT images的工具Include:頭文件和開發(fā)板配置文件,所有開發(fā)板的配置文件都在configs目錄下tools:存放制作S-Record或者U-Boot格式的映射等工具,例如mkimage U-Boot啟動代碼分析系統(tǒng)啟動后進入_start位置,這里是ARM異常向量表,發(fā)生異常情況時從這里跳轉(zhuǎn)到相應(yīng)的位置。上電的第一條指令是跳轉(zhuǎn)到reset復位處理程序: .globl _start_start: b resetldr pc, _undefined_instructionldr pc, _software_interru
15、ptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiqreset:/* 進入SVC模式 */#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit /* we do sys-critical inits */#endif#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate:.cpu_init_crit函數(shù)cpu_init_crit:/* 屏蔽所有中斷 */* 設(shè)置時鐘源,關(guān)閉除FFUART,SRAM,SD
16、RAM,FLASH以外的外設(shè)時鐘 */.#ifdef CFG_CPUSPEEDldr r0, CC_BASE /* 時鐘控制寄存器基址 */ldr r1, cpuspeed /* cpuspeed: .word CFG_CPUSPEED */str r1, r0, #CCCRmov r0, #2mcr p14, 0, r0, c6, c0, 0setspeed_done:#endif /* CFG_CPUSPEED */* 跳轉(zhuǎn)到lowlevel_init,這里ip即r12,用作暫存寄存器 */mov ip, lrbl lowlevel_initmov lr, ip/* Memory inte
17、rfaces are working. Disable MMU and enable I-cache. */ldr r0, =0 x2001 ./* 關(guān)閉MMU,使能I-Cache(可選) */mov pc, lr /* 這里是從cpu_init_crit返回到relocate標號 */relocate函數(shù)relocate: /* relocate U-Boot to RAM */adr r0, _start /* r0 - current position of code */ldr r1, _TEXT_BASE /* test if we run from flash or RAM */c
18、mp r0, r1 /* dont reloc during debug */beq stack_setupldr r2, _armboot_start /* 讀入_start到r2 */ldr r3, _bss_start /* 讀入_bss_start到r3 */sub r2, r3, r2 /* r2 - size of armboot */add r2, r0, r2 /* r2 Default kernel command string: noinitrd root=/dev/mtdblock2 init=/Linuxrc console=ttyS0,115200 修改Linuxrc
19、文件權(quán)限: 配置內(nèi)核時,指定命令行參數(shù)如下: 編輯Linuxrc文件:Busybox介紹n很多標準 Linux 工具都可以共享很多共同的元素。當這些工具被合并到一個可執(zhí)行程序中時,它們就可以共享這些相同的元素,這樣可以產(chǎn)生更小的可執(zhí)行程序。 nBusyBox 可以將大約 3.6MB 的工具包裝成大約 200KB 大小。 配置Busyboxarmlocalhost busybox-1.1.3$ make menuconfig Busybox Settings - General Configuration - * Support for devfs Build Options - * Build
20、 BusyBox as a static binary (no shared libs) /* 將busybox 編譯為靜態(tài)連接,少了啟動時找動態(tài)庫的麻煩 */ * Do you want to build BusyBox with a Cross Compiler? (/usr/local/arm/3.3.2/bin/arm-Linux-) Cross Compiler prefix /* 指定交叉編譯工具路徑 */ Init Utilities - * init * Support reading an inittab file /* 支持init 讀取/etc/inittab 配置文件,
21、一定要選上 */ Shells - Choose your default shell (ash) - * ash/* (X) ash 選中ash ,這樣生成的時候才會生成bin/sh 文件 * 看看我們前頭的Linuxrc 腳本的頭一句: * #!/bin/sh 是由bin/sh 來解釋執(zhí)行的 */ 從http:/ - * cp * cat * ls * mkdir * echo (basic SuSv3 version taking no options) * env * mv * pwd * rm * touch Editors - * vi Linux System Utilities
22、 - * mount * umount * Support loopback mounts * Support for the old /etc/mtab file Networking Utilities - * inetd armlocalhost busybox-1.1.3$ make TARGET_ARCH=arm CROSS=arm-Linux- PREFIX=/home/arm/dev_home/rootfs/my_rootfs/ all install 編譯并安裝 Busybox:TinyLogin介紹nTinyLogin 是一套 tiny UNIX 實用程序,它用于登錄嵌入式系
23、統(tǒng)、接受其驗證身份、為其修改密碼,并 能維護其用戶和用戶組。 nTinyLogin 非常小,對嵌入式系統(tǒng)上的 BusyBox 是極好的補充。TinyLogin移植n從網(wǎng)站http:/ 下載tinylogin-1.4 到/tmp目錄當中n修改tinyLogin 的Makefile:n編譯并安裝armlocalhost tinylogin-1.4$ vi Makefile 修改記錄如下: 指明靜態(tài)編譯,不連接動態(tài)庫 DOSTATIC = true 指明tinyLogin 使用自己的算法來處理用戶密碼 USE_SYSTEM_PWD_GRP = false USE_SYSTEM_SHADOW = fa
24、lse rootlocalhost tinylogin-1.4# make CROSS=arm-Linux- PREFIX=/home/arm/dev_home /rootfs/my_rootfs all install 根文件系統(tǒng)相關(guān)配置文件 npasswdnshadowngroupnprofilenfstabcramfs壓縮包ncramfs是一個壓縮式的文件系統(tǒng),它并不需要一次性地將文件系統(tǒng)中的所有內(nèi)容都解壓縮到內(nèi)存之中,而只是在系統(tǒng)需要訪問某個位置的數(shù)據(jù)的時侯,馬上計算出該數(shù)據(jù)在cramfs中的位置,將其實時地解壓縮到內(nèi)存之中,然后通過對內(nèi)存的訪問來獲取文件系統(tǒng)中需要讀取的數(shù)據(jù)。n從網(wǎng)站
25、http:/prdownloads. cramfs包:armlocalhost $mkcramfs my_rootfs my_rootfs.cramfs 燒寫根文件系統(tǒng)應(yīng)用程序開發(fā)nLCD驅(qū)動移植nCF卡驅(qū)動移植nUSB主控接口驅(qū)動移植n應(yīng)用程序開發(fā)實例安裝圖形化開發(fā)工具應(yīng)用程序的實現(xiàn)多媒體播放系統(tǒng)nLinux啟動成功之后,我們就可以進行嵌入式應(yīng)用程序開發(fā)了。本實例我們要開發(fā)的是一個嵌入式多媒體播放系統(tǒng)。系統(tǒng)通過USB接口或CF卡接口讀取視頻數(shù)據(jù),通過視頻譯碼,在LCD屏上顯示,實現(xiàn)一個多媒體播放功能n由于應(yīng)用中需要使用LCD和USB、CF卡接口,所以必須先安裝這幾個部分的驅(qū)動。 LCD驅(qū)動n
26、本實驗中所采用的PXA255開發(fā)板使用的LCD屏幕是640 x480像素的TFT顯示屏, Linux內(nèi)核已經(jīng)提供了PXA LCD驅(qū)動,只需在內(nèi)核配置菜單的device drivers-graphic support中選擇PXA FRAMEBUFFER SOPPORT來支持PXA的LCD即可。n然后需要在xhyper255.c中定義lcd的工作模式static struct pxafb_mach_info xhyper255_pxafb_mach_info = .num_modes = 1, .modes = &xhyper255_pxafb_mode_info, .lccr0 = LCD_LC
27、CR0, .lccr3 = LCD_LCCR3, .pxafb_lcd_power = &xhyper255_lcd_power, .pxafb_backlight_power = &xhyper255_pxafb_backlight_on;CF卡驅(qū)動n在Linux系統(tǒng)下,由于CF卡與PCMCIA設(shè)備控制器兼容,通常把CF卡當作PC Card設(shè)備進行驅(qū)動和管理。PCMCIA的插槽驅(qū)動和PC卡驅(qū)動與硬件直接相關(guān),是驅(qū)動移植中需要重新實現(xiàn)的部分。CF存儲卡的驅(qū)動可以直接使用標準的ATA/IDE設(shè)備驅(qū)動ide-cs模塊,因此在CSB226平臺上驅(qū)動CF存儲卡,只需要編寫PCMCIA控制器的驅(qū)動。nC
28、F卡驅(qū)動移植的主要工作就是實現(xiàn)pcmcia_low_level結(jié)構(gòu)體中底層平臺相關(guān)的5個接口函數(shù)。 struct pcmcia_low_level int (*init)(struct pcmcia_init *);/主要完成三個工作:執(zhí)行平臺相關(guān)的初始化任務(wù);設(shè)置所需要中斷信號的方向和邊緣觸發(fā)方式;注冊設(shè)備發(fā)現(xiàn)中斷與對應(yīng)的中斷處理函數(shù)。int (*shutdown)(void);/在卸載驅(qū)動時使用,用來釋放所申請的資源。 int (*socket_state)(struct pcmcia_state_array *);/設(shè)置插槽的初始化狀態(tài)信息,完成對輸入?yún)?shù)所包含的數(shù)據(jù)結(jié)構(gòu)struct p
29、cmcia_state賦值,需要根據(jù)實際插槽的狀態(tài)信息正確設(shè)置此數(shù)據(jù)結(jié)構(gòu)。 int (*get_irq_info)(struct pcmcia_irq_info *);/用來獲得每個插槽接口設(shè)備上的Ready中斷信號。 int (*configure_socket)(unsigned int, socket_state_t *);/由上層驅(qū)動調(diào)用,用來動態(tài)改變插槽的狀態(tài),比如工作電壓VCC、可程序設(shè)計電壓VPP等。 ;USB主控接口驅(qū)動n在 Linux kernel 源碼目錄driver/usb/usb-skeleton中,為我們提供了一個最基礎(chǔ)的 USB 設(shè)備驅(qū)動程序,我們稱為 USB框架。通過它我們僅需要修改極少的部分,就可以完成一個 USB 設(shè)備的驅(qū)動。nLinux USB 驅(qū)動程序需要做的第一件事情就是在 Linux USB 子系統(tǒng)里注冊,并提供一些相關(guān)信息。所有這些信息都傳送到 USB 子系統(tǒng)中,在USB骨架驅(qū)動程序中表示如下:static struct usb_driver sekl_driver=name:”skeleton”,/一個字符串,它對驅(qū)動程序進行描述probe:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度金融科技平臺技術(shù)服務(wù)合同范本2篇
- 2024房產(chǎn)異業(yè)聯(lián)盟合作合同樣本版B版
- 2024年跨境電商商鋪租賃及運營合同3篇
- 2024年美食制作合作協(xié)議2篇
- 2024年度客運站聘用班車司機勞動合同(升級版)3篇
- 2024日照房屋租賃合同
- 三方商業(yè)地產(chǎn)轉(zhuǎn)租條款:正式協(xié)議版A版
- 2024年鏟車油料供應(yīng)與回收合同
- 2024購車所需民間借款合同
- 2024年限酒店前臺接待工作人員協(xié)議版
- 0的認識和加、減法(說課稿)-2024-2025學年一年級上冊數(shù)學人教版(2024)001
- 2025年廣西旅發(fā)南國體育投資集團限公司招聘高頻重點提升(共500題)附帶答案詳解
- 2024-2025學年銅官山區(qū)數(shù)學三年級第一學期期末調(diào)研試題含解析
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導材料之18:“7支持-7.1資源”(雷澤佳編制-2025B0)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導材料之17:“6策劃-6.6合作”(雷澤佳編制-2025B0)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導材料之16:“6策劃-6.5組織結(jié)構(gòu)”(雷澤佳編制-2025B0)
- 全國英語教師賽課一等獎七年級上冊(人教2024年新編)《Unit 7 Happy Birthday》教學設(shè)計
- 醫(yī)院安全生產(chǎn)治本攻堅三年行動實施方案
- 碳排放監(jiān)測技術(shù)
- 江西省2023-2024學年高二上學期期末教學檢測數(shù)學試題 附答案
- Python試題庫(附參考答案)
評論
0/150
提交評論