linux 3.18 -- iic,input,misc,三轴加速度设备驱动(一)

三轴加速度设备驱动
i2c体系架构图:
这里写图片描述

一 层次架构:
1. I2C核心层
2. I2C总线驱动层
3. I2C设备驱动层

  1. I2C核心层
    提供了I2C总线驱动和设备驱动的注册和注销方法;
    I2C通信方法(Algorithm)上层的与具体适配器无关的代码;
    探测设备、检测设备地址的上层代码。

  2. I2C总线驱动层
    I2C总线驱动是对I2C硬件体系结构中适配器的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。
    I2C总线驱动主要包括I2C适配器数据结构i2c_adapter;I2C适配器的Algorithm数据结构i2c_algorithm;控制I2C适配器产生通信信号的函数。
    经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。

  3. I2C设备驱动
    I2C设备驱动是对I2C硬件体系结构中的设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
    I2C设备驱动主要包含的数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。

二 i2c相关代码
\kernel\drivers\i2c目录下。
1.i2c-core.c
实现了I2C核心的功能。

2.i2c-dev.c(虚拟I2C设备驱动,便于从用户空间操作I2C外设,通用)
实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备。通过适配器访问设备时的主设备号都为89,次设备号为0–255。
应用程序可通过“i2c-%d”(i2c-0, i2c-1, …)文件名并使用文件操作接口open(), close(), read(), write(), ioctl()等来访问该设备。
i2c-dev.c并不是针对特定的设备而设计的,只是提供了通用的read(), write(), ioctl()等接口,应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器,并控制I2C设备的工作方式。

3.busses文件夹(I2C总线驱动,一般由bsp厂商维护)
包含了一些I2C主机控制器的驱动,如i2c-imx.c, i2c-exynos5等(具体到某个厂商cpu的i2C控制器驱动)

4.algos文件夹
实现了一些I2C总线适配器的通信方法。

四 工程师主要工作:
a. I2C总线驱动
1. 提供I2C适配器的硬件驱动。
探测,初始化I2C适配器(如申请I2C的I/O地址和中断号),驱动CPU控制的I2C适配器从硬件上产生各种信号以及处理I2C中断等。
2. 提供I2C适配器的Algorithm。
用具体适配器的xxx_xfer()函数填充i2c_algorithm的master_xfer指针,并把i2c_algorithm指针赋值给i2c_adapter的algo指针。

b. I2C设备驱动
1. 实现I2C设备驱动中的i2c_driver接口。
用具体设备yyy的yyy_probe(), yyy_remove(), yyy_suspend(), yyy_resume()函数指针和i2c_device_id设备ID表赋值给i2c_driver的probe, remove, suspend, resume, id_table指针。
2. 实现I2C设备所对应类型的具体驱动。
i2c_driver只是实现设备与总线的挂接,而挂接在总线上的设备则有各种类型,千差万别。例如:如果是字符设备,就实现文件操作接口,即实现具体设备yyy的yyy_read(), yyy_write(), yyy_ioctl()函数等;如果是声卡,就实现ALSA驱动; 如果是加速度传感器,则实现input驱动。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一个AI语言模型,无法编写代码。但是,我可以给你一个iic设备linux驱动程序的框架,你可以根据自己的需要进行修改和完善。 ``` #include <linux/module.h> #include <linux/i2c.h> #include <linux/i2c-dev.h> #define IIC_DEVICE_NAME "my_iic_device" static int iic_probe(struct i2c_client *client, const struct i2c_device_id *id) { // TODO: 处理设备的初始化和注册 return 0; } static int iic_remove(struct i2c_client *client) { // TODO: 处理设备的注销和释放 return 0; } static const struct i2c_device_id iic_id[] = { {IIC_DEVICE_NAME, 0}, {}, }; static struct i2c_driver iic_driver = { .driver = { .name = IIC_DEVICE_NAME, .owner = THIS_MODULE, }, .probe = iic_probe, .remove = iic_remove, .id_table = iic_id, }; static int __init iic_init(void) { int ret = i2c_add_driver(&iic_driver); if (ret < 0) { printk(KERN_ALERT "Failed to register iic driver\n"); return ret; } printk(KERN_INFO "iic driver registered\n"); return 0; } static void __exit iic_exit(void) { i2c_del_driver(&iic_driver); printk(KERN_INFO "iic driver unregistered\n"); } module_init(iic_init); module_exit(iic_exit); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("IIC Device Driver"); MODULE_LICENSE("GPL"); ``` 需要注意的是,上面的代码只是一个简单的框架,具体的实现需要根据你的设备来进行修改和完善。你需要实现iic_probe和iic_remove函数来处理设备的初始化和注销,以及其他必要的函数来实现设备的读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值