软件驱动开发说明书_第1页
软件驱动开发说明书_第2页
软件驱动开发说明书_第3页
软件驱动开发说明书_第4页
软件驱动开发说明书_第5页
已阅读5页,还剩16页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、A63SPI 驱动开发说明221第页 共 页文档履历版本号日期制/修订人制/修订V1.02017-03-25初始版本321第页 共 页目录A63错误!未定义书签。SPI 驱动开发说明11.概述.1.3.编写目的4适用范围4相关.42.SPI 模块介绍5功能介绍5硬件介绍5SPI 总线工作原理5SPI 总线工作模式5SPI 驱动层次结构..3.SPI(SPI core)7SPI 控制器驱动(SPI master)7SPI 设备驱动(Sriver)7源码结构介绍7配置介绍8sys_config.fex 配置说明82.5.2.config 配置说明83.

2、SPI 常用数据结构描述10spi_master10spi_transfer10spi_message.11spi_device.12spi_board_info.13spi_driver.13SPI 常用接口描述14spi_register_driver.14spi_unregister_driver.14spi_set_drvdata.14spi_get_drvdata15spi_write.15spi_read.154.7. spi_w8r8.164.8. spi_w8r16.16spi_write_then_read.16spi_message_init17spi_message_ad

3、d_tail17SPI 设备驱动开发 demo.19Declaration.21第页 共 页概述编写目的了解 SPI 在 A63上的开发。1.2. 适用范围Allwinner A63。1.3. 相关A63SPI 设备驱动开发。521第页 共 页SPI 模块介绍功能介绍对 SPI 设备的读写操作给予支持。2.2. 硬件介绍2.2.1. SPI 总线工作原理SPI 总线通过四条线完成MCU 与各种器件的通讯,这四条线分别是:串行时钟线(SCLK)、主机输出/从机输入数据线(MOSI)、主机输入/从机输出数据线(MISO)、从机片选线(SS)。当 SPI 工作时,在移位寄存器中的数

4、据被逐位从输出引脚(MOSI)输出(前),同时将输入引脚(MISO)中接收到的数据逐位移入到移位寄存器(在)。因此,在主机发送完一个字节后,从器件接收到的数据被移入到主机的移位寄存器中,即完成一个字节数据传输的实质是两个器件寄存器内容的交换。主机的 SPI 时钟信号(SCLK)使传输同步,SPI 总线的结构如图 1 所示。图 1 SPI 总线接口电路结构图2.2.2. SPI 总线工作模式根据时钟极性(CPOL)及时钟相位(CPHA)的不同,可以组4 种工作模式,分别是:SPI0 模式,SPI1 模式,SPI2 模式和 SPI3 模式。其中使用最广泛的是 SPI0 模式和SPI3 模式,详见表

5、 1。SPI MODECPOLCPHALeading EdgeTrailing Edge000Rising,SleFailing,Setup101Rising,SetupFailing,Sle621第页 共 页表 1 SPI 总线工作模式CPOL:CPOL 定义了时钟空闲状态电平,对传输协议没有表示时钟空闲状态为低电平;为 1 时,表示时钟空闲状态为影响。为 0 时,。CPHA:CPHA 定义了数据的采样时间。为 0 时,表示在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样;为 1 时,表示在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。图 2 为 SPI 总线 4 种工作模式的时序对比

6、图。图 2 SPI 总线工作模式时序对比图2.3. SPI 驱动层次结构Linux 系统对 SPI 设备具有很好的支持,Linux 系统下的 SPI 驱动程序从逻辑上可以分为 3 个部分:(1)SPI(SPI core):SPI 总线,提供基本的 SPI 总线操作 API。(2)SPI 控制器驱动 SPI master:针对不同类型的 SPI 控制器 ,实现对 SPI 总线的具体方法。(3)SPI 设备驱动 Sriver:针对特定的 SPI 设备,实现具体的功能,包括 read,write 以及 ioctl 等对用户层操作的接口。(4)这三个部分的层次关系如图 3 和图 4 所示。210Fai

7、ling,SleRising,Setup311Failing,SetupRising,Sle721第页 共 页图 3 Linux 内核管理 SPI 原理图图 4 Linux SPI 设备驱动工作原理图2.3.1. SPI(SPI core)SPI core 是 Linux 内核用来和管理 SPI 的部分,SPI core 提供接口函数,允许一个 SPI master,S退出时进行注销。river 和 Sevice 初始化时在 SPI core 中进行,以及2.3.2. SPI 控制器驱动(SPI master)SPI master 针对不同类型的 SPI 控制器硬件,实现比较底层的对 SPI

8、总线的具体方法。SPI master 通过接口函数向 SPI core一个控制器。2.3.3. SPI 设备驱动(Sriver)Sriver 是对应于 SPI 设备端的驱动程序,通过接口函数向SPI core 进行。Sriver 的作用是将 SPI 设备挂接到 SPI 总线上。2.4. 源码结构介绍在 drivers/spi/目录下,包含有几个重要文件和目录,如下:1)文件 spi.c:SPI 子系统功能的实现。821第页 共 页2)文件 sev.c:通用的从设备驱动实现。3)目录 busses:里面包括基于不同用的源文件为:spi-sunxi.c。实现的 SPI 总线控制器驱动,A63使2.

9、5. 配置介绍2.5.1. sys_config.fex 配置说明在不同的 Sunxi 硬件中,SPI 控制器的数目也不同,但对于每一个 SPI 控制器来说,在 sys_config.fex 中配置参数相似,如下:其中常用的为 spi0,spi1 使用时按照 spi0 等格式进行添加即可。若使用哪一组 spi 总线,将对应的 spix_used 置为 1 即可。2.5.2.config 配置说明在命令行中进入内核根目录,执行 make ARCH=arm并按以下步骤操作:config 进入配置主界面,首先,选择 Device Drivers 选项进入下一级配置,如下图所示:图 3 Device

10、Drivers 选项配置spi0spi0_used= 0spi0_cs_bitmap= 1spi0_mosi = port:PC00 spi0_miso = port:PC01 spi0_sclk= port:PC02 spi0_cs0= port:PC03 spi0_regulator= vcc-io921第页 共 页.1.然后,选择 SPI support 选项,进入下一级配置,如下图所示:图 4 SPI support 选项配置选择 SUNXI SPI controller 选项,可选择直接编译进内核,也可编译成模块。如下图:图 5 SUNXI SPI controller

11、 选项配置1021第页 共 页3. SPI 常用数据结构描述3.1.spi_masterspi_master 对应于一个 SPI 控制器, spi_master过程中会扫描 相同的信息建立一个spi_register_board_infospi_device。的信息,为每一个与本总线3.2. spi_transferstruct spi_transfer struct spi_master struct devicedev; struct list_head list;s16 bus_num;/* 总线,从零开始*/u16 num_chipselect;/* 支持的片选的数量。从设备的片选号不

12、能大于这个数 */u16 dma_alignment; u16 mode_bits;u16 flags;#define SPI_MASTER_HALF_DUPLEXBIT(0)/* cant do full duplex */#define SPI_MASTER_NO_RXBIT(1)/* cant do buffer read */ #define SPI_MASTER_NO_TX BIT(2) /* cant do buffer write*/spinlock_t bus_lock_spinlock; struct mutex bus_lock_mutex; bool bus_lock_f

13、lag;(*setup)(struct spi_device *spi); /* 根据 spi 设备更新硬件配置*/* 添加消息到队列的方法。这个函数不可睡眠,它的职责是安排发生的传送并且调用的回调函数 complete() */(*transfer)(struct spi_device *spi, struct spi_message *mesg);/* cleanup 函数会在 sev_release 函数中被调用,sev_release 被登记为 sev 的 release 函数 */void (*cleanup)(struct spi_device *spi);1121第页 共 页sp

14、i_transfer 用于描述 SPI 传输,而一次完整的 SPI 传输过程可能不只包含 1 个spi_transfer,它可能包含多个 spi_transfer,这些 spi_transfer 最终通过 spi_message 组织在一起。3.3.spi_messagespi_message 用来原子的执行 spi_transfer 表示的一串数组传输请求。这个传输队列是原子的,即在这个消息完成之前不会有其它消息占用 SPI 总线。消息的执行总struct spi_message struct list_head transfers;/* 此次消息的传输队列,一个消息可以包含多个传输段 */

15、struct spi_device*spi;/* 传输的目的设备 */ unsigned is_dma_mapped:1;/* 表示是否是 DMA传输方式 */void (*complete)(void *context);/* 异步调用完成后的回调函数*/void *context;/* 回调函数的参数 */unsigned actual_length;/* 此次传输的实际长度 */sus;/* 执行的结果,成功被置 0,否则是一个负的错误码 */ struct list_head queue;void *se;const void *tx_buf;/* 要写入设备的数据(必须是 dma_s

16、afe),或者为 NULL */void *rx_buf;/* 要的数据缓冲(必须是dma_safe),或者为 NULL */unsigned len;/* tx 和rx 的大小(字节数),他们总是相等的 */dma_addr_t tx_dma;/* tx 的 dma 地址 */ dma_addr_t rx_dma;/* rx 的 dma 地址*/unsigne_change:1;/* 影响此次传输之后的片选,指示本次transfer 结束之后是否要重新片选并调用 setup 改变设置*/u8 bits_per_word;/* 每个字长的比特数,如果是 0,使用默认值*/u16 delay_u

17、secs; /*此次传输结束和片选改变之间的延时,之后就会启动另一个传输或者结束整个消息*/u32 speed_hz;/*通信时钟,如果是 0,使用默认值*/ struct list_head transfer_list;1221第页 共 页是按照 FIFO 的顺序。3.4.spi_devicespi_device 对应于真实的物理设备,每个 SPI 设备都需要一个 spi_device 来描述。struct spi_device struct devicedev;struct spi_master *master;/* 对应的控制器指针*/u32max_speed_hz;/* spi通信时钟

18、 */u8chip_select;/* 片选号,用来区分同一控制器上的设备 */u8mode;/* 各位的定义如下,主要是传输模式、片选极性 */#define SPI_CPHA0 x01/* 时钟相位 */#define SPI_CPOL0 x02/* 时钟极性 */#define SPI_MODE_0(0|0)#define SPI_MODE_1(0|SPI_CPHA) #define SPI_MODE_2 (SPI_CPOL|0)#define SPI_MODE_3(SPI_CPOL|SPI_CPHA)#define SPI_CS_HIGH0 x04/* 片选电位为高 */#define

19、 SPI_LSB_0 x08/* 先输出低比特 */#define SPI_3WIRE0 x10/* 输入输出共享接口,此时只能做半双工 */ #define SPI_LOOP0 x20#define SPI_NO_CS 0 x40 #define SPI_READY0 x80u8bits_per_word;/* 每个字长的比特数 */irq;/* 使用到的中断 */void*controller_se;void*controller_data;charmodaliasSPI_NAME_SIZE;/* 设备名字 */;1321第页 共 页3.5. spi_board_infospi_board

20、_info 用于对应 spi_device 的板级相关信息,包括使用的控制器序号、片选序号、比特率、SPI 传输模式等。3.6. spi_driverspi_driver 主要提供驱动模型下的绑定方法和电源管理接口,其成员 是和 spi_device 进行匹配的依据。该结构用于绑定在 spi_register_board_info 中应的 spi_device。的对struct spi_driver const struct spi_device_id *id_table;(*probe)(struct spi_device *spi);/* 与 sevice 匹配成功

21、后调用,对设备和私有数据进行初始化 */(*remove)(struct spi_device *spi);/* 解除spi_device 和spi_driver 的绑定,probe 申请的资源 */void(*shutdown)(struct spi_device *spi); /* 关闭 */ (*suspend)(struct spi_device *spi, pm_message_t mesg);/* 挂起 */(*resume)(struct spi_device *spi);/* 恢复 */ struct device_driverdriver;struct spi_board_i

22、nfo char modaliasSPI_NAME_SIZE;/* 设备名称 */const void *platform_data;/* 私有数据,会被设置到spi_device.dev.platform_data */void *controller_data;/* 私有数据,会被设置到spi_device.controller_data */irq;/* 设备中断号 */u32 max_speed_hz;/* SPI 的最大速率 */u16 bus_num;/* SPI 总线的*/ u16 chip_select;/* 与片选有关 */u8 mode;/* 设备的一些模式,例如片选的高低

23、,SPI的连接方式 */;1421第页 共 页4. SPI 常用接口描述4.1.spi_register_driver4.2.spi_unregister_driver4.3.spi_set_drvdataPROTOTYPEsic inline void spi_set_drvdata(struct spi_device *spi, void *data);ARGUMENTSspihandle to sevice;dataprivate dahat can be set to sevice;RETURNSNone;DESCRIPTIONSet private dao sevice;PROTOT

24、YPEsic inline void spi_unregister_driver(struct spi_driver *sdrv);ARGUMENTSdriverthe poer to the sevice driver;RETURNSNone;DESCRIPTIONUnregister an sevice driver from spi sub-system;PROTOTYPEspi_register_driver(struct spi_driver *sdrv);ARGUMENTSdriverthe poer to the sevice driver;RETURNSinit result;

25、= 0init sucsful; 0the number of bytes read; 0the number of bytes written; 0eight bit number returned by the device 0eight bit number returned by the device 0sucs 0negative errno code;DESCRIPTIONSPI synchronous write followed by read;1821第页 共 页receive result; NONEDESCRIPTIONAdd spi transfer to the sp

26、queue;1921第页 共 页5. SPI 设备驱动开发 demo下面给出一个最简单的 SPI 设备驱动 demo,例如 spi_driver_demo.c,文件具体内容如下:#include #include #include #include sicspi_driver_demo_probe(struct spi_device *spi)struct demo*demo;structx_platform_data*pdata;/* 如果驱动需要设备板级信息 */ pdata = &spi-dev.platform_data;if (!pdata)return -ENODEV;/* 为 d

27、emo 结构体开辟内存空间 */demo = kzalloc(sizeof *demo, GFP_KERNEL); if (!demo)return -ENOMEM; spi_set_drvdata(spi, demo);/* 其他语句 */.return 0;sic devexit spi_driver_demo_remove(struct spi_device *spi)return 0;sic struct spi_driver spi_driver_demo = .probe= spi_driver_demo_probe,.remove= devexit_p(spi_driver_de

28、mo_remove),.driver= .name= x,2021第页 共 页.owner= THIS_MODULE,;sic init spi_driver_demo_init(void)return spi_register_driver(&spi_driver_demo);sic void exit spi_driver_demo_exit(void)spi_unregister_driver(&spi_driver_demo);module_init(spi_driver_demo_init);module_exit(spi_driver_demo_exit);MODULE_AUTHO

29、R(anchor); MODULE_DESCRIPTION(S MODULE_LICENSE(GPL);evice driver demo);上面是对 SPI 设备驱动部分的描述。此外,还需要对 SPI 设备进行式如下:,形sic structx_platform_data = /*用户定义*/;sic structx_platform_datax_pdata initdata = /*对定义的成员赋值*/;sic struct spi_board_info.modaliasx_spi_board_info initdata = = x,x_pdata,.platform_data = &.max_speed_hz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论