前言
cpu要控制週邊裝置, 只有兩個指令, write和read, 反映在driver上的寫法, 就是設兩個函數, wrie(), raed()
每個裝置的register都有address, 要記住每個裝置的register的位址, 是不可能的事, 每用一次register就要去查一次datasheet
非常浪費時間
此外write和read函數的寫法,是write(address, data) , 和 val=read(address)
假設你會對此裝置, 讀寫2000次, 對寫write指令來說就是, address和data各寫2000次, 合起來也就是4000次
若寫一個address要3秒, 寫一個data 也要3秒, 那寫完這段程式就要12000秒, 要3.3小時
標頭檔
寫一個標頭檔, 定義裝置的base address, 和各個register 的offset, 使用的程式只要呼叫此標頭檔即可
例如:要GPIO裝置輸出資料, 則可寫成 write(GPIO_BASE + DATA_OUT, 0x55), 只要查詢標頭檔
就可以知道要用哪一個register, 並且此種寫法, 也比較好懂, 看文字敘述總比看16進制的數字來的清楚
gpio.h
#define GPIO_BASE 0x00300000
#define DATA_OUT 0x20
未使用標頭檔之前 使用標頭檔之後
write(0x00300020, 0x55) write(GPIO_BASE + DATA_OUT, 0x55)
(必須查datasheet才知道要填offset 0x20, (查標頭檔即可, 並且這段碼可以看懂
並且, 16進制的數字, 看不懂這段碼的意義) 看懂是做data out 的動作)
函數進化(API)
更進一步, 可以將write/read函數用gpio_write/gpio_read的函數包起來, gpio_write的寫法如下
gpio_write(int data)
{
write(GPIO_BASE + DATA_OUT, data);
}
使用時, 只要寫 gpio_write(0x55),
好處是, 這樣碼更精簡, 一樣不用查datasheet, 只要查標頭檔定義哪些函數即可
一樣能了解意義, 並且不用多寫GPIO_BASE 和 DATA_OUT, 加快編碼的時間最少3倍
同理, 要從gpio讀資料回來, val=gpio_read;
清清楚楚, 完全不用管用哪一個register, 又好懂, 又寫的快