由於PocketBeagle板上的Power按鍵是透過PMIC連接,因此,需要連接另一個按鍵來使用,司徒選定27腳位,如下圖:
連接27腳位到+3.3V
在此篇範例中,司徒使用Timer做按鍵檢查,當按鍵被按下時,點亮LED,反之則熄滅LED,因此,需要使用Linux Kernel的GPIO操作函數以及Timer,針對GPIO的輸入應用,步驟如下:
1. gpio_request() 2. gpiod_direction_input() 3. gpiod_get_raw_value() 4. gpio_free()
ldd.S
.global init_module .global cleanup_module .equ BUTTON, 27 .equ USR3_LED, ((32 * 1) + 24) .equ PERIOD, (100 / 4) .equ timer_list.entry, 0 .equ timer_list.expires, 8 .equ timer_list.function, 12 .equ timer_list.data, 16 .equ timer_list.flags, 20 .struct 0 timer_list_s: i0: .struct . + 8 i1: .struct . + 4 i2: .struct . + 4 i3: .struct . + 4 i4: .struct . + 4 timer_list_e: timer_list_l = timer_list_e - timer_list_s .section .modinfo, "ae" __UNIQUE_ID_0: .asciz "license=GPL" __UNIQUE_ID_1: .asciz "author=Steward Fu" __UNIQUE_ID_2: .asciz "description=Linux Driver" .section .data led_name: .asciz "USR3" btn_name: .asciz "BTN" led_desc: .dcb 4 btn_desc: .dcb 4 timer: .space timer_list_l .align 2 .section .text timer_handler: push {lr} ldr r0, =btn_desc ldr r0, [r0] bl gpiod_get_raw_value mov r1, r0 ldr r0, =led_desc ldr r0, [r0] bl gpiod_set_raw_value ldr r0, =timer ldr r1, =jiffies ldr r1, [r1] add r1, #PERIOD bl mod_timer pop {pc} init_module: push {r4, lr} mov r0, #BUTTON ldr r1, =btn_name bl gpio_request mov r0, #USR3_LED ldr r1, =led_name bl gpio_request mov r0, #BUTTON bl gpio_to_desc mov r4, r0 ldr r1, =btn_desc str r4, [r1] mov r0, r4 bl gpiod_direction_input mov r0, #USR3_LED bl gpio_to_desc mov r4, r0 ldr r1, =led_desc str r4, [r1] mov r0, r4 mov r1, #1 bl gpiod_direction_output_raw ldr r0, =timer mov r1, #0 mov r2, #0 mov r3, #0 bl init_timer_key ldr r0, =timer add r0, #timer_list.function ldr r1, =timer_handler str r1, [r0] ldr r0, =timer add r0, #timer_list.data mov r1, #0 str r1, [r0] ldr r0, =timer ldr r2, =jiffies ldr r1, [r2] add r1, #PERIOD ldr r3, =timer_handler bl mod_timer mov r0, #0 pop {r4, pc} cleanup_module: push {lr} ldr r0, =timer bl del_timer mov r0, #BUTTON bl gpio_free mov r0, #USR3_LED bl gpio_free pop {pc} .end
init_module: 初始化GPIO以及Timer
timer_handler: 取得按鍵狀態並且設定到USR3 LED
cleanup_module: 釋放GPIO以及Timer資源
完成