关于linux spi驱动的那些事.doc
《关于linux spi驱动的那些事.doc》由会员分享,可在线阅读,更多相关《关于linux spi驱动的那些事.doc(6页珍藏版)》请在三一文库上搜索。
1、关于linux spi驱动的那些事下面是我整理的关于SPI的一些心得,内核版本2.6.29。SPI子系统spi子系统中,spi设备用struct spi_dev描述,它的驱动程序用struct spi_driver描述。spi总线设备用struct spi_master描述。另外,还有两个重要的全局变量:struct bus_type spi_bus_type = .name = spi,.dev_attrs = spi_dev_attrs,.match = spi_match_device,.uevent = spi_uevent,.suspend = spi_suspend,.resume
2、 = spi_resume,;staTIc struct class spi_master_class = .name = spi_master,.owner = THIS_MODULE,.dev_release = spi_master_release,;spi_bus_type对应sys中的spi bus总线,Linux设备模型对这个结构体有详细介绍。所有spi_master对应的spi总线都属于spi_master_class,也就是说是一个虚拟设备,它的父设备可能是物理设备,比如platform_device等等,s3c2410就是这种情况。SPI设备的驱动程序通过spi_regist
3、er_driver注册进SPI子系统,驱动类型为struct spi_driver。典型例子如at25.c。staTIc struct spi_driver at25_driver = .driver = .name = at25,.owner = THIS_MODULE,.probe = at25_probe,.remove = _devexit_p(at25_remove),;因为spi总线不支持SPI设备的自动检测,所以一般在spi的probe函数中不会检测设备是否存在,而是做一些spi设备的初始化工作。spi驱动中可以调用下列函数进行spi的传输操作:staTIc inline int
4、 spi_write(struct spi_device *spi, const u8 *buf, size_t len);staTIc inline int spi_read(struct spi_device *spi, u8 *buf, size_t len);extern int spi_write_then_read(struct spi_device *spi, const u8 *txbuf, unsigned n_tx,u8 *rxbuf, unsigned n_rx);static inline ssize_t spi_w8r8(struct spi_device *spi,
5、 u8 cmd);static inline ssize_t spi_w8r16(struct spi_device *spi, u8 cmd);由于spi设备不能被spi总线动态扫描,所以spi子系统使用了另一种方法,就是通过spi_register_board_info函数将spi设备静态得登记到系统中。int _init spi_register_board_info(struct spi_board_info const *info, unsigned n);struct spi_board_info char modalias32; / 设备名const void *platform
6、_data; / 私有数据,会被设置到spi_device.dev.platform_datavoid *controller_data; / 私有数据,会被设置到spi_device.controller_dataint irq; / 中断号u32 max_speed_hz; / 最大速率u16 bus_num; / 用于关联spi_masteru16 chip_select; / 与片选有关u8 mode; / spi_device.mode;在具体平台的文件中,可以定义struct spi_board_info的结构体,然后通过spi_register_board_info函数保存这些结
7、构体,最后在scan_boardinfo函数中根据这些保存的结构体创建spi设备(spi_new_device)。spi_new_device用于登记spi设备,这里面又分两步,首先是spi_alloc_device,然后是spi_add_device。struct spi_device *spi_new_device(struct spi_master *master, struct spi_board_info *chip)spi_dev* pdev = spi_alloc(master);proxy-chip_select = chip-chip_select;proxy-max_spe
8、ed_hz = chip-max_speed_hz;proxy-mode = chip-mode;proxy-irq = chip-irq;strlcpy(proxy-modalias, chip-modalias, sizeof(proxy-modalias);proxy-dev.platform_data = (void *) chip-platform_data;proxy-controller_data = chip-controller_data;proxy-controller_state = NULL;spi_add_device(proxy);struct spi_device
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于linux spi驱动的那些事 关于 linux spi 驱动 那些
链接地址:https://www.31doc.com/p-3387691.html