MMCSD卡驱动程序设计(通信10123赵翔)

上传人:仙*** 文档编号:59441045 上传时间:2022-03-03 格式:DOCX 页数:30 大小:2.57MB
返回 下载 相关 举报
MMCSD卡驱动程序设计(通信10123赵翔)_第1页
第1页 / 共30页
MMCSD卡驱动程序设计(通信10123赵翔)_第2页
第2页 / 共30页
MMCSD卡驱动程序设计(通信10123赵翔)_第3页
第3页 / 共30页
点击查看更多>>
资源描述
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第五章 课程设计功能模块驱动程序设计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 27第一章 引言1.1 课程设计目的1) 了解PXA27X微处理器GPIO的功能2) 了解MMC卡驱动程序的架构及编程方法3) 掌握MMC卡的使用方法1.2 课程设计任务与要求1) 理解基于Linux的嵌入式系统交叉开发环境,对嵌入式系统的开发流程有详细的了解;2) 掌握开发工具链的构建方法,能独立进行系统开发操作;3) 掌握Linux的常用命令,在linux系统下能熟练的使用这些常用命令;4) 熟悉linux内核的知识以及原理,掌握定制Linux内核的方法;5) 基于Linux操作系统,以及XSBase270ARM实验开发平台一套,把MMC存储卡挂载目标板上并进行文件的复制操作。第二章 课程设计平台构建与流程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必须配置成转换功能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、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卡的所有通信都是由主机发起,主机发出广播和点对点两种类型通信命令,在广播通信命令中,主机发出的命令被所有的卡接受,只有部分命令需要响应;而在点对点通信命令中,命令被发送到具体地址的卡中,并由该卡对所接受的命令做出响应。第三章 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 rootlocalhost 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提供三个不同的命令进行Linux的配置,效果完全一样: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) 在主菜单下选择Loadable module support -* Enable Loadable moduLe Support利用模块可将不常用的设备驱动或功能作为模块放在内核外部,必要时动态地调用。操作结束后从内存中删除,这样可以有效地使用内存,同时也可减小了内核的大小。模块可以自行编译并具有独立的功能,即使需要改变模块的功能,也不用对整个内核进行修改。文件系统,设备驱动,二进制格式等很多功能都支持模块。一定要选择*。(按空格键) Set version information on all Symbols for modules利用这个功能能够让内核使用其它内核版本模块或没有包含在此 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 Configuration File 选项,输入配置文件名 archarmdefconfigsxsbase270,退出并保存。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.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, &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_controller_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_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_controller_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 );/2Kif ( !hostdata-iobuf.iodata ) ret = -ENOMEM;goto error;/* 2. initialize iobuf */hostdata-iobuf.blksz = PXA_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( failed 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);/config 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 |= (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 & (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 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, FALSE ) )goto error; /* CMD17 (READ_SINGLE_BLOCK) */argh = transfer-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( MMC_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, transfer-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 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 = 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, 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|MMC_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 = pxa_mmc_copy_to_buffer( ctrlr, transfer-type, transfer-buf, transfer-cnt ) 0 )goto error;if ( (ret = pxa_mmc_write_buffer( ctrlr, 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;第六章 根文件系统建立与文件系统下载6.1 根文件系统分析1)EXT文件系统Ext2fs是Linux的标准文件系统,它已经取代了扩展文件系统(或 Extfs)。扩展文件系统Extfs支持的文件大小最大为2 GB,支持的最大文件名称大小为255个字符,而且它不支持索引节点(包括数据修改时间标记)。2)NFS文件系统 NFS是一个RPC service ,它是由SUN公司开发,并于1984年推出。NFS文件系统能够使文件实现共享,它的设计是为了在不同的系统之间使用,所以NFS文件系统的通信协议设计与作业系统无关。当使用者想使用远端文件时只要用“mount”命令就可以把远端文件系统挂载在自己的文件系统上,使远端的文件在使用上和本地机器的文件没有区别。NFS的具体配置可参考实验一的网络文件系统nfs的配置。3)JFFS2文件系统 JFFS文件系统是瑞典Axis通信公司开发的一种基于Flash的日志文件系统,它在设计时充分考虑了Flash的读写特性和电池供电的嵌入式系统的特点,在这类系统中必需确保在读取文件时,如果系统突然掉电,其文件的可靠性不受到影响。 对Red Hat的Davie Woodhouse进行改进后,形成了JFFS2。主要改善了存取策略以提高FLASH的抗疲劳性,同时也优化了碎片整理性能,增加了数据压缩功能。需要注意的是,当文件系统已满或接近满时,JFFS2会大大放慢运行速度。这是因为垃圾收集的问题。相对于EXT2fs而言,JFFS2在嵌入式设备中更受欢迎。6.2 文件系统映像文件生成1)文件系统安装与busybox 的编译 将 D:emdorEELiod_V4_SDKLinux-2.4Filesystem 中的内容复制E:share 中,再Ubuntu 中从共享目录中复制到/tmp/中,然后将文件系统压缩包解压:可以建立一个小的应用程序,将其复制到文件系统的某个目录中。2)制作JFFS2 文件映像确认已将将光盘的 filesystem 下的mkfs.jffs2 和mkrootfs.sh 拷贝到buybox 下返回到 busybox 的根目录下,运行命令mkfs.jffs2 # ./mkfs.jffs2 -o rootfs270.img -e 0x40000 -r _install -p -l生成映像文件rootfs270.img,拷贝到/tftpboot中烧写到flash中,启动后运行结果。或者运行# ./mkrootfs.sh 也可生成文件系统的映像文件。 6.3 文件系统下载参照嵌入式系统实验五6.4 功能模块运行与调试可以按照以下步骤对MMC卡的驱动程序进行测试:重新打开一个终端,输入minicom,开发板启动后,将MMC存储卡插入MMC/SD卡插槽中,输入下面的指令:首先在根目录下创建一个名为“sd”的文件夹,然后进入dev文件夹,红框标注的为需要用的文件:再利用mount命令挂载MMC卡,现在就可以看到MMC卡里面的内容了:可以对MMC卡里的内容进行读、写、复制等操作:第七章 完成课堂上布置的三个思考题1)实验过程中用到的软件,它们之间的关系是怎么样的?答:VMware Player软件是用来打开了LINUX系统,实现文件的解压、生成、复制以及对实验板的设置与烧写。H-JTAG软件是检测是否连接到实验板以及所连接的型号并对实验板进行boot文件的烧写与校验。两个软件都是对实验板进行烧写、修改设置等操作,VMware Player更加强大,功能更加全面,但是H-JTAG是不可代替的2)实验过程中用到的主要硬件设备有哪些?答:装有Linux操作系统的PC机一台;XSBase270 ARM实验开发平台一套;MMC存储卡一块3) 软件的界面表明进入哪个环境答:答:首先是Window的桌面,打开VMware Player软件,进入Ubuntu系统。打开终端并输入minicom 命令、重启实验板后进入51Board,开始对SD卡挂载。上图为Linux系统的桌面 上图为Linux系统的调制终端第八章 课程设计总结与体会8.1 课程设计中遇到的问题以及解决方法AXD出现灰屏现象,重启电脑后可以解决。内核配置时输入配置文件名 archarmdefconfigsxsbase270无反应,直接输入xbase270可解决IP获取不成功,重启电脑8.2 总结和体会 这次课程设计做的比较顺利,让我学会了一些硬件和软件的使用,比如VMware PlayerH-JTAG、XSBase270、ARM实验开发平台等,熟悉了Linux的应用开发,了解了一些指令的功能。再熟悉以往的实验内容的基础上有增加了新的挑战,使得我对以往的实验原理及步骤更加了解并且能够融会贯通,虽然在中间出现了一些问题,但是通过与同学的讨论以及对网络的使用,很好的解决了问题。而问题的解决使得我对嵌入式系统的了解更加深入,激起了我对嵌入式开发的兴趣。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!