设为首页 加入收藏

TOP

耳机驱动程序上报(一)
2019-09-01 23:10:01 】 浏览:48
Tags:耳机 驱动程序 上报

上报设备

  1. headset :听筒mic
  2. headphone:听筒没有mic
  3. Lineout:声音输出没有mic

上报方式

  1. 输入子系统:
    • 可上报输入事件
    • 上报开关事件
  2. switch state:uevent

编写输入系统驱动

  1. 分配input_dev;
  2. 设置:
    1. 能产生哪类事件:EV_SW
    2. 能产生EV_SW中的哪些事件
      • headset
      • headphone
      • Lineout
  3. 注册input_dev
  4. 硬件相关(中断程序)
    • 上报插入事件
    • 上报拔出事件
#include <linux/module.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/err.h>
#include <linux/switch.h>
#include <linux/input.h>

static struct input_dev *g_virtual_input;

static ssize_t input_test_store(struct device *dev,
                     struct device_attribute *attr,
                     const char *buf, size_t count)
{
    long code;
    long val;
    char *endp;

    /* 如果字符串前面含有非数字, simple_strtol不能处理 */
    while ((*buf == ' ') || (*buf == '\t'))
        buf++;

    code = simple_strtol(buf, &endp, 0);

    /* 如果字符串前面含有非数字, simple_strtol不能处理 */
    while ((*endp == ' ') || (*endp == '\t'))
        endp++;
    val  = simple_strtol(endp, NULL, 0);

    printk("emulate to report EV_SW: 0x%x 0x%x\n", code, val);
    input_event(g_virtual_input, EV_SW, code, val);
    input_sync(g_virtual_input);

    return count;
}

static DEVICE_ATTR(test_input, S_IRUGO | S_IWUSR, NULL, input_test_store);

static int register_input_device_for_jack(void)
{
    int err;
    
    /* 分配input_dev */
    g_virtual_input = input_allocate_device();

    /* 设置 */
    /* 2.1 能产生哪类事件 */
    set_bit(EV_SYN, g_virtual_input->evbit);
    set_bit(EV_SW, g_virtual_input->evbit);


    /* 2.2 能产生这类事件中的哪些 */
    /* headset = 听筒 + MIC = SW_HEADPHONE_INSERT + SW_MICROPHONE_INSERT
     *    同时上报 SW_HEADPHONE_INSERT 和 SW_MICROPHONE_INSERT, 就表示headset
     *    为了简化, 对于android系统只上报SW_MICROPHONE_INSERT也表示headset
     */
    set_bit(SW_HEADPHONE_INSERT, g_virtual_input->swbit);
    set_bit(SW_MICROPHONE_INSERT, g_virtual_input->swbit);
    set_bit(SW_LINEOUT_INSERT, g_virtual_input->swbit);

    /* 2.3 这些事件的范围 */

    g_virtual_input->name = "alsa_switch"; /* 不重要 */

    /* 注册 */
    err = input_register_device(g_virtual_input);
    if (err) {
        input_free_device(g_virtual_input); 
        printk("input_register_device for virtual jack err!\n");
        return err;
    }

    /* 创建/sys/class/input/inputX/test_input文件
     *   可以执行类似下面的命令来模拟耳麦的动作:  
     *       触发上报headset插入: echo 4 1 > /sys/class/input/inputX/test_input  
     *       触发上报headset取下: echo 4 0 > /sys/class/input/inputX/test_input  
     */
    err = device_create_file(&g_virtual_input->dev, &dev_attr_test_input);
    if (err) {
        printk("device_create_file for test_input err!\n");
        input_unregister_device(g_virtual_input);
        input_free_device(g_virtual_input); 
        return err;
    }

    return 0;
}

static void unregister_input_device_for_jack(void)
{
    device_remove_file(&g_virtual_input->dev, &dev_attr_test_input);

    input_unregister_device(g_virtual_input);
    input_free_device(g_virtual_input); 
}


/**************************************************************************************************************/

static struct switch_dev g_virtual_switch;

static ssize_t state_test_store(struct device *dev,
                     struct device_attribute *attr,
                     const char *buf, size_t count)
{
    long val;

    val = simple_strtol(buf, NULL, 0);

    printk("emulate to report swtich state: 0x%x\n", val);
    switch_set_state(&g_virtual_switch, val);

    return count;
}

static DE
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇解决Stm32出现error: #20: identi.. 下一篇高通平台如何使用QPST抓DUMP

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目