米乐m6官网
您现在的位置:首页 > 产品展示 > LED驱动

键盘驱动开发

发布时间:2022-08-19 22:36:56 来源:米乐m6官网

  在加载模块的时分,首要运转的是内核模块的注册函数。它的功用包含内核注册设备以及变量的初始化。

  该接口界说完之后一些便是对这几个详细函数的完结了!现在咱们一同进入下一步吧,是不是觉得其实没什么难度的呢?别那么早高兴着呢?这几个函数的完结时分,涉及到许多技能,包含内核定时器,等候行列的详细完结(堵塞办法),异步办法的详细完结技巧,循环行列。看到这么多技能你是否感到很振奋呢?以下自己将以浅显的办法为你解说,期望你能了解。

  keypad_starttimer();//尖利内核定时器,在固定周期时间内获取键盘新的改变

  首要是从KEY_CS(对应的读入地址,之前能够依据详细的硬件设备界说,比方#define kEY_CS(*

  将读入的键值存入buf[]缓存中,环形缓冲的写指针是head,读指针是tail,前面现已界说过了

  if((KEY_CS & 0xff)!=0xff)//从KEY_CS地址读入数据,若有一个为0则表明有一个按键被按下了(此处硬件电路为低电平有用)

  四.先介绍封闭函数keypad_release(),为什么先介绍它呢?道理很简单,应该它比较简单,先让咱们做下热身运动,在介绍完这个之后,持续会介绍一个比较复杂的函数.

  首要作用是从缓冲区读取键值,经过调用get_data()完结,经过copy_to_user()函数将键值复制到用户的数据区中

  很天然咱们就应该要介绍get_data()函数的完结了,该函数的功用便是从咱们界说的循环行列缓冲区中读出咱们要的键值,所以其实很简单的假如了解循环行列的原理,在此不多加解说,咱们应该具有一般的数据结构相关的常识吧

  上面假如你看得懂得话,那么能够进入下面的学习了,首要介绍的是内核定时器的运用,运用等候行列完结堵塞型I/O,poll体系调用,异步奉告办法,介绍完之后,我将给出一个运用实例,关于有运用过文件操作体系调用的来说,对咱们所写的键盘驱动来说,他们基本上是相同的。废话少说,咱们立刻开端咱们精彩的驱动开发!

  static struct timer_list timer;///////咱们界说的定时器,或许你会问timer_list是什么来的,其实一看称号就应该就知道了,而为什么要用到list那么多定时器呢?其实在linux中还有许多相同的界说,比方说信号,咱们界说的也是信号集,你能够界说该list是一个元素的,也能够是多个的。所以关于timer_list就能够这样描绘:在未来某一个特定时间履行某一系列特定使命的功用。下面咱们还会给出内核中timer_list的详细描绘,

  /////////接下来说下timer-list这个数据结构,假如你不感兴趣的话能够越过,该结构在

  在用户程序履行读操作的时分有或许姑且没有数据能够读取,为此需求让read操作等候,直到有数据能够读取,这便是堵塞型i\o,堵塞型io能够经过运用进程休眠办法完结。在无数据能够读取的时分,选用等候行列让进程休眠,直到有数据抵达的时分才唤醒进程完结数据的读操作。

  在本驱动中的read,若循环行列缓冲区中没有数据,则进程进入休眠态,定时器函数每隔0.2s读取键值一次,将按键状况放入缓冲而且当令唤醒进程读取数据。

  当程序需求进行对多个文件读写时,假如某个文件没有准备好,则体系就会处于读写堵塞的状况,这影响了其他文件的读写,为了防止读写堵塞,一般能够在运用程序中运用poll或许select函数。当poll函数回来时,会给出一个文件是否可读写的标志,运用程序依据不同的标志读写相应的文件,完结非堵塞的读写,poll()函数经过poll体系调用,调用对应设备驱动的poll()接口函数,poll回来不同的标志,奉告主进程文件是否能够读写,这些回来标志存放在include\asm\poll.h中

  POLLRDBAND假如能够从设备读出带外数据,就回来该值,它只可在linux内核的某些网络代码中运用,一般不用在设备驱动程序中

  POLLPRI假如能够无堵塞的读取高优先级(带外)数据,就回来该值,回来该值会导致select

  陈述文件发生反常,认为select八带外数据当作反常处理POLLHUP当读设备的进程抵达文件尾时,驱动程序有必要回来该值,按照select的功用描绘,调用select的进程被奉告进程时可读的。

  POLLWRNORM设备现已准备好,能够写了,就回来该值。一般地做法是(POLLOUTPOLLNORM)

  在本章地驱动程序中,Keypad_poll()函数在缓冲区有新数据时(当head!=tail),回来一个

  尽管大多数时分堵塞型和非堵塞型操作的组合及poll办法能够有用查询设备是否能够读写,可是假如驱动程序能防止自动的查询,改自动为被迫的信号奉告触发,则能够进步程序的功率,这也便是异步奉告的意图。异步奉告向进程发送SIGIO信号,奉告拜访设备的进程,表明该设备现已准备好IO读写了。

  之后便是怎么完结异步奉告的问题了,要发动异步奉告,有必要履行两个过程:首要,需要拟定某个作为文件的“属主”。文件属主的进程ID保存在filp-f_owner中,这能够经过fcntl()体系调用履行F_SETOWN指令设置。此外,用户程序还有必要曙色之设备的FASYNC标志,以真实发动异步奉告机制。这儿的FASYNC标志也运用fcntl()设置。

  在完结这两个过程之后,当新数据抵达时就会发生一个SIGNO信号,此信号发送到存放在filp-owner中的进程。