i2c设备驱动

版权声明:本文为博主原创文章,未经博主允许不得转载。
https://blog.csdn.net/huangweiqing80/article/details/82887328
跟所有的 bus-dev-drv模型一样,当我们拿到一个模块我们需要做的就是dev_drv即设备驱动程序

一、设备(device)
方法一、自己写一个i2c_device.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/regmap.h>
#include <linux/slab.h>
 
//0x50表示I2C设备的地址,一般在	I2C设备芯片手册可以查到
static struct i2c_board_info at24cxx_info = {	
	I2C_BOARD_INFO("at24c08", 0x50),//这个名字要和drv程序中的id_table中名字要一样
};
 
static struct i2c_client *at24cxx_client;
 
static int at24cxx_dev_init(void)
{
	struct i2c_adapter *i2c_adap;
 
	i2c_adap = i2c_get_adapter(0);//这里要实验的EEPROM是挂接在第0条I2C总线上的,所以这里的参数是0
	at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info);
	i2c_put_adapter(i2c_adap);
	
	return 0;
}
 
static void at24cxx_dev_exit(void)
{
	i2c_unregister_device(at24cxx_client);
}
 
module_init(at24cxx_dev_init);
module_exit(at24cxx_dev_exit);
MODULE_LICENSE("GPL");

方法二、直接在板级文件中添加设备信息
(1)在、arch/arm/目录下找到对应的mach文件进行注册
arch\arm\mach-s3c2440/mach-mini2440.c

static struct i2c_board_info i2c_devs[] __initdata = {
	{ I2C_BOARD_INFO("eeprom", 0x50), },
   { 
        I2C_BOARD_INFO(“isp1301_omap”, 0x2d), 
        .irq        = OMAP_GPIO_IRQ(125), 
    }, 
};

在Linux内核加入设备树概念后,我们用设备树会更清楚明白

(2)设备树进行注册(我用的方法)

    &i2c1 { 
        pinctrl-names =default; 
        pinctrl-0 = <&i2c1_pins>;
        status = "okay";
        clock-frequency = <400000>;

        tca9555: tca9555@20 {
            compatible = "ti,tca9555";
            reg = <0x20>;
    };

二、driver
driver就是我们通常从模组厂商中拿到的所谓的驱动了,那么driver怎么实现呢?

参考下面这篇博文
Linux3.5下I2C设备驱动程序
新手写LinuxI2C驱动程序

猜你喜欢

转载自blog.csdn.net/huangweiqing80/article/details/82887328