編輯:關於Android編程
一、 I2C簡介
I2C(Inter-Integrated Circuit)總線是一種由 Philips 公司開發的兩線式串行總線,用於連接微控制器及其外圍設備。I2C 總線最主要的優點就是簡單性和有效性,簡單體現在接線簡單,只有兩根線數據線(SCL)和時鐘線(SDA),而且 控制簡單。所以一些封裝較小的器件多使用I2C總線,常見的使用I2C總線的設備有EEPROM、RTC及一些傳感器。這裡我們介紹下基於linux的I2C設備驅動的編寫。
一種是直接操作CPU的I2C控制器,正對於某一個設備寫一個字符驅動,這種驅動相對來說比較直接,不需要太依賴於內核相關配置,但是這類設備驅動依賴CPU,可移植性較差。
一種是基於linux內核I2C子系統完成設備驅動的編寫,一般內核會繼承相關CPU的控制器驅動即使沒有也可以通過技術支持可以獲得,所以我們只需要使用linux下I2C子系統提供的相關接口來構建我們的設備驅動就行了。這樣我們的設備驅動並不依賴於某一個特定的CPU,可移植性較好。I2C 總線是由數據線 SDA 和時鐘 SCL 構成的串行總線,各種被控制器件均
並聯在這條總線上,每個器件都有一個唯一的地址識別,可以作為總線上的一個
1. 空閒狀態:SDA 和 SCL 都為高電平。
2. 開始條件(S):SCL 為高電平時,SDA 由高電平向低電平跳變,開始傳送數據。
3. 結束條件(P):SCL 為高電平時,SDA 由低電平向高電平跳變,結束傳送數據。
4. 數據有效:在 SCL 的高電平期間,SDA 保持穩定,數據有效。SDA 的改變只能發生在 SCL 的低電平期間。
5. ACK 信號:數據傳輸的過程中,接收器件每接收一個字節數據要產生一個 ACK 信號,向發送器件發出特定的低電平脈沖,表示已經收到數據。
I2C 總線必須由主器件(通常為微控制器)控制,主器件產生串行時鐘(SCL),同時控制總線的傳輸方向,並產生開始和停止條件。
數據傳輸中,首先由主器件產生開始條件,隨後是器件的控制字節(前七位是從器件的地址,最後一位為讀寫位)。接下來是讀寫操作的數據,以及 ACK響應信號。數據傳輸結束時,主器件產生停止條件。具體的過程如圖 2 所示。
struct module *owner; /* 所屬模塊 */ unsigned int id; /* algorithm 的類型,定義於 i2c-id.h,以 I2C_ALGO_開始 */ unsigned int class; const struct i2c_algorithm *algo; /* 總線通信方法結構體指針 */ void *algo_data; /* algorithm 數據 */ struct rt_mutex bus_lock; int timeout; /* 超時時間,以 jiffies 為單位 */ int retries; /* 重試次數 */ struct device dev; /* 控制器設備 */ int nr; char name[48]; /* 控制器名稱 */ struct completion dev_released; /* 用於同步 */ struct mutex userspace_clients_lock; struct list_head userspace_clients;};
/* I2C 傳輸函數指針 */ int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); /* smbus 傳輸函數指針 */ int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, u8 command, int size, union i2c_smbus_data *data); /* 返回控制器支持的功能 */ u32 (*functionality) (struct i2c_adapter *);}; i2c_algorithm中的關鍵函數master_xfer()用於產生I2C訪問周期需要的信號, 以 i2c_msg(即 I2C 消息)為單位。
__u16 addr; /* 從設備地址 */ __u16 flags; /* 消息類型 */ __u16 len; /* 消息長度 */ __u8 *buf; /* 消息數據 */};
unsigned short flags; /* 標志 */ unsigned short addr; /* 低 7 位的芯片地址 */ char name[I2C_NAME_SIZE]; /* 設備名稱 */ struct i2c_adapter *adapter; /* 依附的 i2c_adapter */ struct i2c_driver *driver; /* 依附的 i2c_driver */ struct device dev; int irq; /* 設備使用的中斷號 */ struct list_head detected;};
unsigned int class; int (*attach_adapter)(struct i2c_adapter *); /* 依附 i2c_adapter 函數指針 */ int (*detach_adapter)(struct i2c_adapter *); /* 脫離 i2c_adapter 函數指針 */ int (*probe)(struct i2c_client *, const struct i2c_device_id *); int (*remove)(struct i2c_client *); void (*shutdown)(struct i2c_client *); int (*suspend)(struct i2c_client *, pm_message_t mesg); int (*resume)(struct i2c_client *); void (*alert)(struct i2c_client *, unsigned int data); int (*command)(struct i2c_client *client, unsigned int cmd, void *arg); struct device_driver driver; const struct i2c_device_id *id_table; /* 該驅動所支持的設備 ID 表 */ int (*detect)(struct i2c_client *, struct i2c_board_info *); /* 設備探測函數 */ const unsigned short *address_list; /* 驅動支持的設備地址 */ struct list_head clients; /* 掛接探測到的支持的設備 */};
SurfaceHolder.Callback (2012-03-09 09:15:44) 轉載▼ 標簽: 雜談 分類: android
ScaleType設置圖解圖文相配很清晰的看出每個屬性的效果,感覺 CENTER_CROP 比較有用,長寬自動適應 ImageView ,整個圖片自動縮略填充整個區域且居
?GCM網絡管理器能讓app注冊能執行面向網絡的服務,每個任務只是完成一個工作。它的API能處理這些任務,允許Google Play Services通過系統集中處理這些
說實話,對於xUtils,是我最近才用到的開發框架(也是剛接觸),對於其功能不得不說,簡化了很多的開發步驟,可以說是非常好的開發工具,但是其最近更新到3.0也