耳機驅動程式上報

来源:https://www.cnblogs.com/linhaostudy/archive/2018/09/25/9704255.html
-Advertisement-
Play Games

上報設備 1. headset :聽筒mic 2. headphone:聽筒沒有mic 3. Lineout:聲音輸出沒有mic 上報方式 1. 輸入子系統: 可上報輸入事件 上報開關事件 2. switch state:uevent 編寫輸入系統驅動 1. 分配input_dev; 2. 設置: ...


上報設備

  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 DEVICE_ATTR(test_state, S_IRUGO | S_IWUSR, NULL, state_test_store);

static int register_switch_device_for_jack(void)
{
    int err;
    
    g_virtual_switch.name = "h2w";
    err = switch_dev_register(&g_virtual_switch);
    if (err) {
        printk("switch_dev_register h2w err!\n");
        return err;
    }

    /* 創建/sys/class/switch/h2w/test_state文件
     *   可以執行類似下麵的命令來模擬耳麥的動作:  
     *       觸發上報headset插入: echo 1 > /sys/class/switch/h2w/test_state
     *       觸發上報headset取下: echo 0 > /sys/class/switch/h2w/test_state
     */
    err = device_create_file(g_virtual_switch.dev, &dev_attr_test_state);
    if (err) {
        printk("device_create_file test err!\n");
        switch_dev_unregister(&g_virtual_switch);
        return err;
    }

    return 0;
}

static void unregister_switch_device_for_jack(void)
{
    device_remove_file(g_virtual_switch.dev, &dev_attr_test_state);
    switch_dev_unregister(&g_virtual_switch);
}

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

static int __init virtual_jack_init(void)
{
    int err;
    
    err = register_input_device_for_jack();
    err = register_switch_device_for_jack();
    
    return 0;
}

static void __exit virtual_jack_exit(void)
{
    unregister_input_device_for_jack();
    unregister_switch_device_for_jack();
}

module_init(virtual_jack_init);
module_exit(virtual_jack_exit);

MODULE_AUTHOR("[email protected]");
MODULE_DESCRIPTION("Virutal jack driver for sound card");
MODULE_LICENSE("GPL");


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在分散式系統中,服務發生異常是很正常的現象。為了處理這類“例外”,可以採取不同的應對策略,斷路器模式即是其中一種方法。這個模式的主要特點是其可以阻斷失敗的級聯影響,不會因為一個服務的失敗導致其它關聯服務一併失敗。 在Spring Cloud生態系統中有Hystrix類庫可以提供這個模式的解決方案,而 ...
  • 調用windows的imm32.dll完成窗體接收輸入法功能. 代碼如下 public ImeComponent(Form from) { var handle = from.Handle; hIMC = ImmGetContext(handle); this.handle = handle; } ...
  • 程式源代碼Gitee項目地址:https://gitee.com/xiao_ge_ge/WordCount.git 一:介紹: 這次作業的主要任務: WordCount的需求可以概括為:對程式設計語言源文件統計字元數、單詞數、行數,統計結果以指定格式輸出到預設文件中,以及其他擴展功能,並能夠快速地處 ...
  • Ocelot簡易教程(四)之請求聚合以及服務發現 上篇文章給大家講解了Ocelot的一些特性並對路由進行了詳細的介紹,今天呢就大家一起來學習下Ocelot的請求聚合以及服務發現功能。希望能對大家有所幫助。 作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9 ...
  • 最新寫的一個介面需要接收json參數,然後序列化為實體類然後再進行後面的邏輯處理。因為json中鍵值對比較多,逐一去手寫實體中的每個屬性太麻煩,於是尋思是否有這樣的工具可以將json轉換為實體類。 經過一番的資料查找,發現Visual Studio 2015可以將json轉換為實體類(若已經知道該技 ...
  • vim可能對於初學者不太友好,學習曲線有點陡,特此整理了較為平滑的學習曲線的學習快捷鍵的方式,包含最常用的快捷鍵,讓初學者領悟vim的優點,想要進階學習請查找其它更好的教程 正常模式:可以使用快捷鍵命令,或按:輸入命令行 插入模式:可以輸入文本,在正常模式下,按i、a、o等都可以進入插入模式 可視模 ...
  • 最近買了部新電腦,海爾n4105的一體機,好像叫s7。 放在房間裡面,看看資料。因為性能孱弱,所以不敢安裝太強大的軟體,然後又有一顆折騰的心。所以嘗試了win10自帶的linux子系統。然後在應用商店搜索linux推薦debian 系統。安裝了之後這個linux就會成為win10裡面一個命令行應用,... ...
  • 今天下班前,檢查伺服器時,發現程式異常消失,於是從新運行程式,提示埠號被占用!!!我就愣住了,誰給占用了! 下麵是一個簡單的解決方法,希望給大家帶來幫助。 先win+R-cmd-netstat -ano //查看所有的埠占用情況 netstat -ano|findstr "埠號" //查看指定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...