1. 程式人生 > >21 使用裝置樹的i2c裝置驅動

21 使用裝置樹的i2c裝置驅動

在核心裡表示i2c裝置驅動的結構體有點小變化:

struct i2c_driver {
    int (*probe)(struct i2c_client *, const struct i2c_device_id *); 
        //當使用id_table進行匹配時, 會把匹配上的i2c_device_id變數地址傳過來.
    int (*remove)(struct i2c_client *); 

    int (*probe_new)(struct i2c_client *); //新的probe函式 
        //當使用driver的of_match_table進行匹配時, probe函式的i2c_device_id引數就是多餘的了, 可以改成使用probe_new函式.

    ...
struct device_driver driver; //driver裡的of_match_table用於指定與裝置樹裡i2c裝置的匹配 const struct i2c_device_id *id_table; //id_table也可用於與裝置樹裡i2c裝置名(也就是compatible屬性值)進行匹配. ... };

如dht12連線到第0個i2c控制器, 在裝置樹裡的描述:

        i2c0: [email protected] {  /* 控制器的裝置節點 */
        ...
            mydht12 {   /* 增加的裝置子節點  */
                compatible = "mydht12"
; reg = <0x5c>; /* 裝置地址 */ }; };

//通過i2c_driver的id_table與裝置樹裡的i2c裝置進行匹配.

/* mydrv.c */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>

int myprobe(struct i2c_client *cli)
{
    //讀出dht12的溫溼度資料
    u8 reg = 0, datas[5];
    int
i; struct i2c_msg msgs[2] = { {cli->addr, 0, 1, &reg}, {cli->addr, I2C_M_RD, sizeof(datas), datas}, }; if (i2c_transfer(cli->adapter, msgs, 2) < 0) { printk("i2c transfer failed\n"); return -ENODEV; } printk("in probe ...\n"); for (i = 0; i < sizeof(datas); i++) printk("%02d\n", datas[i]); return 0; } int myremove(struct i2c_client *cli) { printk("remove ...\n"); return 0; } struct of_device_id ids[] = { {.compatible = "mydht12"}, {}, }; struct i2c_device_id ids2[] = { {"mydht12"}, {}, }; struct i2c_driver mydrv = { .probe_new = myprobe, //使用新的probe函式 .remove = myremove, .driver = { .owner = THIS_MODULE, .name = "mydrv", // .of_match_table = ids, }, .id_table = ids2, }; module_i2c_driver(mydrv); MODULE_LICENSE("GPL");

相關推薦

Linux驅動開發08:【裝置】MPU6050驅動i2c驅動

介紹 上一節在nanopi裝置樹的I2C節點下增加了一個MPU6050的子節點,並在sysfs中檢視到了該節點已經被正確解析,這一節我們來修改之前的MPU6050驅動,使之能夠匹配到我們的裝置樹節點,然後再分析裝置樹節點是如何載入到i2c總線上的。 MP

i2c 與 spi 裝置在新版核心中不採用DTS裝置形式 在驅動新增裝置資訊(board_info)的方法

本文唯一地址:http://blog.csdn.net/dearsq/article/details/51953610 歡迎轉載,轉載請著名,謝謝~ /* 廢話:在展訊平臺移植 spi 裝置的時候發現完成 dts 和 driver中的 of_match_

04-Linux裝置系列-GPIO驅動實踐

1. 前言 GPIO驅動開發可能算是Linux核心裝置驅動開發中最為簡單、最常見的一個方向,對於開發板的按鍵、LED、蜂鳴器、電源控制等模組,可能都是使用GPIO實現的。Linux核心的GPIO子系統在核心不斷的演進過程中進行了多次的重構,本文的第二

x4412 基於裝置的 hello_world驅動

首先在exynos4412-x4412.dts檔案中新增HelloWorld節點,如下: HelloWorld {          compatible = "x4412, hello_world";          status = "okay"; }; 然後新建一

基於裝置的GPIO驅動(通過系統節點控制)

#include <linux/types.h> #include <linux/pm.h> #include <linux/gpio.h> #include <linux/slab.h> #include <linux/init.h> #inclu

3.X核心下裝置–platform裝置驅動

1。歷史的車輪總是向前,技術更替。在linus 同學發出那句 WFK 後核心進入了裝置樹時代(站在驅動工程師角度)。 前幾天我已經被mach-imx 中的檔案折磨的夜不能眠。我終於在一個清晨,喝完一杯咖啡後決定放棄蹩腳的傳統device描述方式。 這裡我先不

【TINY4412】LINUX移植筆記:(23)裝置LCD觸控式螢幕驅動

【TINY4412】LINUX移植筆記:(23)裝置樹 LCD觸控式螢幕驅動 宿主機 : 虛擬機器 Ubuntu 16.04 LTS / X64 目標板[底板]: Tiny4412SDK - 1506 目標板[核心板]

【TINY4412】LINUX移植筆記:(22)裝置LCD按鍵驅動

【TINY4412】LINUX移植筆記:(22)裝置樹 LCD按鍵驅動 宿主機 : 虛擬機器 Ubuntu 16.04 LTS / X64 目標板[底板]: Tiny4412SDK - 1506 目標板[核心板]:

linux 根據裝置註冊裝置

/platform.c  (1) int of_platform_populate(struct device_node *root, const struct of_device_id *matches,const struct of_dev_auxdata *looku

u-boot2013.01 使用裝置裝置獲得bootargs過程分析

u-boot 裝置樹形式獲取bootargs 1. 程式呼叫過程do_bootm bootm_start(cmdtp, flag, argc, argv) bootm_load_os(images.os, &load_end, 1)

misc裝置i2c裝置建立的節點路徑

misc裝置: ./sys/class/misc/sim_i2c_port/sim_i2c_addr ./sys/devices/virtual/misc/sim_i2c_port/sim_i2c_a

迅為-iMX6開發板-裝置核心-裝置相關檔案簡要分析

    本文件主要介紹在iMX6開發板(iMX6Q,iMX6D,iMX6PLUS)的幾個重要的裝置樹檔案,這幾個檔案在後續的裝置驅動分析中,經常會用到。    裝置樹檔案的分析     這裡

21 使用裝置i2c裝置驅動

在核心裡表示i2c裝置驅動的結構體有點小變化: struct i2c_driver { int (*probe)(struct i2c_client *, const struct i2c

基於i2c子系統的驅動分析-裝置

基於i2c子系統的驅動分析 和i2c有關的程式碼都在原始碼drivers/i2c目錄下。核心提供了兩種i2c的實現方法: 第一種叫i2c_dev,對應drivers/i2c/i2c-dev.c,這種方法僅僅封裝了soc的i2c控制器操作,並嚮應用層提供操作介面。其本質是為應

android驅動i2c器件的裝置配置

做驅動的要經常配置i2c,而配置i2c無非就是確定i2c器件掛在哪一個i2c總線上,以及i2c的具體地址.下面以高通8909平臺為例子說一下 確定i2c機器掛在哪一個i2c總線上 從原理圖得到SDA,SCL對應的gpio,我這個gpio為gpio6,gpio7

rk3399下iic驅動方式二-----裝置

方式一 前面說了iic在新核心下的一種方式,下面是第二種方式,這種方式在fireflyWiki教程裡面有說明 程式碼如下 #include <linux/kernel.h> #include <linux/module.h> #include <linux/

裝置時對應的驅動程式設計

一、字元裝置驅動程式的三種寫法 驅動程式編寫有3種方法:傳統方法、使用匯流排裝置驅動模型、使用裝置樹 這3種方法也核心都是一樣的: 分配、設定、註冊 file_operations結構體 這個結構體中有.open, .read, .write, .ioctl等成員 驅動程式要實現這些成員,在這些

Linux驅動開發11:【裝置】nanopi的PWM驅動

介紹 前兩節利用裝置樹實現了nanopi的LED驅動和按鍵驅動,這一節來實現nonapi的PWM驅動。PWM驅動在核心中也有相應的實現,因此這裡只是按照要求新增裝置樹檔案即可。這一節和之前一樣,首先修改裝置樹檔案進行測試,然後分析核心相應的軟體實現。 新增裝置樹節點 因為在s

Linux驅動開發10:【裝置】nanopi的按鍵驅動

介紹 這一節在nanopi上實現按鍵驅動,和LED驅動一樣,通用的按鍵驅動在linux核心中已經實現好,我們只需要按照要求寫好裝置樹即可,不用我們自己實現按鍵驅動。這一節中首先修改裝置樹並測試按鍵驅動,然後分析drivers/input/keyboard/gpio_keys.c檔案,

i2c裝置驅動

跟所有的 bus-dev-drv模型一樣,當我們拿到一個模組我們需要做的就是dev_drv即裝置驅動程式 一、裝置(device) 方法一、自己寫一個i2c_device.c #include <linux/kernel.h> #include &l