R16平台中断

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的第二项比较重要,要根据实际情况配置内部为上拉还是下拉。

原文地址:https://www.cnblogs.com/m2mer/p/6957777.html