娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

Linux下GPIO驅動(五) ----misc_register();

發布者:溫暖夢想最新更新時間:2025-02-05 來源: cnblogs關鍵字:Linux  GPIO驅動 手機看文章 掃描二維碼
隨時隨地手機看文章

//


struct miscdevice  {

    int minor;

    const char *name;

    const struct file_operations *fops;

    struct list_head list;

    struct device *parent;

    struct device *this_device;

    const char *nodename;

    mode_t mode;

};


 int misc_register(struct miscdevice * misc);//注冊為雜項設備

 int misc_deregister(struct miscdevice *misc);//注銷


miscdevice的數據結構如下圖所示:

int misc_register(struct miscdevice * misc)

{

    struct miscdevice *c;

    dev_t dev;

    int err = 0;


    INIT_LIST_HEAD(&misc->list);// // 初始化鏈表頭,將misc->list的next和pre都指向自己


    mutex_lock(&misc_mtx);// 獲取互斥鎖, or睡眠

    list_for_each_entry(c, &misc_list, list) { // 遍歷整個misc_list鏈表,所有的雜項驅動設備都有一個miscdevice數據結構,這些雜項驅動設備通過一個全局的misc_list鏈表連在一起, 相當一個記錄

        if (c->minor == misc->minor) {// 如果misc_list中已經有了這個設備(minor相同),則解鎖返回,這里c是遍歷時的tmp miscdevice,指向當前遍歷節點

            mutex_unlock(&misc_mtx);

            return -EBUSY;

        }

    }


    if (misc->minor == MISC_DYNAMIC_MINOR) { // 如果misc_list中沒有該設備,判斷minor是否準備動態分配,實驗中如此設置

        int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);// misc_minors是雜項設備位圖,總共有64個位DYNAMIC_MINORS=64,表示可以注冊64個雜項設備,這句代碼找到位圖中的空閑位置(表示還能加新設備)

        if (i >= DYNAMIC_MINORS) {// 如果超過總設備數,則解鎖返回

            mutex_unlock(&misc_mtx);

            return -EBUSY;

        }

        misc->minor = DYNAMIC_MINORS - i - 1;// 計算子設備號,賦值到misc->minor

        

        set_bit(i, misc_minors);// 對應的位圖也置位

    }


    dev = MKDEV(MISC_MAJOR, misc->minor); // 生成設備號


    misc->this_device = device_create(misc_class, misc->parent, dev,

                      misc, '%s', misc->name);// 在sysfs中創建并注冊一個設備,可以在/dev下面看到misc->name

    if (IS_ERR(misc->this_device)) {

        int i = DYNAMIC_MINORS - misc->minor - 1;

        if (i < DYNAMIC_MINORS && i >= 0)

            clear_bit(i, misc_minors);

        err = PTR_ERR(misc->this_device);

        goto out;

    }


    /*

     * Add it to the front, so that later devices can 'override'

     * earlier defaults

     */

    list_add(&misc->list, &misc_list);// 以上操作都沒有問題后,將新設備加入misc_list鏈表,解鎖返回


 out:

    mutex_unlock(&misc_mtx);

    return err;

}


/**

 *    misc_deregister - unregister a miscellaneous device

 *    @misc: device to unregister

 *

 *    Unregister a miscellaneous device that was previously

 *    successfully registered with misc_register(). Success

 *    is indicated by a zero return, a negative errno code

 *    indicates an error.

 */


int misc_deregister(struct miscdevice *misc)

{

    int i = DYNAMIC_MINORS - misc->minor - 1;


    if (list_empty(&misc->list))

        return -EINVAL;


    mutex_lock(&misc_mtx);

    list_del(&misc->list);

    device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));

    if (i < DYNAMIC_MINORS && i >= 0)

        clear_bit(i, misc_minors);

    mutex_unlock(&misc_mtx);

    return 0;

}


在Linux初始化期間會執行misc_init();

static int __init misc_init(void)

{

    int err;


#ifdef CONFIG_PROC_FS //在proc文件系統下創建一個'misc'目錄。 misc_proc_fops是該文件系統下文件的操作函數集

    proc_create('misc', 0, NULL, &misc_proc_fops);

#endif

    misc_class = class_create(THIS_MODULE, 'misc');  // 前面device_create()中的misc_class就是在這里初始化的


    err = PTR_ERR(misc_class);

    if (IS_ERR(misc_class))

        goto fail_remove;


    err = -EIO;

    if (register_chrdev(MISC_MAJOR,'misc',&misc_fops))//注冊一個主設備號為MISC_MAJOR(10)的字符設備,設備操作函數集為misc_fops


        goto fail_printk;

    misc_class->devnode = misc_devnode;

    return 0;


fail_printk:

    printk('unable to get major %d for misc devicesn', MISC_MAJOR);

    class_destroy(misc_class);

fail_remove:

    remove_proc_entry('misc', NULL);

    return err;

}


關鍵字:Linux  GPIO驅動 引用地址:Linux下GPIO驅動(五) ----misc_register();

上一篇:Linux下GPIO驅動(四) ----gpio_request();gpio_free();
下一篇:LED字符設備驅動實例及測試代碼

推薦閱讀最新更新時間:2025-04-23 20:42

【改進】IMX257實現GPIO-IRQ中斷按鍵獲取鍵值驅動程序
一、使用struct pin_desc 管理按鍵的值 1.定義結構體 2.將前面我們申請中斷時寫的(void *)1修改為 &pins_desc 在ioctl中,設置中斷中修改 在key_release中釋放中修改 3.在中斷程序中利用我們定義的struc pins_desc判斷并得到按鍵的值 4.得到按鍵鍵值后,喚醒程序,在read函數中返回鍵值 附上驅動源程序: 1 /****************************** 2 linux key_query 3 *****************************/ 4 #include linux/module.h 5
[單片機]
【改進】IMX257實現<font color='red'>GPIO</font>-IRQ中斷按鍵獲取鍵值<font color='red'>驅動</font>程序
在STM8 Nucleo-64開發板上使用GPIO和中斷控制器驅動LED
NUCLEO-8S208RB(基于STM8S208RBT6)和NUCLEO-8L152R8(基于STM8L152R8T6)開發板可用于評估所有STM8S系列和STM8L系列微控制器的主要特性。 本應用筆記簡要介紹了如何使用NUCLEO-8S208RB和NUCLEO-8L152R8開發板上的GPIO和中斷控制器驅動一組LED指示燈。 當微控制器(本例中為STM8S208RBT6或STM8L152R8T6)使用連接到主機電腦的USB電纜供電時,LD2和LD5指示燈(不是板載的LED)開始閃爍。 每次按下“push”按鈕,中斷控制器產生一個用于控制I/O的中斷,然后改變LED的顯示方式。 1. 應用說明 本節主要介紹了在NU
[單片機]
在STM8 Nucleo-64開發板上使用<font color='red'>GPIO</font>和中斷控制器<font color='red'>驅動</font>LED
Mini2440通過GPIO驅動LED
以下是驅動的源碼。 #includelinux/config.h//配置頭文件 #includelinux/kernel.h//用于調用kmalloc和kfree #includelinux/sched.h//調度,進程睡眠,喚醒,中斷申請,中斷釋放 #includelinux/timer.h/ #includelinux/init.h//用戶定義模塊初始函數名需引用的頭文件 #includelinux/module.h #includeasm/hardware.h #includeasm/arch/S3C2440.h #defineDEVICE_NAMEquot;ledsquot; staticunsignedlongled_t
[單片機]
STM8的GPIO驅動
芯片的外設一般按照這么幾個流程來進行,GPIO,外部中斷,定時器,串口,ADC,IIC,SPI,下面我就按照各個模式來寫 首先是GPIO,STM8的GPIO擁有復用功能,這句話告訴我們必然需要配置IO的復用功能才能使用,看這張表 DDR決定輸入輸出方向,CR1 CR2決定輸入輸出模式,上拉,下拉,推挽,開漏等 主要依靠這幾個寄存器 還有一個控制寄存器2,懶得傳了 按照這張表,輸出寫輸出寄存器,輸入讀輸入寄存器,就能完成GPIO的操作了 以下是操作代碼 #include key.h u8 keyValue = 0; #define KEY1_IN (GPIOD- IDR&0X
[單片機]
STM8的<font color='red'>GPIO</font><font color='red'>驅動</font>
iMX6ULL開發板Linux 4G通信實驗EC20 4G模塊配置
1 添加USB設備信息 要使用EC20 4G模塊首先需要在Linux內核中添加EC20的USB信息,這樣內核啟動后,才能正確識別EC20 4G模塊。打開Linux內核下的drivers/usb/serial/option.c 文件,添加如下信息: 其中第1813行是EC20 4G模塊的USB信息。 2 Linux內核配置 添加完EC20 4G模塊的USB信息后,需要修改Linux 內核配置來支持USBNET功能。具體配置如下: 配置如圖 2.1所示: 接下來我們還需要使能 USB 串口 GSM、CDMA 驅動,配置路徑如下: 配置如圖 2.2所示: 然后配置ppp,配置路徑如下: 配置如圖 2.3所示: 配置完成后,
[單片機]
iMX6ULL開發板<font color='red'>Linux</font> 4G通信實驗EC20 4G模塊配置
LINUX下的ARM匯編程序
1.gnu 的編譯環境搭建 解壓編譯工具,加入環境變量PATH 2.編譯相關命令的使用 編譯命令 arm-linux-gcc -g -c -o led.o main.o led.c main.c  //了解靜態編譯和只編譯不鏈接的用法 鏈接命令 arm-linux-ld -Tled.lds -o led.elf led.o main.o   //使用腳本文件led.s進行鏈接 反匯編命令 arm-linux-objdump -D -S led.elf  //若在編譯時加上 -g 選項則可以在此處獲得更詳細的反匯編代碼 格式轉換命令 arm-linux-objcopy -O binary led.elf led.bin  //將
[單片機]
Linux驅動:s3c2440 lcd 驅動分析》
一,前言 s3c2440 lcd 驅動分析,涉及到的內容有,LCD圖像顯示原理、s3c2440的LCD控制器的操作、LCD驅動使用平臺總線-設備-驅動模型的實例、LCD相關參數的設置、fb字符設備驅動實例、framebuffer的注冊和管理、以及一次LCD顯示的完整過程分析。 二,LCD原理和硬件分析 2.1 LCD原理解析 SDRAM:在SDRAM中申請了一塊連續的內存作為LCD顯示數據的存儲,叫做顯存(framebuffer)。 LCD控制器:LCD控制器通過硬件電路和LCD屏連接。 LCD屏:作為一個外設通過硬件電路和MCU(引腳配置為LCD引腳)連接。 圖像在LCD屏上顯示,可以看成是LCD控制器先從顯存中取出一幀圖
[單片機]
stm32能跑linux
  Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。Linux操作系統誕生于1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬件設備中,比如手機、平板電腦、路由器、視頻游戲控制臺、臺式計算機、大型機和超級計算機。嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 安顺市| 荔波县| 阳江市| 新沂市| 银川市| 调兵山市| 汝南县| 庆安县| 西乡县| 鹤山市| 嘉禾县| 昔阳县| 石阡县| 通渭县| 汤阴县| 灵石县| 福贡县| 嘉祥县| 中宁县| 石林| 玛沁县| 南安市| 库车县| 临海市| 玛多县| 天峻县| 通道| 绥芬河市| 永泰县| 雷州市| 普宁市| 贞丰县| 本溪| 阿城市| 镇沅| 长白| 韩城市| 陇南市| 尼木县| 洪江市| 铜鼓县|