基于spi总线驱动程序的编写
来源:互联网 发布:sql数据库镜像 编辑:程序博客网 时间:2024/05/22 11:42
作者:刘广富,华清远见嵌入式学院讲师。
本文不具体分析linux内核中SPI总线的架构,只针对这种架构阐述如何进行SPI设备驱动的编写。
简而言之,SPI驱动的编写分为两个部分:
第一、spi_device的构建和注册
第二、spi_driver的构建和注册
1.spi_device的构建并注册
首先在板文件中添加spi_board_info,例如:
static struct spi_board_info s3c_spi_devs[] __initdata = {
{
.modalias = "m25p10a",
.mode = SPI_MODE_0,
.max_speed_hz = 1000000,
.bus_num = 0,
.chip_select = 0,
.controller_data = &smdk_spi0_csi[SMDK_MMCSPI_CS],
},
};
并在板文件的init函数中调用spi_register_board_info(s3c_spi_devs,ARRAY_SIZE(s3c_spi_devs));
这个函数会把spi_board_info注册到链表board_list上。spi_device封装了一个spi_master结构体,事实上spi_master的注册会在spi_register_board_info之后,spi_master注册的过程中会调用scan_boardinfo扫描board_list,找到挂接在它上面的spi设备,然后创建并注册spi_device。
2. spi_driver的构建与注册,分为三部曲:
(1)构建spi_driver
static struct spi_driver m25p80_driver = {
. driver = {
.name ="m25p80",
.bus =&spi_bus_type,
.owner = THIS_MODULE,
},
.probe = m25p_probe,
.remove =__devexit_p(m25p_remove),
};
(2)spid_river的注册
spi_register_driver(&m25p80_driver);当匹配了spi_device以后调用probe
(3)实现probe操作:
spi_transfer(里面集成了数据buf空间地址等信息)
spi_message(是spi_transfer的**)的构建;spi_message_init(初始化spi_message)、spi_message_add_tail(将新的spi_transfer添加到spi_message队列尾部)
spi_sync函数的调用(调用spi_master发送spi_message)
例如:
struct spi_transfer st={
.tx_buf = buf,
.len = len,
。。。。。。。。。
};//填充spi_transfer 的tx_buf、rx_buf和len就可以
struct spi_message meg;//定义message
spi_init_message(&meg);//初始化meg
spi_message_add_tail(&st,&meg);
//将st放在message队列尾部
Spi_sync(spi_device,&meg);
//将message与spi_device关联,发送meg
这样就基本完成了SPI设备的驱动编写,读写具体操作要根据芯片的时序来确定,具体如何利用SPI传数据那么就要看自己程序的逻辑。
本文不具体分析linux内核中SPI总线的架构,只针对这种架构阐述如何进行SPI设备驱动的编写。
简而言之,SPI驱动的编写分为两个部分:
第一、spi_device的构建和注册
第二、spi_driver的构建和注册
1.spi_device的构建并注册
首先在板文件中添加spi_board_info,例如:
static struct spi_board_info s3c_spi_devs[] __initdata = {
{
.modalias = "m25p10a",
.mode = SPI_MODE_0,
.max_speed_hz = 1000000,
.bus_num = 0,
.chip_select = 0,
.controller_data = &smdk_spi0_csi[SMDK_MMCSPI_CS],
},
};
并在板文件的init函数中调用spi_register_board_info(s3c_spi_devs,ARRAY_SIZE(s3c_spi_devs));
这个函数会把spi_board_info注册到链表board_list上。spi_device封装了一个spi_master结构体,事实上spi_master的注册会在spi_register_board_info之后,spi_master注册的过程中会调用scan_boardinfo扫描board_list,找到挂接在它上面的spi设备,然后创建并注册spi_device。
2. spi_driver的构建与注册,分为三部曲:
(1)构建spi_driver
static struct spi_driver m25p80_driver = {
. driver = {
.name ="m25p80",
.bus =&spi_bus_type,
.owner = THIS_MODULE,
},
.probe = m25p_probe,
.remove =__devexit_p(m25p_remove),
};
(2)spid_river的注册
spi_register_driver(&m25p80_driver);当匹配了spi_device以后调用probe
(3)实现probe操作:
spi_transfer(里面集成了数据buf空间地址等信息)
spi_message(是spi_transfer的**)的构建;spi_message_init(初始化spi_message)、spi_message_add_tail(将新的spi_transfer添加到spi_message队列尾部)
spi_sync函数的调用(调用spi_master发送spi_message)
例如:
struct spi_transfer st={
.tx_buf = buf,
.len = len,
。。。。。。。。。
};//填充spi_transfer 的tx_buf、rx_buf和len就可以
struct spi_message meg;//定义message
spi_init_message(&meg);//初始化meg
spi_message_add_tail(&st,&meg);
//将st放在message队列尾部
Spi_sync(spi_device,&meg);
//将message与spi_device关联,发送meg
这样就基本完成了SPI设备的驱动编写,读写具体操作要根据芯片的时序来确定,具体如何利用SPI传数据那么就要看自己程序的逻辑。
0 0
- 基于spi总线驱动程序的编写
- 基于spi总线驱动程序的编写
- 基于51单片机的SPI总线
- 基于Windows CE的SPI驱动程序设计
- 基于USB总线的无线网卡驱动程序
- SPI总线 的使用 和 裸机程序编写
- 2.6 基于SPI总线的SD卡驱动总结 ,at91
- linux系统总线SPI总线四之SPI设备驱动程序
- 基于ARM嵌入式系统的SPI驱动程序设计
- 基于2440的SPI测试驱动程序以及应用程序(实例)
- 基于2440的SPI测试驱动程序以及应用程序(实例)
- 基于2440的SPI测试驱动程序以及应用程序(实例)
- 基于V4L2框架的linux驱动程序编写
- 基于树莓派:MAX7219的字符驱动程序编写
- 基于MCP2515的Linux CAN总线驱动程序设计(三)
- 基于MCP2515的Linux CAN总线驱动程序设计(二)
- 基于MCP2515的Linux CAN总线驱动程序设计(一)
- 基于MCP2515的Linux CAN总线驱动程序设计(一)
- android 检查是否有网络,是否在wifi环境下
- 第六讲 :UIControl及其⼦子类
- html与css架构的一点体验
- 分析如何提高冲模耐用度的途径
- MAC打包Android项目(Ant的安装)
- 基于spi总线驱动程序的编写
- nginx tomcat 配置集群负载均衡
- CMake的使用
- 教你透彻了解红黑树
- python模块包
- 我的伯牙网工作日记
- APK反编译之一:基础知识
- Perl My和LOCAL区别
- 上海品牌策划公司该如何生存