i2c 与 spi 设备在新版内核中不采用DTS设备树形式 在驱动添加设备信息(board_info)的方法
来源:互联网 发布:淘宝店铺添加手机桌面 编辑:程序博客网 时间:2024/05/16 07:32
本文唯一地址:http://blog.csdn.net/dearsq/article/details/51953610
欢迎转载,转载请著名,谢谢~
/*
废话:在展讯平台移植 spi 设备的时候发现完成 dts 和 driver中的 of_match_table 后,在 init时 spi_driver_register 返回0(注册成功)但是 probe 却无法跑起来,一直没有 找出来原因。
于是改用 board_info 的方式直接在 driver 中注册设备信息。
*/
i2c 设备模型
#include <linux/module.h>#include <linux/i2c.h>#define SENSOR_BUS_NUM 0#define SENSOR_SLAVE_ADDRESS 0x3e#define SENSOR_NAME "sensor"struct i2c_client *sensor_client=NULL;static int sensor_probe(struct i2c_client *client,const struct i2c_device_id *id){ sensor_client=client; return 0;}static int sensor_remove(struct i2c_client *client){ return 0;}//首先需要一个 id_tablestatic const struct i2c_device_id sensor_id[] = { {SENSOR_NAME, 0}, { }};MODULE_DEVICE_TABLE(i2c, sensor_id);//在 driver中添加 id_tablestatic struct i2c_driver sensor_driver = { .driver = { .name = SENSOR_NAME, }, .probe = sensor_probe, .remove = sensor_remove, .id_table = sensor_id,};//填充 board_info static struct i2c_board_info sensor_device = { I2C_BOARD_INFO("hmc5883l-i2c", SENSOR_SLAVE_ADDRESS),};static int __init sensor_init(void){ struct i2c_adapter *adap; struct i2c_client *client; adap = i2c_get_adapter(sensor_bus_num); if (!adap) { printk("i2c adapter %d\n",sensor_bus_num); return -ENODEV; } else { printk("get ii2 adapter %d ok\n", sensor_bus_num); client = i2c_new_device(adap, &sensor_device); } if (!client) { printk("get i2c client %s @ 0x%02x fail!\n", sensor_device.type, sensor_device.addr); return -ENODEV; } else { printk("get i2c client ok!\n"); } i2c_put_adapter(adap); i2c_add_driver(&sensor_driver); printk("sensor init success!\n"); return 0;}static void __exit sensor_exit(void){ i2c_del_driver(&sensor_driver); if(sensor_client!=NULL) i2c_unregister_device(sensor_client); printk("Module removed\n");}module_init(sensor_init);module_exit(sensor_exit);ODULE_AUTHOR("GPL");ODULE_LICENSE("GPL");
spi设备驱动模型
spi的驱动模板如下
#include <linux/module.h>#include <linux/spi/spi.h>#define DEVICE_NAME "sensor"#define SENSOR_SPI_BUS 0struct spi_device *sensor_spi=NULL;int sensor_spi_write(void){ return 0;}int sensor_spi_read(void){ return 0;}static const struct spi_device_id sensor_spi_id[] = { { DEVICE_NAME, 0 }, { }};MODULE_DEVICE_TABLE(spi, sensor_spi_id);static int sensor_probe(struct spi_device *spi){ sensor_spi=spi; return 0;}static int sensor_remove(struct spi_device *spi){ return 0;}static struct spi_driver sensor_driver = { .driver = { .name = DEVICE_NAME, .owner = THIS_MODULE, }, .probe = sensor_probe, .remove = sensor_remove, .id_table = sensor_spi_id,};static __init int sensor_spi_init(void){ int status=-1; struct spi_master *master; struct spi_device *spi; struct spi_board_info chip = { .modalias = DEVICE_NAME, .mode = 0x00, .bus_num = 0, .chip_select = 0, .max_speed_hz = 2000000, }; spi_register_driver(&sensor_driver); if (status<0) { pr_err("%s: spi_register_driver spi_driver failure. status = %d\n", __func__, status); } pr_err("%s: spi_register_driver spi_driver success. status = %d\n", __func__, status); master = spi_busnum_to_master(SENSOR_SPI_BUS); if (!master) { status = -ENODEV; goto error_busnum; } spi = spi_new_device(master, &chip); if (!spi) { status = -EBUSY; goto error_mem; } return status;error_mem:error_busnum: spi_unregister_driver(&sensor_driver); return status;}static __exit void sensor_spi_exit(void){ spi_unregister_driver(&sensor_driver); if(sensor_spi!=NULL) spi_unregister_device(sensor_spi);}module_init(sensor_spi_init);module_exit(sensor_spi_exit);MODULE_LICENSE("GPL v2");
0 0
- i2c 与 spi 设备在新版内核中不采用DTS设备树形式 在驱动添加设备信息(board_info)的方法
- Linux下SPI和IIC驱动免在设备树上添加设备信息的编写方法
- 在am335x添加spi设备
- linux内核模型---总线,设备,驱动在展讯平台上I2C设备的实例解析
- 内核中编写i2c设备驱动
- 在menuconfig中添加编译驱动设备
- 在设备驱动中添加属性页
- 在menuconfig中添加编译驱动设备
- SPI设备的驱动
- SPI设备的驱动
- SPI设备的驱动
- SPI设备的驱动
- SPI设备的驱动
- 在Linux内核模块中操作I2C设备
- 如何在Yocto中使用自己的设备树dts和内核配置
- 在内核里写i2c设备驱动的两种方式
- LINUX I2C设备驱动的编写方法
- I2C设备与驱动的关联
- 微信网页扫码支付模式一和模式二的适用场景
- [转]微服务与SOA之间差了一个ESB
- hdu5550Game Rooms
- 二分查找算法
- html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
- i2c 与 spi 设备在新版内核中不采用DTS设备树形式 在驱动添加设备信息(board_info)的方法
- java内存区域和GC机制
- 自动化gulp使用方法
- 自动更新技术的选择
- [C++]在程序中高效实用STL
- POJ3258
- Redis集群部署文档(centos6系统)
- In Defense of Nearest-Neighbor Based Image Classification
- 大千世界 渺小的我又该何去何从