




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、.ARM嵌入式系統課程設計-MMC/SD卡驅動程序設計班級:通信1001學號:3100601023姓名: 趙翔指導老師:曹清華 課程設計時間:2013.6.24-2012.6.30江蘇大學目 錄第一章 引言1.1 課程設計目的1第二章 課程設計平臺構建與流程22.1 嵌入式系統開發平臺構建22.2 課程設計流程22.3 課程設計硬件結構與工作原理2第三章 Bootloader移植與下載43.1 源代碼安裝43.2 源代碼分析移植與編譯43.3 下載4第四章 Linux內核移植與下載64.1 Linux內核源代碼安裝64.2 Linux內核源代碼分析與移植64.3 Linux內核編譯與下載6第五
2、章 課程設計功能模塊驅動程序設計155.1 MMC/SD卡模塊注冊初始化:155.2設備文件操作接口定義155.3 MMC接口初始化165.4 GPIO初始化函數165.5 SD移除操作函數175.6讀數據塊操作185.7 寫數據塊操作19第六章 根文件系統建立與文件系統下載206.1 根文件系統分析206.2 文件系統映像文件生成216.3 文件系統下載226.4 功能模塊運行與調試23第七章 完成課堂上布置的三個思考題26第八章 課程設計總結與體會288.1 課程設計中遇到的問題以及解決方法288.2 總結和體會28 *;28第一章 引言1.1 課程設計目的1) 了解PXA27X微處理器G
3、PIO的功能2) 了解MMC卡驅動程序的架構及編程方法3) 掌握MMC卡的使用方法1.2 課程設計任務與要求1) 理解基于Linux的嵌入式系統交叉開發環境,對嵌入式系統的開發流程有詳細的了解;2) 掌握開發工具鏈的構建方法,能獨立進行系統開發操作;3) 掌握Linux的常用命令,在linux系統下能熟練的使用這些常用命令;4) 熟悉linux內核的知識以及原理,掌握定制Linux內核的方法;5) 基于Linux操作系統,以及XSBase270ARM實驗開發平臺一套,把MMC存儲卡掛載目標板上并進行文件的復制操作。第二章 課程設計平臺構建與流程2.1 嵌入式系統開發平臺構建1) 裝有Linux
4、操作系統的PC機一臺;2) XSBase270 ARM實驗開發平臺一套3) MMC存儲卡一塊2.2 課程設計流程1)Bootloader移植與下載2)Linux內核移植與下載3) 功能模塊程序設計與交叉編譯4)根文件系統建立與文件系統下載2.3 課程設計硬件結構與工作原理1)目標板的MMC卡硬件接口目標板的MMC/SD卡的硬件接口如圖1.1所示,根據PXA27x的MMC/SD/SDIO控制器的信號功能以及PXA27x的GPIO的功能分配,命令控制線MMCMD與GPIO112相連,此時引腳GPIO112必須配置成轉換功能1(Alternate Function 1)的輸入或輸出方式(具體參考PX
5、A27X開發手冊),時鐘端MMCLK利用了通用IO口GPIO32轉換功能1輸出方式,4位總線MMDAT0到MMDAT3分別與GPIO111、GPIO110、GPIO109和GPIO92相連,都時使用了通用IO口的轉換功能1的輸入或輸出方式。圖1.2為MMC/SD卡的供電電路圖。圖1.1 目標板的MMC/SD卡的硬件接口圖1.2 MMC/SD卡的供電電路圖2) PXA270的MMC/SD/SDIO控制器 PXA270的MMC/SD/SDIO控制器在訪問PXA270處理器的軟件與MMC存儲堆和支持MMC、SD及SDIO通信協議之間充當聯結作用。PXA27x的MMC控制器協議規范遵守多媒體卡系統規范
6、V3.2(MultiMediaCard System Specification Version 3.2);MMC/SD/SDIO控制器采用標準的MMC傳輸協議或串行通信接口SPI協議模式。訪問PXA270的軟件使用MMC傳輸協議或SPI模式作為與MMC控制器通信的協議。目標板的SD驅動程序采用了MMC通信傳輸協議。3)MMC卡的通信協議主機與MMC卡的所有通信都是由主機發起,主機發出廣播和點對點兩種類型通信命令,在廣播通信命令中,主機發出的命令被所有的卡接受,只有部分命令需要響應;而在點對點通信命令中,命令被發送到具體地址的卡中,并由該卡對所接受的命令做出響應。第三章 Bootloader移
7、植與下載3.1 源代碼安裝先將D:emdorEELiod_V4_SDK目錄下的Linux-2.4復制到虛擬機里root的主文件夾中,然后用如下指令進行解壓:利用上述命令解壓后,bootloader源代碼解壓到當前目錄中Boot-XSBase270文件夾中。3.2 源代碼分析移植與編譯在解壓的目錄里進行make 編譯。rootlocalhost BootLoader$ cd Boot-XSBase270rootubuntu:Boot-XSBase270# make clean rootlocalhost Boot-XSBase270$make編譯完成后, 在當前目錄下會生成bootloader
8、映象文件boot。3.3 下載 打開實驗臺電源,啟動H-JTAG 和H-Flasher,在H-Flasher 中裝載配置文件pxa270.hfc,點擊Programming中的Check,Scr File 選擇D:emdorEELiod_V4_SDK Linux-2.4images中的boot 文件,點擊Program,燒寫成功后點擊 Verify 校驗。第四章 Linux內核移植與下載4.1 Linux內核源代碼安裝內核解壓4.2 Linux內核源代碼分析與移植Linux提供三個不同的命令進行Linux的配置,效果完全一樣:make config 控制臺命令行方式配置命令make menuc
9、onfig 文本菜單方式配置命令make xconfig X窗口圖形界面方式配置命令其他部分命令:Make mrproper 命令清除所有的舊的配置和舊的編譯目標文件等。Make dep 命令搜索Linux編譯輸出與源代碼之間的依賴關系、并生成依賴文件。Make clean 清除以前構造內核時生成的所有目標文件、模塊文件和臨時文件。Make zImage 編譯Linux內核,生成壓縮的內核映像文件。4.3 Linux內核編譯與下載1)內核解壓2)內核配置Linux針對MMC/SD內核配置的步驟:(1) 在主菜單下選擇Loadable module support ->* Enable L
10、oadable moduLe Support利用模塊可將不常用的設備驅動或功能作為模塊放在內核外部,必要時動態地調用。操作結束后從內存中刪除,這樣可以有效地使用內存,同時也可減小了內核的大小。模塊可以自行編譯并具有獨立的功能,即使需要改變模塊的功能,也不用對整個內核進行修改。文件系統,設備驅動,二進制格式等很多功能都支持模塊。一定要選擇*。(按空格鍵) Set version information on all Symbols for modules利用這個功能能夠讓內核使用其它內核版本模塊或沒有包含在此 kernel 的特殊的模塊。一般選擇N。* Kernel module Loader這
11、個設置使kernel 對模塊處于常備狀態。在不使用Insmod 或rmmod 命令情況下,kernel 程序自動將需要執行的模塊調用到內存中,一定時間內不使用該模塊時自動將其從內存刪除,一般要選擇*。(2) 再回到主菜單下選擇General setup >選擇“Support for hot-pluggable devices” , 出現“MMC/SD device drivers”:點擊“MMC/SD device drivers”,進入下一頁選擇:用向下的箭頭,選擇 Load an Alternae Configuration File 選項,輸入配置文件名 archarmdefco
12、nfigsxsbase270,退出并保存。2)配置完成后,重新編譯內核,需要輸入以下指令:生成的zImage存放路徑為:將zImage拷貝到tftpboot文件夾下:3)內核燒寫重新打開一個終端,輸入命令:rootubuntu:# minicom然后重啟開發板電源,看到 Boot 啟動信息后按任意鍵啟動Boot 的 Operation Menu,我們需要用這個boot 內嵌工具下載內核。然后再提示信息 Please enter your selection 后面輸入2,獲取本地IP 地址:可以看到Operation Menu 菜單上方顯示:My ip address is 192.168.0.
13、50,則表示板載Linux 與Ubuntu 服務器連接成功。輸入 3,下載內核文件 ZImage(在Ubuntu 的文件系統的/tftpboot/目錄中)下載成功后選擇4,燒寫內核。第五章 課程設計功能模塊驅動程序設計5.1 MMC/SD卡模塊注冊初始化:static int _devinit mmc_pxa_module_init( void ) int ret = -ENODEV;#ifdef CONFIG_ARCH_RAMSESRAMSES_MMC_ON();udelay(1000);#endifhost = mmc_register( MMC_REG_TYPE_HOST, &p
14、xa_mmc_controller_tmpl_rec,sizeof( pxa_mmc_hostdata_rec_t ) );/register the SD device if ( !host ) MMC_DEBUG( MMC_DEBUG_LEVEL0, "failed to register with MMC coren" );goto error;ret = 0;error:return ret;5.2設備文件操作接口定義static mmc_controller_tmpl_rec_t pxa_mmc_controller_tmpl_rec = owner:THIS_M
15、ODULE,name:"PXA250",block_size_max:PXA_MMC_BLKSZ_MAX,nob_max:PXA_MMC_NOB_MAX,probe:pxa_mmc_probe,init:pxa_mmc_init,remove:_devexit_p( pxa_mmc_remove ),update_acq:pxa_mmc_update_acq,init_card_stack:pxa_mmc_init_card_stack,check_card_stack:pxa_mmc_check_card_stack,setup_card:pxa_mmc_setup_ca
16、rd,stream_read:pxa_mmc_stream_read,read_block:pxa_mmc_read_block,read_mblock:pxa_mmc_read_mblock,stream_write:pxa_mmc_stream_write,write_block:pxa_mmc_write_block,write_mblock:pxa_mmc_write_mblock;5.3 MMC接口初始化static int pxa_mmc_init( mmc_controller_t ctrlr )int ret = -ENODEV;pxa_mmc_hostdata_t hostd
17、ata = (pxa_mmc_hostdata_t)ctrlr->host_data;/* 1. allocate buffer */hostdata->iobuf.iodata = kmalloc( PXA_MMC_IODATA_SIZE, GFP_ATOMIC );/2Kif ( !hostdata->iobuf.iodata ) ret = -ENOMEM;goto error;/* 2. initialize iobuf */hostdata->iobuf.blksz = PXA_MMC_BLKSZ_MAX;/* current block size in by
18、tes 1024* /hostdata->iobuf.bufsz = PXA_MMC_IODATA_SIZE;/* buffer size for each transfer */hostdata->iobuf.nob = PXA_MMC_BLOCKS_PER_BUFFER;/* number of blocks */* 3 request irq */if ( request_irq( IRQ_MMC, pxa_mmc_irq, 0, "MMC", ctrlr ) ) MMC_ERROR( "failed to request IRQ_MMCn&qu
19、ot; );goto error;/* 4 init GPIO about MMC/SD/SDIO*/ init_gpio( ); CKEN |= CKEN12_MMC; /* enable MMC unit clock */ret = 0;goto out;error:kfree( hostdata->iobuf.iodata );out:return ret; 5.4 GPIO初始化函數static void init_gpio(void) GPCR1 |= 0x1;/clear pin32 GPDR1 = GPDR1 | (1<<0);/config pin32 as
20、output GAFR1_L = (GAFR1_L&0xfffffffc) | (2<<0);/) pin32 is used for function 2->MMCLK /MMDAT0 PIN92 GPSR2 |= 0x10000000;/pin92 configured as an output, set pin level high (one). GPDR2 |= 0x10000000;/pin92 as output / GPDR2 = GPDR2 & (1<<28) ; GAFR2_U = (GAFR2_U & 0xfcfffff
21、f) | (1<<24) ;/pin32 is used for function 1->MMDAT<0> /MMDAT1 PIN109 GPSR3 |= (1<<13); GPDR3 |= (1<<13); GAFR3_L = (GAFR3_L & 0xf3ffffff) | (1<<26) ; /MMDAT2 PIN110 GPSR3 |= (1<<14); GPDR3 |= (1<<14); GAFR3_L = (GAFR3_L & 0xcfffffff) | (1<<2
22、8); /MMDAT3 PIN111 GPSR3 |= (1<<15); GPDR3 |= (1<<15); GAFR3_L = (GAFR3_L & 0x3fffffff) | (1<<30); /MMCMD PIN112 GPSR3 |= 0x00010000; GPDR3 |= 0x00010000; /GPDR3 = GPDR3 & (1<<16); GAFR3_U = (GAFR3_U & 0xfffffffc) | (1<<0); /function1 GPSR3 |= 0x0000e000;/PI
23、N111-PIN109 GPDR3 |= 0x0000e000; GAFR3_L = (GAFR3_L & 0x03ffffff) | 0x54000000;5.5 SD移除操作函數/remove the MMC then free system resourcestatic void pxa_mmc_remove( mmc_controller_t ctrlr )pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data;kfree( hostdata->iobuf.iodata ); /* 1)
24、free buffer(s) */free_irq( IRQ_MMC, ctrlr ); /* 1) release irq */CKEN &= CKEN12_MMC; /* disable MMC unit clock */5.6讀數據塊操作static int pxa_mmc_read_block( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer )int ret = -ENODEV;u16 argh = 0UL, argl = 0UL;/* send CMD16 (SET_BLOCK_LEN) when reque
25、sted block size is not the default * for the current card */ if ( transfer->blksz != ctrlr->stack.selected->info.read_bl_len ) argh = transfer->blksz >> 16;argl = transfer->blksz;if ( (ret = pxa_mmc_stop_bus_clock( ctrlr ) ) goto error;MMC_CMD = CMD(16); /* SET_BLOCK_LEN */MMC_A
26、RGH = argh;MMC_ARGL = argl;MMC_CMDAT = MMC_CMDAT_R1;MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD16(0x%04x%04x)n", argh, argl );if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE ) )goto error; /* CMD17 (READ_SINGLE_BLOCK) */argh = transfer->addr >> 16;argl = transfer->addr;if ( (ret =
27、 pxa_mmc_stop_bus_clock( ctrlr ) )goto error;MMC_CMD = CMD(17); /* READ_SINGLE_BLOCK */MMC_ARGH = argh; MMC_ARGL = argl;MMC_CMDAT=MMC_CMDAT_R1|MMC_CMDAT_READ|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN ;MMC_NOB = 1;MMC_BLKLEN = transfer->blksz;MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD17(0x%04x%04x)n", ar
28、gh, argl );if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE ) )goto error;/* transfer the data to the caller supplied buffer */if ( (ret = pxa_mmc_read_buffer( ctrlr, transfer->blksz ) < 0 ) /transfer->blksz goto error;if ( (ret = pxa_mmc_copy_from_buffer( ctrlr, transfer->type, tr
29、ansfer->buf, ret ) < 0 )goto error;transfer->buf += ret;transfer->cnt -= ret;transfer->nob -= 1;pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO );if ( (ret = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode ) )goto error;ret = 0; error:return ret;5.7 寫數據塊操作static int pxa_m
30、mc_write_block( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer )int ret = -ENODEV;u16 argh = 0UL, argl = 0UL;/* send CMD16 (SET_BLOCK_LEN) when requested block size is not the default * for the current card */ if ( transfer->blksz != ctrlr->stack.selected->info.read_bl_len ) argh
31、= transfer->blksz >> 16;argl = transfer->blksz;if ( (ret = pxa_mmc_stop_bus_clock( ctrlr ) ) goto error;MMC_CMD = CMD(16); /* SET_BLOCK_LEN */MMC_ARGH = argh;MMC_ARGL = argl;MMC_CMDAT = MMC_CMDAT_R1 ;MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD16(0x%04x%04x)n", argh, argl );if ( (ret = px
32、a_mmc_complete_cmd( ctrlr, MMC_R1, FALSE ) )goto error; /* CMD24 (WRITE_SINGLE_BLOCK) */argh = transfer->addr >> 16;argl = transfer->addr;if ( (ret = pxa_mmc_stop_bus_clock( ctrlr ) )goto error; MMC_CMD = CMD(24); /* WRITE_BLOCK */MMC_ARGH = argh;MMC_ARGL = argl;MMC_CMDAT=MMC_CMDAT_R1|MM
33、C_CMDAT_WRITE|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN;MMC_NOB = 1;MMC_BLKLEN = transfer->blksz; MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD24(0x%04x%04x)n", argh, argl );if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE ) )goto error; /* transfer the data to the caller supplied buffer */if ( (ret
34、= pxa_mmc_copy_to_buffer( ctrlr, transfer->type, transfer->buf, transfer->cnt ) < 0 )goto error;if ( (ret = pxa_mmc_write_buffer( ctrlr, ret ) < 0 )goto error;transfer->buf += ret;transfer->cnt -= ret;transfer->nob -= 1;pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO );if ( (ret
35、 = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode ) )goto error;ret = 0; error:return ret;第六章 根文件系統建立與文件系統下載6.1 根文件系統分析1)EXT文件系統Ext2fs是Linux的標準文件系統,它已經取代了擴展文件系統(或 Extfs)。擴展文件系統Extfs支持的文件大小最大為2 GB,支持的最大文件名稱大小為255個字符,而且它不支持索引節點(包括數據修改時間標記)。2)NFS文件系統 NFS是一個RPC service ,它是由SUN公司開發,并于198
36、4年推出。NFS文件系統能夠使文件實現共享,它的設計是為了在不同的系統之間使用,所以NFS文件系統的通信協議設計與作業系統無關。當使用者想使用遠端文件時只要用“mount”命令就可以把遠端文件系統掛載在自己的文件系統上,使遠端的文件在使用上和本地機器的文件沒有區別。NFS的具體配置可參考實驗一的網絡文件系統nfs的配置。3)JFFS2文件系統 JFFS文件系統是瑞典Axis通信公司開發的一種基于Flash的日志文件系統,它在設計時充分考慮了Flash的讀寫特性和電池供電的嵌入式系統的特點,在這類系統中必需確保在讀取文件時,如果系統突然掉電,其文件的可靠性不受到影響。 對Red Hat的Davi
37、e Woodhouse進行改進后,形成了JFFS2。主要改善了存取策略以提高FLASH的抗疲勞性,同時也優化了碎片整理性能,增加了數據壓縮功能。需要注意的是,當文件系統已滿或接近滿時,JFFS2會大大放慢運行速度。這是因為垃圾收集的問題。相對于EXT2fs而言,JFFS2在嵌入式設備中更受歡迎。6.2 文件系統映像文件生成1)文件系統安裝與busybox 的編譯 將 D:emdorEELiod_V4_SDKLinux-2.4Filesystem 中的內容復制E:share 中,再Ubuntu 中從共享目錄中復制到/tmp/中,然后將文件系統壓縮包解壓:可以建立一個小的應用程序,將其復制到文件系統的某個目錄中。2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 有用公司職工辭職報告(4篇)
- 畢業旅游后心得總結600字(4篇)
- 物理學力學知識點解析卷
- 實習護士工作總結報告(15篇)
- 小學語文教育論文范文3000字
- 垃圾中轉站裝備項目投資風險評估報告
- 2025年中小學教師資格考試題及答案
- 地基贈與合同(4篇)
- 2025年網頁設計與用戶體驗研究能力的考試試卷及答案
- 水利施工建設合同書(4篇)
- 中國絲綢簡述ppt課件
- 蘇軾《浣溪沙》優秀課件
- 塑料包裝袋購銷合同
- 生產良率系統統計表
- 代理機構服務質量考核評價表
- 淺談打擊樂器在小學低段音樂課堂中的運用
- 2018年瀘州市生物中考試題含答案
- S7、S9、S11系列變壓器損耗表
- 消防電氣檢驗批質量驗收記錄表
- 品控員作業指導書
- 醫療器械質量手冊含程序文件
評論
0/150
提交評論