Raspberry Pi Input01

实验目标

了解驱动与链接,以及键盘和如何在显示器上显示文本。

链接

静态链接库与动态链接库都是共享代码的方式,它允许我们通过链接的方式实现代码调用。静态链接库直接将代码地址写入到操作系统中,而动态链接库则是在加载的过程中实现链接,本实验采用的是静态链接的方式。

键盘实现键入更新

在计算机当中,重复查看某一更新被称为轮询,这种方法经常在I/O当中使用,在本实验当中也是通过这种轮询的方法来查看键盘是否有新的输入。

具体步骤如下:

  1. 取回存入的键盘地址(默认初始为0)
  2. 如果不为0则说明有当前键入值,那么跳到步骤9
  3. 使用UsbCheckForChange函数来检测是否有新的函数值更新
  4. 使用KeyboardCount检测现在有多少键
  5. 当返回0时说明没有找到设备
  6. 使用KeyboardGetAddress函数去得到第一个键盘地址
  7. 存入地址
  8. 有错误产生返回0
  9. 重复使用6次KeyboardGetKeyDown函数取得每一个键值并存储
  10. 使用KeyboardPoll函数
  11. 如果没有错误则跳转到步骤3
.section .text
.globl KeyboardUpdate
KeyboardUpdate:
push {r4,r5,lr}

kbd .req r4
ldr r0,=KeyboardAddress
ldr kbd,[r0]

teq kbd,#0
bne haveKeyboard$

getKeyboard$:
bl UsbCheckForChange

首先将KeyboardAddress存入r4中,并判断其是否为0,当地址为0则说明发生错误没有找到键盘,那么就使用UsbCheckForChange来查找新设备,但是这一步消耗资源较大,尽量避免。

teq r0,#0
ldreq r1,=KeyboardAddress
streq r0,[r1]
beq return$

mov r0,#0
bl KeyboardGetAddress

当没有找到键盘是,理应获取不到键盘地址,那么就应该将r0初始化为0后继续进行返回来查看地址。

saveKeys$:
mov r0,kbd
mov r1,r5
bl KeyboardGetKeyDown

ldr r1,=KeyboardOldDown
add r1,r5,lsl #1
strh r0,[r1]
add r5,#1
cmp r5,#6
blt saveKeys$

这里就是采用轮询的方式来获取键入值

mov r0,kbd
bl KeyboardPoll

teq r0,#0
bne getKeyboard$

return$:
pop {r4,r5,pc}
.unreq kbd

成功获取当前键入值之后使调用KeyboardPoll函数。

然后根据键盘匹配的字符表来进行比对从而得到每一个按键所代表的字符信息,完成信息键入。