linux之i2c子系統架構

来源:http://www.cnblogs.com/chd-zhangbo/archive/2016/02/18/5199224.html
-Advertisement-
Play Games

編寫i2c設備驅動(從設備)一般有兩種方式: 1.用戶自己編寫獨立的從設備驅動,應用程式直接使用即可。 2.linux內核內部已經實現了一個通用的設備驅動,利用通用設備驅動編寫一個應用程式(用戶態驅動),在應用程式中用到大量設備驅動提供的介面,通過應用程式來控制從設備。 匯流排驅動 4.1 概述 I2


 

 

編寫i2c設備驅動(從設備)一般有兩種方式:

1.用戶自己編寫獨立的從設備驅動,應用程式直接使用即可。

2.linux內核內部已經實現了一個通用的設備驅動,利用通用設備驅動編寫一個應用程式(用戶態驅動),在應用程式中用到大量設備驅動提供的介面,通過應用程式來控制從設備。

 

 

 匯流排驅動

4.1 概述

I2C匯流排驅動是I2C適配器的軟體實現,提供I2C適配器與從設備間完成數據通信的能力,比如起始,停止,應答信號和master_xfer的實現函數。

I2C匯流排驅動由i2c_adapter和i2c_algorithm來描述

 

4.2 S3c2440I2C控制器的硬體描述

S3c2440處理器內部集成了一個I2C控制器,通過四個寄存器來進行控制:

IICCON     I2C控制寄存器

IICSTAT     I2C狀態寄存器

IICDS       I2C收發數據移位寄存器

IICADD     I2C地址寄存器

通過IICCON,IICDS,IICADD寄存器操作,可在I2C匯流排上產生開始位、停止位、數據和地址,而傳輸的狀態則通過IICSTAT寄存器來獲取。

 

4.3 i2c-s3c2410匯流排驅動分析(platform_driver)

I2C匯流排驅動代碼在drivers/i2c/busses/i2c-s3c2410.c,這個代碼同樣支持s3c2410,s3c6410,s5pc110等Samsung 系列的晶元。

 

初始化模塊和卸載模塊

[cpp] view plaincopy  
  1. static int __init i2c_adap_s3c_init(void)  
  2. {  
  3.          returnplatform_driver_register(&s3c24xx_i2c_driver);  
  4. }  
  5.    
  6. static void __exit i2c_adap_s3c_exit(void)  
  7. {  
  8.          platform_driver_unregister(&s3c24xx_i2c_driver);  
  9. }  

匯流排驅動是基於platform來實現的,很符合設備驅動模型的思想。

[cpp] view plaincopy  
  1. static struct platform_drivers3c24xx_i2c_driver = {  
  2.          .probe                = s3c24xx_i2c_probe,  
  3.          .remove            = s3c24xx_i2c_remove,  
  4.          .id_table  = s3c24xx_driver_ids,  
  5.          .driver                = {  
  6.                    .owner     = THIS_MODULE,  
  7.                    .name       = "s3c-i2c",  
  8.                    .pm  = S3C24XX_DEV_PM_OPS,  
  9.                    .of_match_table= s3c24xx_i2c_match,  
  10.          },  
  11. };  

s3c24xx_i2c_probe函數

當調用platform_driver_register函數註冊platform_driver結構體時,如果platformdevice 和 platform driver匹配成功後,會調用probe函數,來初始化適配器硬體。

[cpp] view plaincopy  
  1. static int s3c24xx_i2c_probe(structplatform_device *pdev)  
  2. {  
  3.          ……  
  4.          /*初始化適配器信息 */  
  5.          strlcpy(i2c->adap.name,"s3c2410-i2c", sizeof(i2c->adap.name));  
  6.          i2c->adap.owner   = THIS_MODULE;  
  7.          i2c->adap.algo    = &s3c24xx_i2c_algorithm;  
  8.          i2c->adap.retries= 2;  
  9.          i2c->adap.class   = I2C_CLASS_HWMON | I2C_CLASS_SPD;  
  10.          i2c->tx_setup     = 50;  
  11.    
  12.          /*初始化自旋鎖和等待隊列頭 */  
  13.          spin_lock_init(&i2c->lock);  
  14.          init_waitqueue_head(&i2c->wait);  
  15.    
  16.          /*映射寄存器 */  
  17.          res= platform_get_resource(pdev, IORESOURCE_MEM, 0);  
  18.          i2c->ioarea= request_mem_region(res->start, resource_size(res),  
  19.                                                 pdev->name);  
  20.          i2c->regs= ioremap(res->start, resource_size(res));  
  21.    
  22.          /*設置I2C核心需要的信息 */  
  23.          i2c->adap.algo_data= i2c;  
  24.          i2c->adap.dev.parent= &pdev->dev;  
  25.    
  26.          /*初始化I2C控制器 */  
  27.          ret= s3c24xx_i2c_init(i2c);  
  28.    
  29.          /*申請中斷 */  
  30.          i2c->irq= ret = platform_get_irq(pdev, 0);  
  31.          ret= request_irq(i2c->irq, s3c24xx_i2c_irq, 0,  
  32.                               dev_name(&pdev->dev), i2c);  
  33.    
  34.    /* 註冊I2C適配器 */  
  35.          ret= i2c_add_numbered_adapter(&i2c->adap);  
  36.          ……  
  37. }  

Probe主要工作是時能硬體並申請I2C適配器使用的IO地址,中斷號等,然後向I2C核心添加這個適配器。I2c_adapter註冊過程i2c_add_numbered_adapter->i2c_register_adapter

 

I2C匯流排通信方法

[cpp] view plaincopy  
  1. static const struct i2c_algorithms3c24xx_i2c_algorithm = {  
  2.          .master_xfer             = s3c24xx_i2c_xfer,  
  3.          .functionality             = s3c24xx_i2c_func,  
  4. };  

s3c24xx_i2c_xfer函數是匯流排通信方式的具體實現,依賴於s3c24xx_i2c_doxfer和s3c24xx_i2c_message_start兩個函數;

[cpp] view plaincopy  
  1. static int s3c24xx_i2c_doxfer(structs3c24xx_i2c *i2c,  
  2.                                   struct i2c_msg *msgs, int num)  
  3. {  
  4.          ret =s3c24xx_i2c_set_master(i2c);  
  5.    
  6.          i2c->msg     = msgs;  
  7.          i2c->msg_num= num;  
  8.          i2c->msg_ptr= 0;  
  9.          i2c->msg_idx= 0;  
  10.          i2c->state   = STATE_START;  
  11.    
  12.          s3c24xx_i2c_message_start(i2c,msgs);  
  13. }  

首先設置s3c I2C設備器為主設備,然後調用s3c24xx_i2c_message_start函數啟動I2C消息傳輸。

s3c24xx_i2c_func函數返回適配器所支持的通信功能。

 

4.4 適配器的設備資源(platform_device)

S3c2440的I2C匯流排驅動是基於platform來實現,前面我們分析了platformdriver部分,再來看下platform device部分。

在arch/arm/plat-samsung/dev-i2c0.c文件中定義了platform_device結構體以及I2C控制器的資源信息:

[cpp] view plaincopy  
  1. static struct resource s3c_i2c_resource[] ={  
  2.          [0]= {  
  3.                    .start= S3C_PA_IIC,  
  4.                    .end   = S3C_PA_IIC + SZ_4K - 1,  
  5.                    .flags= IORESOURCE_MEM,  
  6.          },  
  7.          [1]= {  
  8.                    .start= IRQ_IIC,  
  9.                   .end  = IRQ_IIC,  
  10.                    .flags= IORESOURCE_IRQ,  
  11.          },  
  12. };  
  13.    
  14. struct platform_device s3c_device_i2c0 = {  
  15.          .name                 = "s3c2410-i2c",   /* 設備名 */  
  16. #ifdef CONFIG_S3C_DEV_I2C1  
  17.          .id               = 0,  
  18. #else  
  19.          .id               = -1,  
  20. #endif  
  21.          .num_resources         =ARRAY_SIZE(s3c_i2c_resource),  
  22.          .resource   =s3c_i2c_resource,  
  23. };  
  24.    
  25. struct s3c2410_platform_i2cdefault_i2c_data __initdata = {  
  26.          .flags                  = 0,  
  27.          .slave_addr      = 0x10,  /* I2C適配器的地址 */  
  28.          .frequency        = 100*1000,  /* 匯流排頻率 */  
  29.          .sda_delay        = 100,   /* SDA邊沿延遲時間ns */  
  30. };  
  31.    
  32. void __init s3c_i2c0_set_platdata(structs3c2410_platform_i2c *pd)  
  33. {  
  34.          structs3c2410_platform_i2c *npd;  
  35.    
  36.          if(!pd)  
  37.                    pd= &default_i2c_data;  
  38.    
  39.          npd= s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),  
  40.                                    &s3c_device_i2c0);  
  41.    
  42.          if(!npd->cfg_gpio)  
  43.                    npd->cfg_gpio= s3c_i2c0_cfg_gpio;  
  44. }  

在板文件中把platform_device註冊進內核:

[cpp] view plaincopy  
  1. static struct platform_device*mini2440_devices[] __initdata = {  
  2.          ……  
  3.          &s3c_device_i2c0,  
  4. ……  
  5. };  

調用s3c_i2c0_set_platdata 函數把適配器具體的數據賦值給dev.platform_data:

[cpp] view plaincopy  
  1. static void __init mini2440_init(void)  
  2. {  
  3.          ……  
  4. s3c_i2c0_set_platdata(NULL);  
  5. }  

I2C匯流排驅動就分析到這裡。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原創文章,轉載必需註明出處:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-s-cursor-1/ 最近一段時間做項目寫的T-Sql代碼老是用到游標(Cursor),所以就研究研究它的
  • 1Led硬體原理簡單介紹 Led的電路比較簡單,一般是使用三極體搭建一個控制電路。如下圖所示,是原理圖中兩個Led的控制電路。KP_COL0和VDD50_EN網路控制Led的通斷。
  • 在free命令中有個參數l,它表示 show detailed low and high memory statistics。其實最先是對High Memory總是為零有些不解(Linux是64為)。其實更不解的是關於low memory、high memory。那麼關於low memory和hig...
  • 1. 常用命令 ls 顯示當前目錄下的文件和文件夾; -ltr 按時間順序顯示文件和文件夾的詳細信息,不帶參數的時候 只顯示文件夾和文件。 vi 打開文件的內容 tar -cvf file.tar file 壓縮成tar包 tar -xvf file.tar file 解壓縮tar包,後面的file
  • 轉載自:http://blog.csdn.net/luo86106/article/details/6946255 .gz 解壓1:gunzip FileName.gz 解壓2:gzip -d FileName.gz 壓縮:gzip FileName .tar.gz 解壓:tar zxvf File
  • ubuntu系統自帶截圖功能使用介紹 ubuntu自定義截圖快捷鍵:Shift+PrtSc 截取當前視窗快捷鍵:Alt+PrtSc 保存全屏截圖:PrtSc
  • 改進uwsgi啟動腳本,使其支持多個獨立配置文件。
  • 寫在前面 2012年寫的,僅供參考 反彙編的目的 缺乏某些必要的說明資料的情況下, 想獲得某些軟體系統的源代碼、設計思想及理念, 以便複製, 改造、移植和發展; 從源碼上對軟體的可靠性和安全性進行驗證,對那些直接與CPU 相關的目標代碼進行安全性分析; 涉及的主要內容 分析ARM處理器指令的特點,以
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...