最近剛開了這個部落格,人家說要做好開源就一定要經常記筆記,寫部落格,將資料拿出來大家分享,最近正好在學習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這個函數不是很明白。