1. 配置GPIO
要想使用中断,必须先配置GPIO。GPIO的配置在config.fex中实现,这是一个配置系统和GPIO的脚本。
下面内容来自网络:
1.源码中是一个配置文件sys_config.fex。编译期 是fex2bin之后变成script.bin, 运行期是保存在系统第一个分区。
2 script.bin是由uboot读出并写到一个内存的固定地址,之后驱动才能去这个内存地址里面读出配置,所以uboot和驱动都可以进行动态配置
3 接口的实现在sys_config.c,uboot有另外一个接口(忽略)
可以很方便在config.fex中添加自己的配置,在脚本中,各个主键的排列顺序没有意义,前后都一样。
;--------------------------------------------------------------------------------
;asr configuration
;asr_host_wake: microphone module wake-up host
; 0: not used, 1: used
;--------------------------------------------------------------------------------
[asr_para]
asr_host_wake = port:PL11<4><2><default><0>
2. interrupt代码
2.1 kernel部分
Kernel部分主要工作是注册中断和创建字符设备
2.1.1 注册中断
- script_get_item(),得到端口的gpio值
返回0, SCIRPT_ITEM_VALUE_TYPE_INVALID = 0,说明没有配置过该端口
返回3,SCIRPT_ITEM_VALUE_TYPE_PIO = 3
- gpio_request()
- gpio_to_irq(),返回系统类有效的irq
- request_irq(),注册中断及中断处理
rc返回-16,说明该中断已经被使用,可以执行cat /proc/interrupts查看。
返回-22,#defineEINVAL22/* Invalid argument */
2.1.2 创建字符设备
字符设备用来将中断通知到用户空间,用户空间可以阻塞式读取该设备,中断发生,则返回
static struct file_operations wkup_fops = {
.owner = THIS_MODULE,
.open = wkup_dev_open,
.release = wkup_dev_close,
.read = wkup_dev_read
};
字符设备读函数中由中断处理函数唤醒
static ssize_t wkup_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
wait_event_interruptible(wkup_wq, is_waked != 0);
is_waked = 0;
copy_to_user(buf, &key_val, sizeof(key_val));
return count;
}
2.2 用户空间部分
用户空间部分比较简单,阻塞读取字符设备即可
Note:
配置脚本中gpio的第二项比较重要,要根据实际情况配置内部为上拉还是下拉。