一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I2C控制器驅(qū)動(dòng)介紹

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-22 15:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

控制器驅(qū)動(dòng)

I2C 總線驅(qū)動(dòng)重點(diǎn)是 I2C 適配器驅(qū)動(dòng),這里要用到兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu):i2c_adapter 和 i2c_algorithm。其中,Linux 內(nèi)核將 SOC 的 I2C 適配器(控制器)抽象成 i2c_adapter。

對(duì)于一個(gè) I2C 適配器,肯定要對(duì)外提供讀寫 API 函數(shù),設(shè)備驅(qū)動(dòng)程序可以使用這些 API 函數(shù)來完成讀寫操作。i2c_algorithm 就是 I2C 適配器與 I2C 設(shè)備進(jìn)行通信的方法。

I2C 總線驅(qū)動(dòng),或者說 I2C 適配器驅(qū)動(dòng)的主要工作就是初始化 i2c_adapter 結(jié)構(gòu)體變量,然后設(shè)置 i2c_algorithm 中的 master_xfer 函數(shù)。完成以后通過 i2c_add_numbered_adapter 或 i2c_add_adapter 這兩個(gè)函數(shù)向系統(tǒng)注冊(cè)設(shè)置好的 i2c_adapter。

I2C 控制器驅(qū)動(dòng)加載

設(shè)備樹 mt6885.dts

圖片

驅(qū)動(dòng)

圖片

驅(qū)動(dòng)和設(shè)備樹匹配以后,probe 函數(shù)開始執(zhí)行,重要的地方博主都進(jìn)行了注釋,不重要的部分進(jìn)行了刪除。

static int mt_i2c_probe(struct platform_device *pdev)
{
 int ret = 0;
 struct mt_i2c *i2c; //控制器結(jié)構(gòu)體
 unsigned int clk_src_in_hz;
 struct resource *res;
 const struct of_device_id *of_id;
  
  //申請(qǐng)內(nèi)存
 i2c = devm_kzalloc(&pdev- >dev, sizeof(struct mt_i2c), GFP_KERNEL);

  //獲取設(shè)備樹節(jié)點(diǎn)
 ret = mt_i2c_parse_dt(pdev- >dev.of_node, i2c);

  //從設(shè)備樹獲取 I2C 控制器寄存器物理基地址
 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

  //進(jìn)行內(nèi)存映射,得到 Linux 內(nèi)核使用的虛擬地址
 i2c- >base = devm_ioremap_resource(&pdev- >dev, res);

  .....
  
  //獲取中斷號(hào)
 i2c- >irqnr = platform_get_irq(pdev, 0);

 init_waitqueue_head(&i2c- >wait);

  //請(qǐng)求中斷,中斷服務(wù)函數(shù)為 mt_i2c_irq
 ret = devm_request_irq(&pdev- >dev, i2c- >irqnr, mt_i2c_irq,
  IRQF_NO_SUSPEND | IRQF_TRIGGER_NONE, I2C_DRV_NAME, i2c);

 of_id = of_match_node(mtk_i2c_of_match, pdev- >dev.of_node);

  //填充 adapter 結(jié)構(gòu)體各個(gè)參數(shù)
 i2c- >dev_comp = of_id- >data;
 i2c- >i2c_pll_info = &i2c_pll_info;
 i2c- >adap.dev.of_node = pdev- >dev.of_node;
 i2c- >dev = &i2c- >adap.dev;
 i2c- >adap.dev.parent = &pdev- >dev;
 i2c- >adap.owner = THIS_MODULE;
 i2c- >adap.algo = &mt_i2c_algorithm;
 i2c- >adap.algo_data = NULL;
 i2c- >adap.timeout = 2 * HZ;
 i2c- >adap.retries = 1;
 i2c- >adap.nr = i2c- >id;
 spin_lock_init(&i2c- >cg_lock);

  ......

 mutex_init(&i2c- >i2c_mutex);
 ret = i2c_set_speed(i2c, clk_src_in_hz);

 ret = mt_i2c_clock_enable(i2c);

 mt_i2c_init_hw(i2c);

 mt_i2c_clock_disable(i2c);
  
  // DMA 相關(guān)
 if (i2c- >ch_offset_default)
  i2c- >dma_buf.vaddr = dma_alloc_coherent(&pdev- >dev,
   (PAGE_SIZE * 2), &i2c- >dma_buf.paddr, GFP_KERNEL);
 else
  i2c- >dma_buf.vaddr = dma_alloc_coherent(&pdev- >dev,
   PAGE_SIZE, &i2c- >dma_buf.paddr, GFP_KERNEL);

 if (i2c- >dma_buf.vaddr == NULL) {
  dev_info(&pdev- >dev, "dma_alloc_coherent failn");
  return -ENOMEM;
 }
 i2c_set_adapdata(&i2c- >adap, i2c);
  
  //向 Linux 內(nèi)核注冊(cè) i2c_adapter
 ret = i2c_add_numbered_adapter(&i2c- >adap);

 platform_set_drvdata(pdev, i2c);

 return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17113

    瀏覽量

    184353
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1918

    瀏覽量

    86946
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1541

    瀏覽量

    127879
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    GPIO模擬I2C總線的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

    I2C總線簡(jiǎn)單方便,是我們經(jīng)常使用的一種總線。但有時(shí)候我們的MCU沒有足夠多的I2C控制器來實(shí)現(xiàn)我們的應(yīng)用,所幸我可以使用普通的GPIO引腳來模擬低速的I2C總線通信。這一節(jié)我們就來實(shí)
    發(fā)表于 12-14 14:19 ?5914次閱讀
    GPIO模擬<b class='flag-5'>I2C</b>總線的<b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)與實(shí)現(xiàn)

    實(shí)現(xiàn)I2C總線控制器的VHDL源代碼

    I2C總線控制器 altera提供 The I2C Controller was designed for the MC68307 uC, provides a simplified
    發(fā)表于 05-20 10:25 ?251次下載

    I2C總線在Linux系統(tǒng)中的驅(qū)動(dòng)設(shè)計(jì)

    介紹I2C總線的基本概念和工作原理,敘述I2C總線擴(kuò)展器件ZLG7290的功能特點(diǎn)。在以S3C2410為微控制器,ZLG7290為
    發(fā)表于 12-29 16:52 ?40次下載

    MAXQ2000微控制器軟件I2C驅(qū)動(dòng)

    摘要:;C (內(nèi)置于集成電路)是一種2線接口,實(shí)現(xiàn)集成電路之間的雙向通信。本應(yīng)用筆記介紹MAXQ2000微控制器的軟件
    發(fā)表于 04-23 10:17 ?844次閱讀
    MAXQ2000微<b class='flag-5'>控制器</b>軟件<b class='flag-5'>I2C</b><b class='flag-5'>驅(qū)動(dòng)</b>

    基于Verilog的I2C控制器的設(shè)計(jì)與綜合

    為滿足嵌入式系統(tǒng)中專用芯片功能不能達(dá)到系統(tǒng)要求的現(xiàn)狀,設(shè)計(jì)出一種功能可擴(kuò)展的I2C slave控制器,這種控制器與傳統(tǒng)的專用I2C芯片不同。專用的I
    發(fā)表于 10-25 16:58 ?60次下載
    基于Verilog的<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>的設(shè)計(jì)與綜合

    I2C控制器使用指南

    確保I2C控制器已經(jīng)和計(jì)算機(jī)連接,如果沒有連接或驅(qū)動(dòng)沒有正常安裝則在選擇設(shè)備欄將出現(xiàn)如下提示。
    發(fā)表于 03-08 14:48 ?50次下載
    <b class='flag-5'>I2C</b><b class='flag-5'>控制器</b>使用指南

    I2C總線控制器的工作原理及EEPROM的Linux驅(qū)動(dòng)程序的設(shè)計(jì)

    I2C (Inter-Integrated Circuit1總線是一種由Philips公司開發(fā)的2線式串行總線,用于連接微控制器及其外圍設(shè)備。它是同步通信的一種特殊形式,具有接口線少、控制
    發(fā)表于 10-26 15:37 ?7次下載
    <b class='flag-5'>I2C</b>總線<b class='flag-5'>控制器</b>的工作原理及EEPROM的Linux<b class='flag-5'>驅(qū)動(dòng)</b>程序的設(shè)計(jì)

    fireflyFace-RK3399主板I2C控制器介紹

    Face-RK3399 開發(fā)板上有 9 個(gè)片上 I2C 控制器,
    的頭像 發(fā)表于 12-04 09:17 ?3297次閱讀
    fireflyFace-RK3399主板<b class='flag-5'>I2C</b><b class='flag-5'>控制器</b><b class='flag-5'>介紹</b>

    i2c總線用來做什么_i2c總線數(shù)據(jù)傳輸過程

    I2C總線控制器為微控制器或微處理提供控制I2C總線的接口,它
    發(fā)表于 11-24 14:16 ?7514次閱讀

    Linux驅(qū)動(dòng)I2C設(shè)備驅(qū)動(dòng)(基于Freescale i.MX6ULL平臺(tái)了解I2C驅(qū)動(dòng)框架,順便寫個(gè)簡(jiǎn)陋的MPU6050驅(qū)動(dòng)

    I2C總線驅(qū)動(dòng)加載到內(nèi)核的過程3.2 I2C總線驅(qū)動(dòng)如何操作硬件3.3 I2C設(shè)備 <----->
    發(fā)表于 12-06 13:51 ?8次下載
    Linux<b class='flag-5'>驅(qū)動(dòng)</b>:<b class='flag-5'>I2C</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>(基于Freescale <b class='flag-5'>i</b>.MX6ULL平臺(tái)了解<b class='flag-5'>I2C</b>的<b class='flag-5'>驅(qū)動(dòng)</b>框架,順便寫個(gè)簡(jiǎn)陋的MPU6050<b class='flag-5'>驅(qū)動(dòng)</b>)

    嵌入式內(nèi)核及驅(qū)動(dòng)開發(fā)-09IIC子系統(tǒng)框架使用(I2C協(xié)議和時(shí)序,I2C驅(qū)動(dòng)框架,I2C從設(shè)備驅(qū)動(dòng)開發(fā),MPU6050硬件連接

    從設(shè)備adapter i2c 控制器對(duì)象數(shù)據(jù)包對(duì)象讀寫數(shù)據(jù)設(shè)備樹中添加MPU6050信息內(nèi)核選配添加設(shè)備樹節(jié)點(diǎn)編寫驅(qū)動(dòng)程序 mpu6050_i2c_drv.cI2c協(xié)議和時(shí)序
    發(fā)表于 12-06 14:06 ?17次下載
    嵌入式內(nèi)核及<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)-09IIC子系統(tǒng)框架使用(<b class='flag-5'>I2C</b>協(xié)議和時(shí)序,<b class='flag-5'>I2C</b><b class='flag-5'>驅(qū)動(dòng)</b>框架,<b class='flag-5'>I2C</b>從設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā),MPU6050硬件連接

    linux移植MPU6050的I2C驅(qū)動(dòng)

    有MPU6050的例程,測(cè)試后很好用,如下圖(夢(mèng)幻聯(lián)動(dòng)一下:樹莓派PICO+freeRTOS)因?yàn)閜ico上有現(xiàn)成的能用的例程,所以改一改之后直接移植到linux上首先介紹一下linux下的I2C框架①、I2C 總線
    發(fā)表于 12-06 14:21 ?10次下載
    linux移植MPU6050的<b class='flag-5'>I2C</b><b class='flag-5'>驅(qū)動(dòng)</b>

    硬件I2C與模擬I2C

    硬件I2C對(duì)應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動(dòng)電路,其所使用的I2C管腳也是專用的,因而效率要遠(yuǎn)高于軟件模擬的
    發(fā)表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    Linux I2C驅(qū)動(dòng)入門知識(shí)科普

    I2C 總線驅(qū)動(dòng), I2C總線驅(qū)動(dòng)就是SOC的 I2C控制器
    的頭像 發(fā)表于 12-29 13:59 ?2096次閱讀

    I2C子系統(tǒng)SW Architecture

    適配器(控制器驅(qū)動(dòng),這里用到兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu):i2c_adapter 和 i2c_algorithm。其中,Linux 內(nèi)核將 SOC 的 I
    的頭像 發(fā)表于 07-22 16:01 ?1236次閱讀
    <b class='flag-5'>I2C</b>子系統(tǒng)SW Architecture