欢迎来到天天文库
浏览记录
ID:25777146
大小:873.96 KB
页数:18页
时间:2018-11-22
《linux下spi驱动开发》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux下spi驱动开发 一、概述基于子系统去开发驱动程序已经是linux内核中普遍的做法了。前面写过基于I2C子系统的驱动开发。本文介绍另外一种常用总线SPI的开发方法。SPI子系统的开发和I2C有很多的相似性,大家可以对比学习。本主题分为两个部分叙述,第一部分介绍基于SPI子系统开发的理论框架;第二部分以华清远见教学平台FS_S5PC100上的M25P10芯片为例(内核版本2.6.29),编写一个SPI驱动程序实例。二、SPI总线协议简介介绍驱动开发前,需要先熟悉下SPI通讯协议中的几个关键的地方,后面在编写驱动时
2、,需要考虑相关因素。SPI总线由MISO(串行数据输入)、MOSI(串行数据输出)、SCK(串行移位时钟)、CS(使能信号)4个信号线组成。如FS_S5PC100上的M25P10芯片接线为: 上图中M25P10的D脚为它的数据输入脚,Q为数据输出脚,C为时钟脚。SPI常用四种数据传输模式,主要差别在于:输出串行同步时钟极性(CPOL)和相位(CPHA)可以进行配置。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。如果CPHA=0,在串行同步时钟的前沿(上升或下降)数据被
3、采样;如果CPHA=1,在串行同步时钟的后沿(上升或下降)数据被采样。 这四种模式中究竟选择哪种模式取决于设备。如M25P10的手册中明确它可以支持的两种模式为:CPOL=0CPHA=0 和CPOL=1CPHA=1 三、linux下SPI驱动开发首先明确SPI驱动层次,如下图: 我们以上面的这个图为思路1、PlatformbusPlatformbus对应的结构是platform_bus_type,这个内核开始就定义好的。我们不需要定义。2、Platform_deviceSPI控制器对应platform_d
4、evice的定义方式,同样以S5PC100中的SPI控制器为例,参看arch/arm/plat-s5pc1xx/dev-spi.c文件点击(此处)折叠或打开1.structplatform_devices3c_device_spi0 = {2. .name = "s3c64xx-spi", //名称,要和Platform_driver匹配3. .id = 0, //第0个控制器,S5PC100中有3个控制器4.
5、.num_resources = ARRAY_SIZE(s5pc1xx_spi0_resource), //占用资源的种类5. .resource = s5pc1xx_spi0_resource, //指向资源结构数组的指针6. .dev = {1. .dma_mask = &spi_dmamask, //dma寻址范围 2. .coherent_dm
6、a_mask = DMA_BIT_MASK(32), //可以通过关闭cache等措施保证一致性的dma寻址范围3. .platform_data = &s5pc1xx_spi0_pdata, //特殊的平台数据,参看后文4. },5. };6.7.staticstructs3c64xx_spi_cntrlr_infos5pc1xx_spi0_pdata = {8. .cfg_gpi
7、o = s5pc1xx_spi_cfg_gpio, //用于控制器管脚的IO配置9. .fifo_lvl_mask = 0x7f,10. .rx_lvl_offset = 13,11. };12.13.static int s5pc1xx_spi_cfg_gpio(structplatform_device *pdev)14. {15. switch (pdev->id) {1
8、6. case 0:17. s3c_gpio_cfgpin(S5PC1XX_GPB(0), S5PC1XX_GPB0_SPI_MISO0);18. s3c_gpio_cfgpin(S5
此文档下载收益归作者所有