Rumah php教程 PHP开发 一个嵌入式Linux系统的键盘驱动实现 (1)(2)

一个嵌入式Linux系统的键盘驱动实现 (1)(2)

Dec 23, 2016 pm 02:03 PM

初始化部分。这部分包括硬件层和软件层上的初始化。在本例中,需要先对矩阵电路和SN74hc164芯片所使用到的GPIO端口作配置,以使CPU可以对它们进行控制和访问。为了要将某个GPIO端口配置成输入输出或者是中断源,需要在对应的GPIO控制寄存器中设置正确的值,具体的值可以通过查阅S3C2410开发板手册来获得。比如,为了将GPB1设置成SN74hc164的输入端,需要将GPBCON这个控制字中2,3两位设置成二进制的01,为了将GPG6设置成电压低跳变中断源,需要将GPGCON中12,13两位设置成二进制的10。在完成了硬件初始化操作以后,就是软件层上的初始化了。首先将键盘中断处理函数注册到系统,然后设置好一个定时器结构,以便在中断发生时将其挂到内核的定时器队列中去,该定时器将触发对键盘的扫描操作。最后通过SN74hc164将矩阵电路的16列置零。

中断处理部分。如前所述,这部分软件应该完成的工作就是扫描特殊键盘,确定哪个键被按下,并且拿到稳定的扫描码,然后调用内核导出函数handle_scancode。在这个应用中,该特殊键盘的布局与PC标准键盘的布局比较相似,所以我们直接将PC键盘上对应键的系统扫描码作为我们特殊键盘上各个键的扫描码,同时我们将PC键盘驱动程序中扫描码到键码的转换函数pckbd_translate作为我们的kbd_translate函数。

确定哪一个键被按下的算法如下。在中断到来时,我们已经可以根据中断号确定被按下的键在哪一行,我们还需要确定被按下的键在哪一列。为此,我们先给串联的两个SN74hc164芯片送一个CLR信号,清零,然后送16个1,使得特殊键盘的列均为高电位,此时我们在键盘的行端口读到的都是高电位。在16个时钟脉冲下,给SN74hc164芯片送入1个0和15个1,使得0在每一列上都唯一出现一次,于此同时在键盘行端口进行扫描。当被按下键所在列置0时,其所在行就会读到一个低电位。使用这种“走0法”,我们就可以确定出键盘上哪个键被按下了。但是这种简单的扫描算法还不够,因为在这种类型的矩阵扫描键盘中,键的每次按下和抬起都会有10~20ms(这段时间的长短由硬件特性决定)的毛刺抖动存在,如图2所示,所以为了获取稳定的按键信息,必须要想办法去掉这种抖动,才能避免将用户的一次按键误当作几次按键来处理。去毛刺的一种常见的方法是在有键盘中断到达时,并不立即去扫描键盘,而是先等待一段时间,等跳过毛刺抖动以后再去扫描键盘,其伪代码如下所示:

等待一段时间,跳过抖动;

扫描键盘;

if 键盘上没有键被按下

结束返回;

if 键盘上有键被按下

再次等待一段时间然后检查同样的键是否依然处于被按下状态;

if 同样的键任然是按下

将读到的扫描码返回;

else

直接返回;

这种解决方案固然可行,但是它使用了忙等的方法去毛刺,在忙等期间,系统做不了任何有用的工作。这对于计算资源本身就很有限的嵌入式Linux系统来说,是一种奢侈的浪费。本应用中,我们设计了一种适合嵌入式系统的去毛刺解决方案,使用效果良好。

由于Linux内核提供了定时器队列,所以我们可以使用这种机制来避免忙等,提高系统的性能。当键盘上有键被按下时,键盘中断处理程序首先关闭中断源,进入轮询模式,将一个timerlist对象挂入定时器队列以后就结束了。挂入内核的定时器按时地被触发,它所触发的函数完成以下一些工作:先对整个键盘上所有的键进行一次扫描,并且将扫描得到的结果保存到一个静态2维数组变量snap_shot_matrix[16][4]中。该变量描述的是在本次键盘扫描的这个时刻,键盘上所有键的按下情况。如果某个键没有被按下,即处于松开状态,那么将snap_shot_matrix中对应的值置为0,如果某个键处于按下状态,那么将snap_shot_matrix中对应的值作自增1操作,若该值在自增1以后大于某个预先指定的数,我们就可以认为这是一个稳定值,并且将另一个大小为16*4的2维数组变量current_matrix对应坐标中的值置1,否则置0。这个变量描述的就是当前键盘上按键情况的稳定值了。也就是说我们首先把在本次扫描中得到的采样数据作处理以后保存到snap_shot_matrix中,然后依据该变量中的值,过滤得到current_matrix,通过这样一个过程来做去毛刺处理。在得到了本次扫描的稳定值current_matrix以后,我们将其与上次得到的稳定值previous_matrix作比较,从而确定与上次扫描时相比,此刻键盘上的按键情况是否发生了变化,以及此刻键盘上是否有键按下。如果发现键盘上没有任何键被按下,则打开键盘中断,再次切回到中断模式。如果键盘上有键被按下,并且是不同于上次扫描到的被按下键,我们立刻调用按键处理函数process_key,它会调用键盘驱动中的上层函数handle_scancode。如果键盘上按下的键就是上次按下的那个键,我们将递增一个计数器,当这个计数器达到某个指定值以后,我们就启动所谓的Auto repeat功能,即用户一直按着某个键,驱动程序自动重复产生键盘输入。该计数器在被按下键发生变化时置0。但是只要键盘上仍然有键处于被按下状态,我们就将当前读到的键盘稳定值current_matrix拷贝到previous_matrix中去,并且再次将前面描述的定时器对象挂到内核定时器队列中,过一段时间以后再次扫描整个键盘,直至键盘上没有键被按下。

4 结束语

随着信息社会以及计算机软硬件技术的进步,嵌入式信息产品的设计和应用得到了迅速的发展,需要为自己的嵌入式Linux系统添加特殊键盘驱动的需求也越来越普遍。本文在介绍了Linux中键盘驱动程序的整体框架以后,以S3C2410开发板上的一个特殊键盘为例子,重点描述了在嵌入式Linux环境下,为特殊键盘编写驱动程序时需要完成的工作,为类似的开发提供了一种思路和参考。


(T114)

 以上就是一个嵌入式Linux系统的键盘驱动实现 (1)(2)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Menggunakan Pengurus Tugas dalam Linux Menggunakan Pengurus Tugas dalam Linux Aug 15, 2024 am 07:30 AM

Terdapat banyak soalan yang sering ditanya oleh pemula Linux, "Adakah Linux mempunyai Pengurus Tugas?", "Bagaimana untuk membuka Pengurus Tugas pada Linux Pengguna dari Windows tahu bahawa Pengurus Tugas sangat berguna?" Anda boleh membuka Pengurus Tugas dengan menekan Ctrl+Alt+Del dalam Windows. Pengurus tugas ini menunjukkan kepada anda semua proses yang sedang berjalan dan memori yang mereka gunakan, dan anda boleh memilih dan mematikan proses daripada program pengurus tugas. Apabila anda mula-mula menggunakan Linux, anda juga akan mencari sesuatu yang setara dengan pengurus tugas di Linux. Pakar Linux lebih suka menggunakan baris arahan untuk mencari proses, penggunaan memori, dll., tetapi anda tidak perlu melakukannya

Selesaikan masalah paparan graf dan carta yang bercelaru pada pelayan pemantauan Cina Zabbix Selesaikan masalah paparan graf dan carta yang bercelaru pada pelayan pemantauan Cina Zabbix Jul 31, 2024 pm 02:10 PM

Sokongan Zabbix untuk bahasa Cina tidak begitu baik, tetapi kadangkala kami masih memilih bahasa Cina untuk tujuan pengurusan Dalam antara muka web yang dipantau oleh Zabbix, orang Cina di bawah ikon grafik akan memaparkan petak kecil. Ini tidak betul dan memerlukan muat turun fon. Contohnya, "Microsoft Yahei", "Microsoft Yahei.ttf" dinamakan "msyh.ttf", muat naik fon yang dimuat turun ke /zabbix/fonts/fonts dan ubah suai dua aksara dalam /zabbix/include/defines.inc.php fail di define('ZBX_GRAPH_FONT_NAME','DejaVuSans');define('ZBX_FONT_NAME'

7 cara untuk membantu anda menyemak tarikh pendaftaran pengguna Linux 7 cara untuk membantu anda menyemak tarikh pendaftaran pengguna Linux Aug 24, 2024 am 07:31 AM

Tahukah anda, bagaimana untuk menyemak tarikh penciptaan akaun pada sistem Linux? Jika anda tahu, apa yang anda boleh lakukan? Adakah anda berjaya? Jika ya, bagaimana untuk melakukannya? Pada asasnya sistem Linux tidak menjejaki maklumat ini, jadi apakah cara alternatif untuk mendapatkan maklumat ini? Anda mungkin bertanya mengapa saya menyemak ini? Ya, terdapat situasi di mana anda mungkin perlu menyemak maklumat ini dan ia akan membantu anda pada masa itu. Anda boleh menggunakan 7 kaedah berikut untuk mengesahkan. Gunakan /var/log/secure Gunakan alat aureport Gunakan .bash_logout Gunakan arahan chage Gunakan arahan useradd Gunakan arahan passwd Gunakan arahan terakhir Kaedah 1: Gunakan /var/l

Ajar anda cara menambah fon pada Fedora dalam masa 5 minit Ajar anda cara menambah fon pada Fedora dalam masa 5 minit Jul 23, 2024 am 09:45 AM

Pemasangan seluruh sistem Jika anda memasang fon seluruh sistem, ia akan tersedia kepada semua pengguna. Cara terbaik untuk melakukan ini ialah menggunakan pakej RPM daripada repositori perisian rasmi. Sebelum memulakan, buka alat "Perisian" dalam Fedora Workstation, atau alat lain menggunakan repositori rasmi. Pilih kategori "Tambahan" dalam bar pilihan. Kemudian pilih "Fon" dalam kategori. Anda akan melihat fon yang tersedia serupa dengan fon dalam tangkapan skrin di bawah: Apabila anda memilih fon, beberapa butiran akan muncul. Bergantung pada beberapa senario, anda mungkin boleh melihat beberapa contoh teks untuk fon. Klik butang "Pasang" untuk menambahkannya pada sistem anda. Bergantung pada kelajuan sistem dan lebar jalur rangkaian, proses ini mungkin mengambil sedikit masa untuk diselesaikan

Apakah yang perlu saya lakukan jika fon WPS yang hilang di bawah sistem Linux menyebabkan fail menjadi bercelaru? Apakah yang perlu saya lakukan jika fon WPS yang hilang di bawah sistem Linux menyebabkan fail menjadi bercelaru? Jul 31, 2024 am 12:41 AM

1. Cari font wingdings, wingdings2, wingdings3, Webdings, dan MTExtra dari Internet 2. Masukkan folder utama, tekan Ctrl+h (tunjukkan fail tersembunyi), dan semak jika terdapat folder .fonts satu. 3. Salin fon yang dimuat turun seperti wingdings, wingdings2, wingdings3, Webdings, dan MTExtra ke folder .fonts dalam folder utama Kemudian mulakan wps untuk melihat jika masih terdapat dialog peringatan "System missing font kotak. Jika tidak, hanya Kejayaan Nota: wingdings, wingdin

Pemasangan dan konfigurasi Centos 7 pelayan penyegerakan masa rangkaian NTP Pemasangan dan konfigurasi Centos 7 pelayan penyegerakan masa rangkaian NTP Aug 05, 2024 pm 10:35 PM

Persekitaran percubaan: OS: LinuxCentos7.4x86_641 Lihat zon waktu pelayan semasa & senaraikan zon waktu dan tetapkan zon waktu (jika sudah menjadi zon waktu yang betul, sila langkau): #timedatectl#timedatectllist-timezones#timedatectlset-timezoneAsia. /Shanghai2 Memahami konsep zon waktu: GMT, UTC, CST, DSTUTC: Seluruh bumi dibahagikan kepada dua puluh empat zon waktu Setiap zon waktu mempunyai waktu tempatan sendiri, demi penyatuan. masa bersatu digunakan, dipanggil Masa Selaras Sejagat (UTC :UniversalTim).

Bagaimana untuk menyambungkan dua hos Ubuntu ke Internet menggunakan satu kabel rangkaian Bagaimana untuk menyambungkan dua hos Ubuntu ke Internet menggunakan satu kabel rangkaian Aug 07, 2024 pm 01:39 PM

Cara menggunakan satu kabel rangkaian untuk menyambungkan dua hos ubuntu ke Internet 1. Sediakan hos A: ubuntu16.04 dan hos B: ubuntu16.042 Hos A mempunyai dua kad rangkaian, satu disambungkan ke rangkaian luaran dan satu lagi disambungkan menjadi tuan rumah B. Gunakan arahan iwconfig untuk melihat semua kad rangkaian pada hos. Seperti yang ditunjukkan di atas, kad rangkaian pada hos A pengarang (komputer riba) ialah: wlp2s0: Ini ialah kad rangkaian wayarles. enp1s0: kad rangkaian berwayar, kad rangkaian yang disambungkan ke hos B. Selebihnya tiada kaitan dengan kita, tidak perlu ambil peduli. 3. Konfigurasikan IP statik A. Edit fail #vim/etc/network/interfaces untuk mengkonfigurasi alamat IP statik untuk antara muka enp1s0, seperti ditunjukkan di bawah (di mana #==========

lambung! Menjalankan DOS pada Raspberry Pi lambung! Menjalankan DOS pada Raspberry Pi Jul 19, 2024 pm 05:23 PM

Seni bina CPU yang berbeza bermakna menjalankan DOS pada Raspberry Pi tidak mudah, tetapi ia tidak banyak masalah. FreeDOS mungkin biasa kepada semua orang. Ia adalah sistem pengendalian yang lengkap, percuma dan serasi untuk DOS. Ia boleh menjalankan beberapa permainan DOS lama atau perisian komersial, dan juga boleh membangunkan aplikasi terbenam. Selagi program boleh berjalan pada MS-DOS, ia boleh berjalan pada FreeDOS. Sebagai pemula dan penyelaras projek FreeDOS, ramai pengguna akan bertanya kepada saya soalan sebagai orang dalam. Soalan yang paling kerap saya tanya ialah: "Bolehkah FreeDOS dijalankan pada Raspberry Pi?" Lagipun, Linux berjalan dengan baik pada Raspberry Pi

See all articles