原创

龙芯软件开发(29)-- 键盘初始化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://mysoft.blog.csdn.net/article/details/1493721
如果你的记性好,也许看到前面有一些键盘初始化了,但那里的初始化是设置南桥接收键盘数据输入和输出而已,只是一个接口,或者是一个代理。在这里才是开始真正初始化键盘,让键盘工作在合适的方式。在电脑里,显示卡输出信息给人看,而键盘扮演着另一个角色,就是让人们可以输入东西,控制电脑做各种各样的事情。虽然电脑的历史也有60年了,并且技术也在飞速地发展,但是键盘还是作为重要的输入方式。希望我们大家能发明一种更好的输入方式,语音输入?还是脑电波输入?也许很快就到来。下面来仔细地分析键盘初始化的实现,代码如下:
int kbd_initialize(void)
{
    int status;
    int count;
   
    /* Flush the buffer */
    kbd_clear_input();
上面清除键盘输入缓冲里的数据。由于键盘采用环形缓冲作为输入缓冲区,如果不清除输入的内容,就不是当时按键的内容了。
 
    /*
     * Test the keyboard interface.
     * This seems to be the only way to get it going.
     * If the test is successful a x55 is placed in the input buffer.
     */
    kbd_write_command_w(KBD_CCMD_SELF_TEST);
    if (kbd_wait_for_input() != 0x55) {
       printf("Self test cmd failed,ignored!/n");
       //return 1;
    }
上面进行键盘测试。
 
 
    /*
     * Perform a keyboard interface test. This causes the controller
     * to test the keyboard clock and data lines. The results of the
     * test are placed in the input buffer.
     */
    kbd_write_command_w(KBD_CCMD_KBD_TEST);
    if (kbd_wait_for_input() != 0x00) {
       printf("KBD_TEST cmd failed,ignored!/n");
       //return 1;
    }
上面进行键盘接口测试。
 
    /*
     * Enable the keyboard by allowing the keyboard clock to run.
     */
    kbd_write_command_w(KBD_CCMD_KBD_ENABLE);
上面设置键盘时钟开始运行。
 
    /*
     * Reset keyboard. If the read times out
     * then the assumption is that no keyboard is
     * plugged into the machine.
     * This defaults the keyboard to scan-code set 2.
     *
     * Set up to try again if the keyboard asks for RESEND.
     */
    count = 0;
    do {
       kbd_write_output_w(KBD_CMD_RESET);
       status = kbd_wait_for_input();
       if (status == KBD_REPLY_ACK)
           break;
       if (status != KBD_REPLY_RESEND) {
           printf("reset failed/n");
           if (++count > 1) break;
           //return 2;
       }
    } while (1);
 
    if (kbd_wait_for_input() != KBD_REPLY_POR) {
       printf("NO POR, ignored!/n");
       //return 3;
    }
上面进行键盘复位设置。
 
 
    /*
     * Set keyboard controller mode. During this, the keyboard should be
     * in the disabled state.
     *
     * Set up to try again if the keyboard asks for RESEND.
     */
    count = 0;
    do {
       kbd_write_output_w(KBD_CMD_DISABLE);
       status = kbd_wait_for_input();
       if (status == KBD_REPLY_ACK)
           break;
       if (status != KBD_REPLY_RESEND){
           printf("disable failed/n");
           if (++count > 1) break;
           //return 4;
       }
    } while (1);
 
    kbd_write_command_w(KBD_CCMD_WRITE_MODE);
    kbd_write_output_w(KBD_MODE_KBD_INT
                 | KBD_MODE_SYS
                 | KBD_MODE_DISABLE_MOUSE
                 | KBD_MODE_KCC);
上面设置键盘的控制模式。
 
#if 1
    /* ibm powerpc portables need this to use scan-code set 1 -- Cort */
    if (!(kbd_write_command_w_and_wait(KBD_CCMD_READ_MODE) & KBD_MODE_KCC))
    {
       /*
        * If the controller does not support conversion,
        * Set the keyboard to scan-code set 1.
        */
       kbd_write_output_w(0xF0);
       kbd_wait_for_input();
       kbd_write_output_w(0x01);
       kbd_wait_for_input();
    }
#endif
    if (kbd_write_output_w_and_wait(KBD_CMD_ENABLE) != KBD_REPLY_ACK) {
       return 5;
    }
上面设置键盘输入的编码方式。
 
 
    /*
     * Finally, set the typematic rate to maximum.
     */
    if (kbd_write_output_w_and_wait(KBD_CMD_SET_RATE) != KBD_REPLY_ACK) {
       return 6;
    }
    if (kbd_write_output_w_and_wait(0x00) != KBD_REPLY_ACK) {
       return 7;
    }
上面设置键盘的按键速度。
 
    return 0;
}
 
通过上面的初始化设置,就可以接收键盘输入了。
 
展开阅读全文

龙芯笔试题(软件开发

11-11

1、x86处理器中物理页面的大小为:_______rn2、编译过程的五个阶段_____________________rn3、下列C程序执行后,指针p的值为________rn int *p=0;p++;rn4、linux2.6以后,内核中是通过什么方式分配进程描述符task_struct?又是通过什么方式来寻找该进程的task_struct指针的?rn5、举例说明C语言中volatile、static、const的用途rn6、i++和i=i+1的区别rn7、堆和栈的区别rn8、进程和线程的区别rn9、写一个C函数,若处理器是Big_endian,则返回0,若处理器是Little_endian,则返回1。rn10、写出gcc编译过程(源文件为hello.c)rn11、采用行命令或shell脚本删除当前目录的下一个目录(这个目录大小为零)rn12、只用putchar,用C语言实现printdec(int x)打印十进制数rn13、[code=c]int c=1;rnvoid f()rnrnprintf("1:&c is %p\n",&c)rnif(fork())rnrnprintf("2:&c is %p\n",&c);rnc=2;rnprintf("3:&c is %p\n",&c);rnrnelsernprintf("4:&c is %p\n",&c);rnc=3;rnprintf("5:&c is %p\n",&c);rnrnrn[/code]rnfork后面那个执行那段代码,3处打印rn1),fork完后哪个是父进程?rn2)打印地址一样吗?rn3)其物理地址一样吗?rn4)描述一下复制过程系统的行为rn5)赋值后c的内容是多少?rn14、请写出下列程序的运行结果:rn1)[code=c]void GetMemory(char *p)rnrnp=(char *)malloc(100);rnrnvoid Test(void)rnchar *str=NULL;rnGetMemory(str);rnstrcpy(str,"hello world");rnprintf(str);rn[/code]rn2)[code=c]char *GetMemory(void)rnrnchar p[]="hello world";rnreturn p;rnrnvoid Test(void)rnchar *str=NULL;rnstr=GetMemory();rnstrcpy(str,"hello world");rnprintf(str);rn[/code]rn3)[code=c]void GetMemory(char **p,int num)rnrn*p=(char *)malloc(num);rnrnvoid Test(void)rnchar *str=NULL;rnGetMemory(&str,100);rnstrcpy(str,"hello");rnprintf(str);rn[/code]rn4)[code=c]rnvoid Test(void)rnchar *str=(char *)malloc(100);rnGetMemory(str);rnstrcpy(str,"hello");rnfree(str);rnif(str!=NULL)rnstrcpy(str,"world");rnprintf(str);rn[/code] 论坛

没有更多推荐了,返回首页