1. 程式人生 > >i2c裝置驅動

i2c裝置驅動

跟所有的 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: [email protected]20 {
            compatible = "ti,tca9555";
            reg = <0x20>;
    };

二、driver driver就是我們通常從模組廠商中拿到的所謂的驅動了,那麼driver怎麼實現呢?