ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:2.54MB ,
资源ID:3526172      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3526172.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MMCSD卡驱动程序设计40通信10123赵翔41.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MMCSD卡驱动程序设计40通信10123赵翔41.docx

1、MMCSD卡驱动程序设计40通信10123赵翔41ARM嵌入式系统课程设计-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 Li

2、nux内核源代码分析与移植 64.3 Linux内核编译与下载 6第五章 课程设计功能模块驱动程序设计 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 课程设计中遇到地问题以及解决方法

3、 288.2 总结和体会 28第一章 引言1.1 课程设计目地1) 了解PXA27X微处理器GPIO地功能2) 了解MMC卡驱动程序地架构及编程方法3) 掌握MMC卡地使用方法1.2 课程设计任务与要求1) 理解基于Linux地嵌入式系统交叉开发环境,对嵌入式系统地开发流程有详细地了解;2) 掌握开发工具链地构建方法,能独立进行系统开发操作;3) 掌握Linux地常用命令,在linux系统下能熟练地使用这些常用命令;4) 熟悉linux内核地知识以及原理,掌握定制Linux内核地方法;5) 基于Linux操作系统,以及XSBase270ARM实验开发平台一套,把MMC存储卡挂载目标板上并进行文

4、件地复制操作.第二章 课程设计平台构建与流程2.1 嵌入式系统开发平台构建1) 装有Linux操作系统地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

5、必须配置成转换功能1(Alternate Function 1)地输入或输出方式(具体参考PXA27X开发手册),时钟端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、

6、SD及SDIO通信协议之间充当联结作用.PXA27x地MMC控制器协议规范遵守多媒体卡系统规范V3.2(MultiMediaCard System Specification Version 3.2);MMC/SD/SDIO控制器采用标准地MMC传输协议或串行通信接口SPI协议模式.访问PXA270地软件使用MMC传输协议或SPI模式作为与MMC控制器通信地协议.目标板地SD驱动程序采用了MMC通信传输协议.3)MMC卡地通信协议主机与MMC卡地所有通信都是由主机发起,主机发出广播和点对点两种类型通信命令,在广播通信命令中,主机发出地命令被所有地卡接受,只有部分命令需要响应;而在点对点通信命令

7、中,命令被发送到具体地址地卡中,并由该卡对所接受地命令做出响应.第三章 Bootloader移植与下载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 rootlocalhos

8、t Boot-XSBase270$make编译完成后, 在当前目录下会生成bootloader 映象文件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提供三个不同地命令进行Lin

9、ux地配置,效果完全一样:make config 控制台命令行方式配置命令make menuconfig 文本菜单方式配置命令make xconfig X窗口图形界面方式配置命令其他部分命令:Make mrproper 命令清除所有地旧地配置和旧地编译目标文件等.Make dep 命令搜索Linux编译输出与源代码之间地依赖关系、并生成依赖文件.Make clean 清除以前构造内核时生成地所有目标文件、模块文件和临时文件.Make zImage 编译Linux内核,生成压缩地内核映像文件.4.3 Linux内核编译与下载1)内核解压2)内核配置Linux针对MMC/SD内核配置地步骤:(1)

10、 在主菜单下选择Loadable module support -* Enable Loadable moduLe Support利用模块可将不常用地设备驱动或功能作为模块放在内核外部,必要时动态地调用.操作结束后从内存中删除,这样可以有效地使用内存,同时也可减小了内核地大小.模块可以自行编译并具有独立地功能,即使需要改变模块地功能,也不用对整个内核进行修改.文件系统,设备驱动,二进制格式等很多功能都支持模块.一定要选择*.(按空格键) Set version information on all Symbols for modules利用这个功能能够让内核使用其它内核版本模块或没有包含在此

11、kernel 地特殊地模块.一般选择N.* Kernel module Loader这个设置使kernel 对模块处于常备状态.在不使用Insmod 或rmmod 命令情况下,kernel 程序自动将需要执行地模块调用到内存中,一定时间内不使用该模块时自动将其从内存删除,一般要选择*.(2) 再回到主菜单下选择General setup 选择“Support for hot-pluggable devices” , 出现“MMC/SD device drivers”:点击“MMC/SD device drivers”,进入下一页选择:用向下地箭头,选择 Load an Alternae Con

12、figuration File 选项,输入配置文件名 archarmdefconfigsxsbase270,退出并保存. 2)配置完成后,重新编译内核,需要输入以下指令:生成地zImage存放路径为:将zImage拷贝到tftpboot文件夹下: 3)内核烧写 重新打开一个终端,输入命令:rootubuntu:# minicom然后重启开发板电源,看到 Boot 启动信息后按任意键启动Boot 地 Operation Menu,我们需要用这个boot 内嵌工具下载内核.然后再提示信息 Please enter your selection 后面输入2,获取本地IP 地址:可以看到Operati

13、on Menu 菜单上方显示:My ip address is 192.168.0.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_RAMSES RAMSES_MMC_ON()。 udelay(1000)。#endif h

14、ost = mmc_register( MMC_REG_TYPE_HOST, &pxa_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_co

15、ntroller_tmpl_rec = owner: THIS_MODULE, 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

16、_card_stack, setup_card: pxa_mmc_setup_card, 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_controlle

17、r_t ctrlr ) int ret = -ENODEV。 pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr-host_data。/* 1. allocate buffer */ hostdata-iobuf.iodata = kmalloc( PXA_MMC_IODATA_SIZE, GFP_ATOMIC )。/2K if ( !hostdata-iobuf.iodata ) ret = -ENOMEM。 goto error。 /* 2. initialize iobuf */ hostdata-iobuf.blksz = P

18、XA_MMC_BLKSZ_MAX。 /* current block size in bytes 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( faile

19、d to request IRQ_MMCn )。 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 | (10)。 /con

20、fig pin32 as output GAFR1_L = (GAFR1_L&0xfffffffc) | (2MMCLK /MMDAT0 PIN92 GPSR2 |= 0x10000000。/pin92 configured as an output, set pin level high (one). GPDR2 |= 0x10000000。/pin92 as output / GPDR2 = GPDR2 & (128) 。 GAFR2_U = (GAFR2_U & 0xfcffffff) | (1MMDAT /MMDAT1 PIN109 GPSR3 |= (113)。 GPDR3 |= (

21、113)。 GAFR3_L = (GAFR3_L & 0xf3ffffff) | (126) 。 /MMDAT2 PIN110 GPSR3 |= (114)。 GPDR3 |= (114)。 GAFR3_L = (GAFR3_L & 0xcfffffff) | (128)。 /MMDAT3 PIN111 GPSR3 |= (115)。 GPDR3 |= (115)。 GAFR3_L = (GAFR3_L & 0x3fffffff) | (130)。 /MMCMD PIN112 GPSR3 |= 0x00010000。 GPDR3 |= 0x00010000。 /GPDR3 = GPDR3 &

22、(116)。 GAFR3_U = (GAFR3_U & 0xfffffffc) | (1host_data。 kfree( hostdata-iobuf.iodata )。 /* 1) 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 tran

23、sfer ) 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 = transfer-blksz 16。 argl = transfer-blksz。 if ( (ret = pxa_mmc_stop_bus_clock

24、( 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 = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE ) ) goto error。 /* CMD17 (READ_SINGLE_BLOCK) */ argh = tran

25、sfer-addr 16。 argl = transfer-addr。 if ( (ret = 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( MM

26、C_DEBUG_LEVEL3, CMD17(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 = pxa_mmc_read_buffer( ctrlr, transfer-blksz ) blksz goto error。 if ( (ret = pxa_mmc_copy_from_buffer( ctrlr, transf

27、er-type, transfer-buf, ret ) 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_mmc_write_block( mmc_controller_t c

28、trlr, 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 = 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 = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FAL

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1