static int sixth_drv_init(void)
{
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">初始化 timer 定义的这个软件定时器</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
init_timer(</span>&<span style="color: rgba(0, 0, 0, 1)">buttons_timer);
buttons_timer.function </span>=<span style="color: rgba(0, 0, 0, 1)"> buttons_timer_function;
add_timer(</span>&buttons_timer);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">告诉内核有这样一个定时器</span>
major = register_chrdev(0, "sixth_drv", &sencod_drv_fops);
sixthdrv_class </span>= class_create(THIS_MODULE, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sixth_drv</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
sixthdrv_class_dev </span>= class_device_create(sixthdrv_class, NULL, MKDEV(major, <span style="color: rgba(128, 0, 128, 1)">0</span>), NULL, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">buttons</span><span style="color: rgba(128, 0, 0, 1)">"</span>); <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> /dev/buttons </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
gpfcon </span>= (<span style="color: rgba(0, 0, 255, 1)">volatile</span> unsigned <span style="color: rgba(0, 0, 255, 1)">long</span> *)ioremap(<span style="color: rgba(128, 0, 128, 1)">0x56000050</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">);
gpfdat </span>= gpfcon + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
gpgcon </span>= (<span style="color: rgba(0, 0, 255, 1)">volatile</span> unsigned <span style="color: rgba(0, 0, 255, 1)">long</span> *)ioremap(<span style="color: rgba(128, 0, 128, 1)">0x56000060</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">);
gpgdat </span>= gpgcon + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
}
static irqreturn_t buttons_irq(int irq, void *dev_id)
{
irq_pd = (struct pin_desc *)dev_id;
//修改定时器的超时时间 HZ = 100 jiffies 当前时钟 10ms 后进入中断处理函数
mod_timer(&buttons_timer, jiffies+HZ/100);//jiffies 是一个全局变量 系统每隔 10ms 就会产生一个系统时钟中断 过 100 个 10ms 进入中断
return IRQ_RETVAL(IRQ_HANDLED);
}
static void buttons_timer_function(unsigned long data)
{
</span><span style="color: rgba(0, 0, 255, 1)">struct</span> pin_desc * pindesc =<span style="color: rgba(0, 0, 0, 1)"> irq_pd;
unsigned </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> pinval;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(!pinval)<span style="color: rgba(0, 0, 255, 1)">return</span> ;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果为空直接返回0</span>
pinval = s3c2410_gpio_getpin(pindesc-><span style="color: rgba(0, 0, 0, 1)">pin);
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (pinval)
{
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 松开 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
key_val </span>= <span style="color: rgba(128, 0, 128, 1)">0x80</span> | pindesc-><span style="color: rgba(0, 0, 0, 1)">key_val;
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
{
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 按下 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
key_val </span>= pindesc-><span style="color: rgba(0, 0, 0, 1)">key_val;
}
ev_press </span>= <span style="color: rgba(128, 0, 128, 1)">1</span>; <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 表示中断发生了 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
wake_up_interruptible(</span>&button_waitq); <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 唤醒休眠的进程 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
kill_fasync (</span>&<span style="color: rgba(0, 0, 0, 1)">button_async, SIGIO, POLL_IN);
}