久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6892|回復: 1
打印 上一主題 下一主題
收起左側

學習筆記 - 在驅動中最靈活的 I2C 設備偵測方法

[復制鏈接]
跳轉到指定樓層
樓主
ID:140343 發表于 2016-9-24 22:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在工作過程中,意外發現一種很靈活的 I2C 設備偵測方式,特別有意思,此種方式可以實現無論 I2C 設備掛在哪一條 I2C 總線上,都能夠輕松找到該 I2C 設備,利用這種方式可以做到智能檢測設備,即使硬件更換 I2C 總線也不需要修改驅動程序。為了方便日后調試,寫了一個小驅動程序,用于通過往設備節點寫 I2C 設備地址來檢測 I2C 設備

寫完之后在百度搜索了一下,看是否還有其他的方式,還真有:http://blog.csdn.net/yuanlulu/article/details/6557901


#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <linux/miscdevice.h>
#include <linux/mutex.h>
#include <linux/mm.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/sysctl.h>
#include <linux/input.h>
#include <linux/gpio.h>
#include <linux/irq.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h>
#include <linux/wakelock.h>
#include <linux/slab.h>
#define __ISDEBUG__
#include <linux/zhc_public.h>

#define LMX_I2C_DETECT_DEVICE_NAME "zhc_i2c_detect"


// 此處可以寫多個
static unsigned short s_Normal_I2c[] = {0x35, I2C_CLIENT_END};    // 芯片地址

/*
    struct i2c_board_info {
    char        type[I2C_NAME_SIZE];
    unsigned short    flags;
    unsigned short    addr;
    void        *platform_data;
    struct dev_archdata    *archdata;
    struct device_node *of_node;
    struct acpi_dev_node acpi_node;
    int        irq;
    int comp_addr_count;
    struct i2c_comp_address *comp_addrs;
    unsigned long irq_flags;
    };
*/

/**************************** I2C 設備驅動框架 ****************************/
static int i2c_detect_Detect(struct i2c_client *client, struct i2c_board_info *info)
{
    struct i2c_adapter *adapter = client->adapter;

    // 如果 I2C 設備掛在主控的 I2C控制器1 上,那么 adapter->nr = 1
    dprintk("adapter->nr = %d I2C_device = 0x%x", adapter->nr, info->addr);
   
    return -ENODEV;   

}


static const struct i2c_device_id i2c_detect_id[] = {
    {LMX_I2C_DETECT_DEVICE_NAME, 0},
    {}
};


static struct i2c_driver i2c_detect_driver = {
    .class = I2C_CLASS_HWMON,
    .driver = {
            .owner = THIS_MODULE,
            .name = LMX_I2C_DETECT_DEVICE_NAME,
            },
    .detect = i2c_detect_Detect,   // 會往所有的 I2C 控制器上尋指定的 I2C 設備地址的 I2C 設備,若有 ACK 回應則會調用該函數
    .id_table = i2c_detect_id,
    .address_list = s_Normal_I2c,  // 地址列表
};


/**************************** I2C 設備驅動框架 ****************************/

/* 重加載 */
static int I2c_Detect_Reload(void)
{   
    iprintk();
   
    if(i2c_add_driver(&i2c_detect_driver)!= 0)
    {
        eprintk("i2c_add_driver() failed");
        return -2;
    }
   
    i2c_del_driver(&i2c_detect_driver);
   
    return 0;
}


static ssize_t I2c_Detect_store(struct class *class, struct class_attribute *attr, const char *buf, size_t count)
{
    unsigned long data = 0;
    int ret;

    strict_strtoul(buf, 16,  &data);
    iprintk("data = 0x%x", data);
   
    s_Normal_I2c[0] = data;
   
    I2c_Detect_Reload();
   
    return count;
}


static ssize_t I2c_Detect_show(struct class *class, struct class_attribute *attr,    char *buf)
{
    return 1;
}


// 提供兩個接口函數給上層使用
static struct class_attribute I2c_Detect_class_attrs[] = {
    __ATTR(i2c_addr, 0777, I2c_Detect_show, I2c_Detect_store),
    __ATTR_NULL
};


static struct class I2c_Detect_class = {
    .name = "zhc_i2c_detect",
    .class_attrs = I2c_Detect_class_attrs,
};


static int __init i2c_detect_init(void)
{
    int ret = 0;   
    dprintk();

    // 創建設備節點
    class_register(&I2c_Detect_class);   
    return ret;
}


static void __exit i2c_detect_exit(void)
{
    dprintk();
    class_unregister(&I2c_Detect_class);
}


module_init(i2c_detect_init);
module_exit(i2c_detect_exit);

MODULE_AUTHOR("lovemengx");
MODULE_DESCRIPTION("This I2C Devices Detect Driver Use Debug I2C devices");
MODULE_LICENSE("GPL");


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:477092 發表于 2020-12-1 09:38 | 只看該作者
你好,你這個頭文件怎么定義的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情视频 | 亚洲大片在线观看 | 日韩中文字幕在线观看 | 久久成人18免费网站 | 亚洲电影在线播放 | 亚洲午夜av| 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 日韩在线观看一区二区三区 | 国产精品久久久久久久久免费高清 | 亚洲精品视频在线播放 | 浮生影院免费观看中文版 | 91在线色视频 | 亚洲精美视频 | 日韩视频在线播放 | 在线成人免费视频 | www.一区二区三区.com | 91精品国产综合久久福利软件 | 欧美一区二区在线 | 欧洲高清转码区一二区 | 日韩一区二区在线播放 | 欧美日韩高清免费 | 日日夜夜精品视频 | 精品视频在线免费观看 | 久久久www成人免费无遮挡大片 | 国产三级日本三级 | www.夜夜草 | 欧美日韩在线免费观看 | 99视频在线免费观看 | 午夜小视频在线播放 | 中文在线一区二区 | 成人免费xxxxx在线视频 | 久久亚洲一区二区 | 精精国产xxxx视频在线播放 | 亚洲一区二区三区四区在线观看 | 国产精品91视频 | 亚洲一区视频在线 | 91麻豆精品国产91久久久更新资源速度超快 | 久久亚洲国产 | 成人网址在线观看 | 一区二区福利视频 | 天天插天天操 |