娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

1.Linux主機驅動和外設驅動分離思想

外設驅動→API→主機驅動→板機邏輯--具體的i2c設備(camera,ts,eeprom等等)

 

2.主機驅動

根據控制器硬件手冊,操作具體的寄存器,產生波形。

 

  • Linux應用工程師:屏蔽了驅動和硬件

  • Linux驅動工程師:屏蔽硬件,提供標準的主機驅動。驅動工程師需要完成“外設驅動”

 

  • 內核函數接口:(API)。主機驅動提供給外設驅動的函數接口


    1. 注冊i2c設備:i2c_board_info

    2. 驅動注冊和卸載函數以及結構體:i2c_del_driver/i2c_add_driver, i2c_driver

    3. 讀寫函數和結構體:i2c_transfer, i2c_msg

這些函數放之四海之內皆準

 

3.外設驅動

針對具體的外部器件代碼

  • 攝像頭以及聲卡中i2c用來配置外部設備(聲卡和攝像頭)→地址和配置的內容都不一樣!

 

4.板級邏輯

描述主機和外部設備是怎么連接的

 

5.設備-i2c設備注冊以及設備注冊之后的查詢方法

  • 查詢i2c設備地址:ls /sys/bus/i2c/devices/

  • 怎么和原理圖以及外部設備對應:3-0038→I2C_3_SCL(addr:datasheet中查0x38)

  • 查詢i2c設備名稱:cat /sys/bus/i2c/devices/3-0038/name

 

menuconfig中去掉觸摸的驅動

  • Device Drivers  --->

  • Input device support  --->

  • Touchscreens  --->

  • FT5X0X based touchscreens(去掉)

 

添加i2c設備:i2c_devs3[]中添加
        {
                I2C_BOARD_INFO("i2c_test", 0x70>>1),
        },
cat /sys/bus/i2c/devices/3-0038/name結果是i2c_test   

 

6.驅動-i2c驅動注冊和卸載

i2c設備初始化完成-進入probe函數

i2c_del_driver/i2c_add_driver, i2c_driver

module_init和late_initcall:前面的優先加載,后面的延遲加載

 驅動代碼:

i2c.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


#include


#include

#include

#include


#define I2C_TEST_NAME "i2c_test"


static int i2c_test_probe(struct i2c_client *client, const struct i2c_device_id *id)

{

        printk("==%s: n", __FUNCTION__);

        return 0;

}


static int __devexit i2c_test_remove(struct i2c_client *client)

{

        i2c_set_clientdata(client, NULL);               //設置client為NULL

        printk("==%s: n", __FUNCTION__);

        return 0;

}


static const struct i2c_device_id i2c_test_id[] = {

        { "i2c_test", 0 },

        { }

};


static struct i2c_driver i2c_test_driver = {

        .probe = i2c_test_probe,

        .remove = __devexit_p(i2c_test_remove),

        .id_table = i2c_test_id,

        .driver = {

                .name  = I2C_TEST_NAME,

                .owner = THIS_MODULE,

        },

};


static void i2c_io_init()

{

        int ret;

        ret = gpio_request(EXYNOS4_GPL0(2), "TP1_EN");

        if(ret) {

                printk(KERN_ERR "failed to request TP1_EN for I2C controln");

        }


        gpio_direction_output(EXYNOS4_GPL0(2), 1);

        s3c_gpio_cfgpin(EXYNOS4_GPL0(2), S3C_GPIO_OUTPUT);

        gpio_free(EXYNOS4_GPL0(2));


        mdelay(5);


        ret = gpio_request(EXYNOS4_GPX0(3), "GPX0_3");

        if(ret) {

                gpio_free(EXYNOS4_GPX0(3));


                ret = gpio_request(EXYNOS4_GPX0(3), "GPX0_3");

                if(ret) {

                        printk("i2c_io_test: Fialed to request GPX0_3 n");

                }

        }

        gpio_direction_output(EXYNOS4_GPX0(3), 0);

        mdelay(200);


        gpio_direction_output(EXYNOS4_GPX0(3), 1);


        s3c_gpio_cfgpin(EXYNOS4_GPX0(3), S3C_GPIO_OUTPUT);

        gpio_free(EXYNOS4_GPX0(3));

        msleep(300);

}


static int __init i2c_test_init(void)

{

        printk("==%s: n", __FUNCTION__);

        i2c_io_init();

        printk("==%s: n", __FUNCTION__);

        return i2c_add_driver(&i2c_test_driver);

}


static void __exit i2c_test_exit(void)

{

        printk("==%s: n", __FUNCTION__);

        i2c_del_driver(&i2c_test_driver);

}


late_initcall(i2c_test_init);

module_exit(i2c_test_exit);


MODULE_LICENSE("GPL");

MODULE_DESCRIPTION("TSI2CTEST");

MODULE_AUTHOR("iTOP");


Makefile:

TARGET_NAME = i2c

#APP_NAME = app_pollkey

obj-m += $(TARGET_NAME).o


KDIR := /home/topeet/chen/kernel-3.0/iTop4412_Kernel_3.0


PWD ?= $(shell pwd)


all:

        make -C $(KDIR) M=$(PWD) modules


#app:$(APP_NAME)

#       arm-none-linux-gnueabi-gcc $(APP_NAME).c -o $(APP_NAME) -static


clean:

        rm -rf *.o *.ko *.mod.c *.symvers *.order

        .$(TARGET_NAME)* $(APP_NAME)


測試結果:

[root@iTOP-4412]# insmod i2c.ko                                                        

[  381.451187] ==i2c_test_init: 

[  382.020037] ==i2c_test_init: 

[  382.021601] ==i2c_test_probe: 

[root@iTOP-4412]# rmmod i2c

[  385.294465] ==i2c_test_exit: 

[  385.296008] ==i2c_test_remove:


7.驅動-i2c數據的傳輸(9.7寸或者7寸屏幕)

i2c_transfer, i2c_msg


struct i2c_msg {

    __u16 addr; /* slave address            */

    __u16 flags;

#define I2C_M_TEN       0x0010  /* this is a ten bit chip address */

#define I2C_M_RD        0x0001  /* read data, from slave to master */

#define I2C_M_NOSTART       0x4000  /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_REV_DIR_ADDR  0x2000  /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_IGNORE_NAK    0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_NO_RD_ACK     0x0800  /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_RECV_LEN      0x0400  /* length will be first received byte */

    __u16 len;      /* msg length               */

    __u8 *buf;      /* pointer to msg data          */

}; 

 

int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);

參數1:probe傳進的client里的adapter

代碼:

i2c_test_read_9x7_7.c

#include

#include

#include

#include

#include

#include

#include

#include

#ifdef CONFIG_HAS_EARLYSUSPEND

#include

#endif

#include

#include

#include

#include


static int i2c_tes_read_reg(struct i2c_client *client,u8 addr, u8 *pdata) {

    u8 buf1[4] = { 0 };

    u8 buf2[4] = { 0 };

    struct i2c_msg msgs[] = {

        {

            .addr    = client->addr,    //0x38

            .flags    = 0,    //寫

            .len    = 1,    //要寫的數據的長度

            .buf    = buf1,

        },

        {

            .addr    = client->addr,

            .flags    = I2C_M_RD,

            .len    = 1,

            .buf    = buf2,

        },

    };

    int ret;

    buf1[0] = addr;

    ret = i2c_transfer(client->adapter, msgs, 2);

    if (ret < 0) {

        pr_err("read reg (0x%02x) error, %dn", addr, ret);

    } else {

        *pdata = buf2[0];

    }

    return ret;

}

static int i2c_tes_read_fw_reg(struct i2c_client *client,unsigned char *val)

{

    int ret;

    *val = 0xff;

    ret = i2c_tes_read_reg(client,0xa6, val);

    printk("ts reg 0xa6 val is %dn",*val);

    return ret;

}



static int i2c_test_probe(struct i2c_client *client, const struct i2c_device_id *id)

{

    unsigned char val;

    printk("==%s:n", __FUNCTION__);

    

    i2c_tes_read_fw_reg(client,&val);

    

    return 0;

}


static int __devexit i2c_test_remove(struct i2c_client *client)

{

    i2c_set_clientdata(client, NULL);

    printk("==%s:n", __FUNCTION__);

    return 0;

}


static const struct i2c_device_id i2c_test_id[] = {

    { "i2c_test", 0 },

    { }

};


static struct i2c_driver i2c_test_driver = {

    .probe        = i2c_test_probe,

    .remove        = __devexit_p(i2c_test_remove),

    .id_table    = i2c_test_id,

    .driver    = {

        .name    = "i2c_test",

        .owner    = THIS_MODULE,

[1] [2] [3]
關鍵字:i2c驅動  API 引用地址:4412 i2c驅動

上一篇:4412 SPI驅動
下一篇:4412 按鍵和中斷

推薦閱讀

? ? ? ?近日,中興通訊順利完成全球首個3.5GHz NSA組網方式的5G終端與系統網絡端到端調通。該測試使用中興通訊全球首款同時支持sub-6GHz和mmWave 5G主流頻段的5G智能手機原型機,基于中興通訊自主研發的5G NR基站和LTE核心網產品,標志著中興通訊5G智能手機向商用完成重大一步?! ∽鳛樾袠I具備完整5G端到端產品和方案能力的廠商之一,中興通訊...
12月30日上午消息,蘋果公司近期發布多款視頻廣告,用于宣傳他們的慢鏡頭自拍視頻功能。  這些視頻廣告的核心宣傳點都是“Slofie”,這其實是蘋果公司自創的一個詞,用來形容最新iPhone 11系列的slo-motion+Selfie(慢鏡自拍)功能,也就是前置攝像頭每秒120幀的攝影能力。“Slofie”這個詞實際上在iOS中找不到,僅僅是蘋果為這個功能使用的營銷...
2020年12月30日,上海擎朗智能科技有限公司宣布完成C輪融資,由軟銀亞洲風險投資公司(SoftBank Ventures Asia)領投,這是該公司在今年內完成的第二輪融資,總融資額達數億元人民幣。本輪融資主要用于進一步加深擎朗配送機器人在國內餐飲市場的滲透、海外市場拓展以及醫療等新事業部的橫向發展,沖盈資本擔任本輪獨家財務顧問。此前,擎朗智能在2020年3...
4412的板子IO都是1.8v的。只有I2C6是用了電平轉換到了3.3v。所以我準備使用I2C6來驅動mpu9250一、首先去掉占用的模塊menuconfig中去掉觸摸的驅動Device Drivers --->Input device support --->Touchscreens --->FT5X0X based touchscreens(去掉)然后是去掉RC522的驅動(SPI占用I2C了)Device Drivers --->SPI support --->< > RC5...

史海拾趣

問答坊 | AI 解惑

義隆書

有要用的來頂一下吧。…

查看全部問答∨

DSP2812外圍芯片的替代產品!!

請教大家,有沒有遇到類似問題的。 一起解決下; 原來DSP2812外圍的電路 電源管理芯片一直使用:TPS75701/TPS75718 FPGA一直使用:XC2S200 DA轉換一直用的DAC7625; 現在以上芯片都面臨難買和即將停產的問題; 請大家幫助一起找下替代產品?!?

查看全部問答∨

什么時候有復試結果

本帖最后由 paulhyde 于 2014-9-15 09:20 編輯 好奇怪,我看了黑龍江,陜西 B題目都推薦12,13個上國家,我是吉林的 ,為什么吉林省才4個隊進國家呢  …

查看全部問答∨

讀《把時間當作朋友》(二):了解心智的力量

原文: 常常有學生問我,“老師,這個方法真的有用么?”在相當長一段時間里,我對 這樣的問題極為不耐煩,總是皺著眉頭的同時盡量顯得心平氣和地說“那——你 覺得呢?”學生通常都是愣了一下,轉身走掉——估計是帶著失望呢。我幾乎都能感覺 ...…

查看全部問答∨

采集系統(NI_CompactDAQ)技術白皮書_常見問題解答.

采集系統(NI_CompactDAQ)技術白皮書_常見問題解答.…

查看全部問答∨

如何讓s3c2440的板子功耗最低?更加省電?

為了更好的了解每個模塊的耗電量,我精簡了板子,現在我的板子上只有5V轉3.3v的芯片,+   1片 s3c2440  +  4片sdram + 1片nandflash ;測試出來系統進入睡眠后5v條件下電流竟然為33mA,我使用ce5.0,睡眠喚醒都能正 ...…

查看全部問答∨

單片機論壇誰給推薦下

國外的關于單片機,嵌入式系統的論壇給推薦一下,謝謝 還有有關的QQ群組…

查看全部問答∨

SYSINTR_MAXIMUM等于多少

SYSINTR_MAXIMUM等于多少?…

查看全部問答∨

想學uCOS了.前輩們來給點忠告和指導吧.謝謝大家了

這個學期有了STM32開發板.一學期時間.它的外設基本摸了一遍.和天天看書混日子比起來感覺真的充實了許多.現在打算看一看嵌入式.正好手頭有stm32f103的板子.想試試看吧以前看過一點邵貝貝教授的書.大家都說好.可能我沒有看過別的沒有比較吧,只是感覺 ...…

查看全部問答∨

TI有沒有一款能同時進兩路圖像信號的DSP芯片,求解答!

請問TI有沒有一款雙通道DSP芯片,能夠同時進兩路圖像信號。如果有的話,是什么型號的,還有它的工作原理。急求解答?。 ?

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 温州市| 肇源县| 通海县| 旅游| 建湖县| 贵港市| 南投县| 基隆市| 咸丰县| 张掖市| 中山市| 广德县| 屯留县| 华容县| 宜春市| 赤峰市| 阳山县| 于田县| 平潭县| 航空| 栖霞市| 龙陵县| 都兰县| 金溪县| 丽江市| 宣化县| 祁连县| 汉沽区| 盈江县| 泽库县| 金昌市| 古交市| 铅山县| 耒阳市| 罗甸县| 新竹县| 台湾省| 贵南县| 清涧县| 洪江市| 泸西县|