按鍵驅動程式之查詢方式的總結

2021-07-26 13:10:12 字數 1244 閱讀 4738

按鍵驅動程式和led驅動程式相似,框架都是一樣的。

file_operations中定義

static struct file_operations second_drv_fops = ;

而這個程式使用的是查詢方式,所以要把引腳配置為輸入模式。看了原理圖可以知道,三個按鍵分別對應gpiog5、6、7pin,當按鍵按下的時候是低電平。所以要設定的暫存器就是gpgcon,還要讀取gpgdat的資料。

在second_drv_open()函式中實現按鍵的配置,配置為輸入模式,需要往暫存器裡寫00:

*gpgcon &= ~((0x3<<(5*2)) | (0x3<<(6*2)) | (0x3<<(7*2)));

還要在second_drv_read()函式裡讀取gpgdat的值。我認為這才是這個驅動程式的核心。由於是3個按鍵,因此要unsigned char key_value[3];int valkey = *gpgdat;這樣我們就定義了乙個長度為3的陣列,傳遞的時候把陣列的位址傳給應用程式就可以了。那如何取出暫存器某一位的值呢?比如pin5,我們可以valkey & (1<<5),如果結果為0,則第5位的值就為0。因此有

key_value[0] = (valkey & (1<<5)) ? 1 : 0;

同理有:

key_value[1] = (valkey & (1<<6)) ? 1 : 0;

key_value[2] = (valkey & (1<<7)) ? 1 : 0;

這樣,我們就完成了對按鍵值的儲存。接下來就是拷貝到應用程式了,需要用到copy_to_user(buff,key_value, sizeof(key_value));這樣,整個驅動程式就完成了。

還要注意,應在second_drv_init()和second_drv_exit()完成對位址的重對映和解除。

接下來就是測試程式了:

int fd;

int cnt=0;

unsigned char key_values[3];//定義乙個儲存按鍵值的陣列

fd = open(「/dev/buttons」, o_rdwr);

if (fd < 0)

printf(「can』t open\n」);

while(1)

}如此,這個測試程式就完結了。

但是在執行之後可以看到,一旦按下按鍵就會列印出很多個資訊,並且後台執行,輸入top命令可以看到這個程式占用了cpu 99%的資源,是有缺陷的,因此又引出了下一節,用中斷方式的按鍵驅動程式。

arm 驅動基礎 查詢方式的按鍵驅動程式

原理圖 驅動程式 include include include include include include include include include include static struct class seconddrv class static struct class devic...

查詢方式的按鍵驅動程式框架詳解

static struct class button class static int major 0 先定義主裝置號1 用來尋找驅動程式 static struct button operations p button opr 在.件後定義b opr結構體後,在.c檔案中定義結構體的指標全域性變數...

按鍵對映 4 查詢方式來寫按鍵驅動程式 詳解

本節目標 寫second程式,內容 通過查詢方式驅動按鍵 1.寫出框架 1.1寫file oprations結構體,second drv open函式,second drv read函式 1.2寫入口函式,並自動建立裝置節點,修飾入口函式 1.3寫出口函式,並自動登出裝置節點,修飾出口函式 1.4 ...