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

  • 相关阅读:
    Model, View(Camera), Perspective (1)
    流状态和c++的异常处理
    VAO VBO EBO(3)
    VAO VBO EBO(2)
    VAO VBO EBO(1)
    函数指针(2)
    函数指针
    内联函数和宏函数的一些区别
    关于宏的一些知识
    关于未来方向
  • 原文地址:https://www.cnblogs.com/m2mer/p/6957777.html
Copyright © 2011-2022 走看看