Linux學習筆記 驅動篇(三) 按鍵與彙編

2021-09-01 23:45:42 字數 2748 閱讀 8233

按鍵輸入實驗

#define gpioeout (*(volatile unsigned int )0xc001e000) // 輸出的電平

#define gpioeoutenb ((volatile unsigned int )0xc001e004) // 輸出使能

#define gpioealtfn0 ((volatile unsigned int )0xc001e020) // 對應的焊腳功能選擇

#define gpioealtfn1 ((volatile unsigned int )0xc001e024) // 對應的焊腳功能選擇

gpioa28 輸入

#define gpioaoutenb ((volatile unsigned int )0xc001a004) // 輸出使能

#define gpioaaltfn0 ((volatile unsigned int )0xc001a020) // 低16位 對應的焊腳功能選擇

#define gpioaaltfn1 ((volatile unsigned int )0xc001a024) // 高16位 對應的焊腳功能選擇

#define gpioapad ((volatile unsigned int *)0xc001a018) // 讀gpio值

void delay(int val);

void _start(void)

else

gpioeout |= (1<<13);//gpioe13 output 1 }}

void delay(int val)

用彙編來寫點燈程式

程式如下

.global _start // 全域性變數定義

_start:

ldr r0, =0xc001e020 // 將0xc001e020作為位址賦給r0

ldr r1, [r0] //將r0即位址0xc001e020的內容賦給r1

bic r1, r1, #(3<<26) //r1=r1 & ~(3<<26),因為bic自動取反

str r1,[r0] //將r1儲存到位址0xc001e020

ldr r0, =0xc001e004 // 設定成輸出

ldr r1, [r0]

orr r1, r1, #(1<<13);

str r1,[r0];

_loop: // 迴圈

ldr r0 , =0xc001e000 // 設定輸出值

ldr r1, [r0]

bic r1 , r1,#0x2000 // (1<<13) 與操作,設定為0 燈亮

str r1,[r0];

bl _delay // 執行延時函式

ldr r1, [r0]

orr r1 , r1,#0x2000 // (1<<13) 或操作,設定為1 燈滅

str r1,[r0];

bl _delay // 執行延時函式

b _loop // 繼續迴圈

_delay:

mov r4, #0x4000000

d_loop:

subs r4,r4,#1

cmp r4,#0

bne d_loop

mov pc , lr

注意:

1)檔案的字尾是大寫的s,小寫的.s編譯會不過的(編譯環境ubuntu18.04 arm-linux-gcc)

2)mov pc ,lr ---- 相當於子函式呼叫返回return

3)**塊可以直接用 name: 表示

4)對於_start 函式入口,需要在檔案頭定義成全域性變數

.global _start // 全域性變數定義

5)ldr和mov 的區別

ldr 是arm指令集中的

.ldr偽指令用於載入32位的立即數或乙個位址值到指定暫存器;

若載入的常數未超出 mov 或 mvn 的範圍,則使用 mov 或 mvn 指令代替該 ldr 偽指令

mov 是 16位的;

資料傳送指令.將 8 位立即數或暫存器(operand2)傳送到目標暫存器(rd)

6)bic 和 and 的區別

bic 會把對應位先取反再相與

位清除指令.將暫存器rn的值與operand2的值的反碼按位作邏輯與操作,結果儲存到 rd 中.指令格式如下:

bicrd,rn,operand2

bic r1,r1,#0x0f ;將 r1 的低 4 位清零,其它位不變

and 直接和對應數相與

邏輯與操作指令.將 operand2 值與暫存器 rn 的值按位作邏輯與操作,結果儲存到rd 中.指令格式如下:

and rd,rn,operand2

ands r0r0#x01 ;r0=r0&0x01取出最低位資料

7)str 的作用

str rd,addressing 儲存字資料 [addressing]←rd,addressing 索引 str

;str 指令用於將暫存器中的資料儲存到記憶體(儲存器位址).

8)bl和b的區別

b 跳轉指令.跳轉到指定的位址執行程,不能返回,使用於迴圈操作

bl帶鏈結的跳轉指令.指令將下一條指令的位址拷貝到 r14(即 lr)鏈結暫存器中,然後跳轉到指定位址執行程式.可以用mov pc , lr 返回到呼叫處

Linux驅動 按鍵驅動

開發板 tiny6410 核心版本 linux2.6.38 要想寫出案件驅動 需要複習的知識 1 混雜裝置的使用原理 2 系統呼叫驅動函式的原理 3 中斷處理機制 4 阻塞性裝置驅動的書寫規範 1 混雜裝置的註冊和使用比較簡單,以前也複習過,這裡不再複習 3 中斷處理機制 也有部落格內容中斷處理機制...

Linux系統按鍵驅動

linux系統下對於按鍵裝置不僅可以進行讀操作,還可以進行寫操作。對鍵盤 滑鼠等裝置進行寫操作可以實現模擬按鍵的功能。另外,想知道 dev input eventx分別是哪些裝置可以通過執行下面的命令進行檢視,如下所示 yuhaiping neolix cat proc bus input devi...

linux鍵盤按鍵驅動

1.先來介紹以下幾個結構體使用和函式,下面 中會用到 1 input dev驅動裝置結構體中常用成員如下 struct input dev2.然後開始寫 1 向核心申請input dev結構體 2 設定input dev的成員 3 註冊input dev 驅動裝置 4 初始化定時器和中斷 5 寫中斷...