python 调用 硬件驱动程序_基于ReWorks 嵌入式系统平台构建SD卡驱动程序

本文详细介绍了在ReWorks嵌入式系统平台上如何构建SD卡驱动程序,涉及SD卡的操作流程、初始化过程以及读写过程。通过设备驱动程序设计,实现了对SD卡的读写操作,为控制系统提供了稳定的数据存储支持。
摘要由CSDN通过智能技术生成

SD 卡(Secure Digital Memory Card)是由日本松下、东芝及美国 SanDisk 公司于 1999 年 8 月在 MMC 卡(Multi Media Card)基础上共同研制而成的具有大容量、高性能、安全性好等特点的多功能存储卡。

由于 SD 卡通过 9 针的硬件接口与专门的驱动器接口相连接,不需要外接电源维持记忆信息,而且作为一体化固体介质,没有任何移动部件,所以不用担心机械移动带来的损坏。由于 SD 卡读/写速度快、移动灵活性好、安全性强,加之体积很小,SD 卡被广泛使用于嵌入式便携移动装置上作为嵌入式系统的数据存储设备,如:数码相机、PDA 和多媒体播放器等。SD 卡用于 ReWorks 嵌入式系统,必须要开发相应的驱动程序。

1 SD 卡操作流程

SD 卡具备 SPI 和 SD 两种总线模式,这两种模式下的卡的初始化过程和读/写过程各有特点,具体驱动程序的实现细节不同。SD 卡有 SD 和 SPI 两种通信模式,前者可获得比后者更高的通信速率。在 SD 模式下的总线协议类似于问答方式,先由主机向卡发送 CMD指令接着被寻址的卡做出响应,根据接收的主机指令的不同,响应帧内容和长度也不同,具体有 4 种 R1,R2,R3 和 R6,其中 R1,R3,R6 总长为 48 位,R2 总长为 136 位,响应帧格式如图 1 所示。帧传输总是以高位开始,低位结束。本文采用 SD 总线模式对 SD 卡进行操作。

d44ff5c7487d2efa10c2b0f3c3f3f321.png

1.1 SD 卡初始化过程

在对 SD 卡进行读/写操作前必须对卡进行初始化,在卡的初始化过程中所有的主机与卡的通信都只走命令接口。在识别模式下主机对卡进行软复位,由卡发布 RCA(Relative Card Address)地址,主机对其确认,此后主机用 RCA 地址对相应的卡进行操作。上电复位或者发送 CMD0 可使 SD 卡进入空闲模式(IdleState),总线激活后,在 SD 模式下应该用 CMD55(APP_CMD)命令(其中 RCA=0x0000)对卡进行操作,以使卡将下一指令解释为应用指令即 ACMD,再用 ACMD41(SD_SEND_OP_COND)对卡进行操作,卡对该指令的响应将记录在操作条件寄存器中,同时不兼容韵卡将进入非活动状态(Inactive State),此后主机发出 CMD2(ALL_SEND_CID)指令,获取卡的识别编码,获取识别码后,主机将发出 CMD3(SEND_RE-LATIVE_ADDR)指令获取 RCA 地址。以上为 SD 卡初始化的基本流程,此后主机将用 RCA 地址对卡进行读/写操作,SD 卡在 SD 模式下的初始化的详细状态转换图如图 2 所示。

1.2 SD 卡读/写过程

卡的读/写过程是主机通过 CMD 物理接口向卡发出相关指令,对卡进行读或者写操作,读和写操作都有单块和多块的区别,根据 SD 卡协议规范,在进行读/写操作之前,先发送 CMD16(SET_BLOCKLEN)命令来设置块大小。实现单块读和写操作分别用 CMD17(READ_SINGLE_BLOCK)和 CMD24(WRITE_BLOCK)命令,实现多块读和写操作分别用 CMD18(READ_MULTIPLE_BLOCK)和 CMD25(WRITE_MUL TIPLE_BLOCK)命令。主机和 SD 卡之间通过 FIFO 管道进行数据交换,因此读和写函数模块中且在数据交换之前,必须要对 FIFO 进行复位,通过对 S3C2440 的 SD 卡接口模块中的 SDI-FSTA 寄存器操作即可完成 FIFO 复位。在对卡读/写的过程中必须要注意在进行多块读和写操作完成后必须用 CMD12(STOP_TRANSMISSION)指令结束读/写操作,将卡转入传输状态(Transfer State)。

2 、ReWorks 平台 SD 卡设备驱动程序的设计

同其他操作系统一样 ReWorks 抽象了对设备的处理。所有的硬件设备都像常规文件一样看待,它们可以使用和操作文件相同的、标准的系统调用来打开、关闭和读/写。系统中的每一个设备都用一个设备文件代表。

在创建具体的 SD 卡设备之前必须要在内存区中开辟一块空间,实现形式为:dev_table=(SDCARD_DEV*)malloc(sizeof(SDCARD_DEV)*max_SD_devices);SDCARD_DEV 结构体包含了 block_device_operations 结构和 SD 卡相关属性,block_device_operations 结构体如下所示:

4ccc8001ba6acf39ee9319b053363330.png

该结构体对于块设备驱动程序来讲非常重要。因为用户进程通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如读/写等。ReWorks 中就是用 block_device_operations 这个关键的数据结构将系统调用和驱动程序关联起来的。

在该数据结构中每一个函数指针都对应了一个系统调用,用户进程利用系统调用在对设备文件进行诸如 read/write 操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。该结构体包含了块设备操作所需的函数接口和必要的设备属性。

空间开辟成功后,便向系统注册设备,实现形式为:register_block_driver(SD_MAJOR,max_SD_devices,(block_ops*)dev_table,sizeof(SDCARD_DEV),”SDdriver”,&ret_major);其实就是向系统设备表中写入相关信息,将上面开辟的 SDCARD_DEV 类型的内存空间和所要创建的块设备建立关联,再对 SDCARD_DEV 类型的内存空间进行必要的初始化,为下面创建 SD 卡块设备做好准备。

接下来便是创建 SD 卡设备。ReWorks 系统采用 mknod 创建块设备,并使用主(major)和次(minor)设备编号来描述设备。函数原型如下:

int mknod(const char*pathname,mode_t mode,dev_t dev);

其参数说明如表 1 所示。

79d06aa6201334a23ada0abd68850822.png

在实际开发中的实现形式为:mknod(dev_name,S IFBLK|0777,MKDEV(SD_MAJOR,ram_minor));

至此,SD 卡块设备的创建工作已经基本完成。下面所要做的就是功能函数的编写,首先用 block_device_operations*pSdDev;声明一个结构体指针,再用实际对卡操作的函数名填充该结构体如下:

pSdDev-》bd_blkRd=SD_blk_Read;pSdDev-》bd_blkWrt=SD_blk_Write;pSdDev-》bd_ioctl=SD_Ioctl;

最后实现所有的对卡进行实际操作的功能函数,如下:

e2b60ba7d20240c509e9f13b5d2c8e1f.png

至此,ReWorks 平台上 SD 卡驱动程序的总体结构基本完成。项目中实际使用的主机控制器是 S3C2440,在实际的开发中还需要按照前面描述的 SD 卡基于 SD 模式下的总线协议的操作流程,对卡进行必要的初始化工作,主要是对 S3C2440 的 SD 卡接口寄存器按照一定的程序进行操作,包括卡的波特率设置、工作模式设置、FIFO 管道初始化、CMD 命令控制寄存器的操作、对卡的响应信息的解析、数据路径编程和所有的过程所需的中断控制寄存器的操作等工作。

3、 结语

经测试,在 ReWorks 嵌入式系统平台上,利用系统建立块设备的工作流程和关键数据结构创建的 SD 模式下的 SD 卡驱动程序,很好地完成了对 SD 卡读/写操作的 BSP 层支持,数据读写安全可靠,已成功应用于某控制系统。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: reworks是一种驱动开发工具,可以帮助开发人员简化和加速驱动程序的开发过程。通过reworks,开发人员可以以更高效的方式创建和修改驱动程序。 首先,reworks提供了一个直观的图形界面,让开发人员能够快速地创建和编辑驱动程序。它封装了底层的复杂性,提供了一系列易于理解和使用的工具和功能,使开发人员能够专注于具体的功能实现,而无需过多关注底层技术细节。 其次,reworks具有强大的代码生成功能。它能够根据开发人员提供的规范和需求自动生成驱动程序的代码。这样,开发人员可以节省大量的时间和精力,避免手动编写繁琐的代码,减少错误的发生。同时,reworks还提供了丰富的代码模板和代码片段库,方便开发人员复用已有的代码,加快开发速度。 此外,reworks还支持自动化的测试和调试功能。开发人员可以通过reworks自动生成的测试工具进行自动化测试,确保驱动程序的稳定性和可靠性。同时,reworks还具有强大的调试功能,可以快速定位和修复驱动程序中的问题和错误。 总的来说,reworks驱动开发工具具有简化和加速驱动程序开发的优势。通过它,开发人员可以以更高效、更可靠的方式开发驱动程序,提高开发效率,减少错误的发生,最终提供优秀的驱动程序作为产品的一部分。 ### 回答2: Reworks 驱动开发是指对已有的驱动程序进行修改和改进的过程。驱动程序是计算机硬件与操作系统之间的桥梁,它负责将硬件设备的功能转化为操作系统能够识别和调用的接口,从而实现硬件设备的正常工作。 在实际应用中,由于硬件设备的不断更新和操作系统的升级,驱动程序也需要不断地进行维护和优化。Reworks 驱动开发就是对现有的驱动程序进行更新和改进,以适应新的硬件设备或操作系统的要求。 Reworks 驱动开发的过程包括以下几个步骤: 1.需求分析:了解新的硬件设备或操作系统的需求,确定需要对驱动程序进行哪些修改和改进。 2.代码修改:根据需求分析的结果,对驱动程序的代码进行修改和优化,使其能够正确地识别和调用新的硬件设备或操作系统的功能。 3.测试与调试:对修改后的驱动程序进行测试,确保其在新的环境下能够正常工作,并解决可能出现的问题和bug。 4.发布与部署:将修改后的驱动程序发布和部署到用户的计算机或设备中,使其能够适应新的硬件设备或操作系统。 总之,Reworks 驱动开发是一个持续更新和改进的过程,通过对现有驱动程序的修改和优化,使其能够与新的硬件设备和操作系统兼容,从而提高硬件设备的性能和稳定性。 ### 回答3: Reworks 驱动开发是指在开发过程中进行修改和改进,以提高软件驱动的功能和性能。 首先,Reworks 驱动开发是为了解决在开发过程中出现的问题和缺陷。在开发软件驱动的过程中,可能会出现各种各样的问题,比如功能实现不完善、性能不佳、兼容性差等。通过进行 reworks,开发者可以对已有的驱动进行修改和改进,以解决这些问题,提高驱动的质量和稳定性。 其次,Reworks 驱动开发还可以引入新的功能和特性。随着硬件技术的不断进步和用户需求的变化,原有的驱动可能无法满足新的需求。通过进行 reworks,开发者可以增加新的功能和特性,以适应新的硬件和软件环境。这样可以提高驱动的适用性和竞争力,满足用户的不断变化的需求。 此外,Reworks 驱动开发还可以提高驱动的性能。在开发驱动的过程中,可能会发现原有的驱动在处理性能方面存在瓶颈或者不足之处。通过进行 reworks,可以对驱动的代码进行优化和改进,从而提高性能并减少资源消耗。这样不仅可以提升用户体验,还可以提高硬件设备的整体效率。 综上所述,Reworks 驱动开发是一种对已有驱动进行修改和改进的过程,旨在提高驱动的功能和性能。通过解决问题和缺陷、引入新的功能和特性,以及优化性能,开发者可以提高驱动的质量和竞争力,满足用户不断变化的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值