i2c-davinci.c分析

來源:互聯網
上載者:User

最近剛開了這個部落格,人家說要做好開源就一定要經常記筆記,寫部落格,將資料拿出來大家分享,最近正好在學習linux驅動,把這個拿出來寫寫,望大家指點。

 

關於i2c_davinci.c檔案:位於drivers/i2c/busses/目錄下

開頭一大堆的define,看這部分:

#define DAVINCI_I2C_OAR_REG       
0x00

#define DAVINCI_I2C_IMR_REG       
0x04

#define DAVINCI_I2C_STR_REG        
0x08

#define DAVINCI_I2C_CLKL_REG     
0x0c

#define DAVINCI_I2C_CLKH_REG    
0x10

#define DAVINCI_I2C_CNT_REG       
0x14

#define DAVINCI_I2C_DRR_REG       
0x18

#define DAVINCI_I2C_SAR_REG        
0x1c

#define DAVINCI_I2C_DXR_REG       
0x20

#define DAVINCI_I2C_MDR_REG      
0x24

#define DAVINCI_I2C_IVR_REG         
0x28

#define DAVINCI_I2C_EMDR_REG   
0x2c

#define DAVINCI_I2C_PSC_REG        
0x30

這裡包含REG尾碼,是定義了關於DM365中I2C相關寄存器的位移地址,參考DM365的datasheet能夠找到匹配。

#define DAVINCI_I2C_IVR_AAS         
0x07

#define DAVINCI_I2C_IVR_SCD
0x06

#define DAVINCI_I2C_IVR_XRDY     
0x05

#define DAVINCI_I2C_IVR_RDR        
0x04

#define DAVINCI_I2C_IVR_ARDY     
0x03

#define DAVINCI_I2C_IVR_NACK     
0x02

#define DAVINCI_I2C_IVR_AL  
0x01

 

#define DAVINCI_I2C_STR_BB 
BIT(12)

#define DAVINCI_I2C_STR_RSFULL 
BIT(11)

#define DAVINCI_I2C_STR_SCD        
BIT(5)

#define DAVINCI_I2C_STR_ARDY     
BIT(2)

#define DAVINCI_I2C_STR_NACK    
BIT(1)

#define DAVINCI_I2C_STR_AL 
BIT(0)

 

#define DAVINCI_I2C_MDR_NACK  
BIT(15)

#define DAVINCI_I2C_MDR_STT      
BIT(13)

#define DAVINCI_I2C_MDR_STP       
BIT(11)

#define DAVINCI_I2C_MDR_MST     
BIT(10)

#define DAVINCI_I2C_MDR_TRX     
BIT(9)

#define DAVINCI_I2C_MDR_XA        
BIT(8)

#define DAVINCI_I2C_MDR_RM       
BIT(7)

#define DAVINCI_I2C_MDR_IRS        
BIT(5)

 

#define DAVINCI_I2C_IMR_AAS       
BIT(6)

#define DAVINCI_I2C_IMR_SCD        
BIT(5)

#define DAVINCI_I2C_IMR_XRDY    
BIT(4)

#define DAVINCI_I2C_IMR_RRDY    
BIT(3)

#define DAVINCI_I2C_IMR_ARDY    
BIT(2)

#define DAVINCI_I2C_IMR_NACK    
BIT(1)

#define DAVINCI_I2C_IMR_AL 
BIT(0)

這段是幾個寄存器的位元遮罩,分別是IVR、STR、MDR、IMR寄存器。

 

static inline void davinci_i2c_write_reg(struct davinci_i2c_dev *i2c_dev,

                                  
 int reg, u16 val)

{

      
__raw_writew(val, i2c_dev->base + reg);

}

這個函數:是寫寄存器,將val值寫到reg中。擷取基址加offset,即得到寄存器的地址。類似的davinci_i2c_read_reg是讀取寄存器的值。

 

static void generic_i2c_clock_pulse(unsigned int scl_pin)函數是設定I2C引腳SCL,使其產生脈衝。但是函數中for迴圈是10次,也就是只產生10次脈衝。

 

static void i2c_recover_bus(struct davinci_i2c_dev *dev)

這個函數是“bus clear”,函數中完成三部分,第一步是發送NACK訊號,第二是寫入模式寄存器,然後發送停止位訊號。這個注釋中寫是bus recovery是特定於I2C協議的。

 

davinci_i2c_reset_ctrl函數是完成對I2C匯流排的複位控制。

 

i2c_davinci_calc_clk_dividers函數是計算時鐘,預分頻神馬的,具體為什麼這麼計算,有點搞不清楚。

 

i2c_davinci_init函數是初始化I2C,開中斷,擷取分頻數,時鐘數等等。

 

i2c_davinci_wait_bus_not_busy函數:讀取狀態寄存器STR的內容和其位BB(Bus
Busy)的內容,等待超過最大重試次數(這裡是2),就返回錯誤,否則就調用i2c_recover_bus和i2c_davinci_init函數來初始化I2C匯流排。

 

i2c_davinci_xfer_msg函數:傳遞msg。

 

terminate_read終止讀。terminate_write終止寫

 

//目前讀來,所有這些函數大部分都是調用了davinci_i2c_read_reg和davinci_i2c_write_reg這兩個函數來操作DM365的I2C的寄存器。之前不明白在何處操作寄存器的問題終於有點明白了!但是還是有點不太明白的是我們怎麼操作這些寄存器呢?真是看的太痛苦了!

 

i2c_davinci_isr中斷服務,I2C中斷時會調用這個函數。

 

i2c_davinci_cpufreq_transition這個函數不是很明白。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.