国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

驅動開發(fā)--字符驅動設備2

這篇具有很好參考價值的文章主要介紹了驅動開發(fā)--字符驅動設備2。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

字符設備驅動

1.定義

以字節(jié)流的形式進行訪問,且只能順序訪問的設備,針對字符設備編寫的驅動叫做字符設備驅動

2.字符設備框架

用戶空間通過IO函數(shù)如open、read、write、close等函數(shù)接口,調(diào)用內(nèi)核空間中的字符設備驅動函數(shù)中的用戶自定義的open、read、write、close等函數(shù),通過內(nèi)核驅動函數(shù)去操控相應的字符設備。當設備驅動注冊進內(nèi)核時,內(nèi)核會分配給注冊的設備驅動一個編號,每注冊一個設備驅動都會給一個新的編號,這個編號叫做設備號,設備號是設備驅動在內(nèi)核中的身份標志。設備號是一個32位的數(shù)據(jù),由主設備號和次設備號組成,主設備號用來標識一類設備,次設備號用來標識這一類設備中的其中一個設備,一般一類設備的主設備號是一樣的,但是因為要標識該類設備下的不同設備,因此次設備號是不一致的。設備號中主設備號占據(jù)高12位,次設備號占據(jù)低20位。設備號=主設備號<<20|次設備號。當在注冊驅動后會得到驅動對應的設備號,并且基于這個設備號會在內(nèi)核文件系統(tǒng)中創(chuàng)建一個設備文件,這個設備文件起到了一個承上啟下的作用,在用戶空間中通過IO函數(shù)操作設備文件從而操控設備。

3.字符設備內(nèi)部實現(xiàn)原理

用戶空間調(diào)用IO函數(shù)打開設備文件后,系統(tǒng)為該設備文件分配一個inode號,inode號是文件系統(tǒng)中的唯一標識,同時也是索引當前文件的inode結構體的索引號,只要文件存在于文件系統(tǒng)中,內(nèi)核一定會存在一個inode結構體,這個結構體內(nèi)部存放了文件的相關信息,當驅動設備注冊時,會申請一個設備號,設備號會被填充到inode結構體中。

當用戶空間調(diào)用IO函數(shù)時,根據(jù)open傳遞的文件路徑找到設備文件對應的inode結構體,根據(jù)inode結構體中的設備號從而在inode結構體成員的共用體成員找到字符設備驅動的對象指針,通過該字符設備指針找到該指針指向的字符設備對象結構體,從而找到該結構體中的操作方法結構體指針,根據(jù)操作方法結構體指針回調(diào)對應的文件操作方法,從而控制硬件設備。

設備號是驅動存在在內(nèi)核的標識,是連接設備驅動和設備文件的紐帶,用戶空間調(diào)用IO函數(shù),找到設備文件的inode結構體,再通過設備號,找到相應的驅動對象結構體,通過驅動對象結構體中的操作方法結構體,找到對應的設備文件操作方法函數(shù),回調(diào)該函數(shù),從而控制硬件。

注冊字符設備驅動步驟:

<1>分配字符設備驅動對象空間

<2>初始化字符設備驅動成員--指向字符設備驅動對象的指針和操作方法結構體

<3>申請設備號--為了將設備文件和字符驅動通過設備號連接起來

<4>將字符設備驅動注冊進內(nèi)核

代碼實例:文章來源地址http://www.zghlxwxcb.cn/news/detail-555347.html

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include "led.h"
struct cdev *cdev;
unsigned int major=500;
unsigned int minor=0;
dev_t devno;
struct class *cls;
struct device * dev;
int mycdev_open(struct inode *inode, struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}

long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    return 0;
}
int mycdev_close(struct inode *inode, struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
//定義操作方法結構體變量并賦值
struct file_operations fops={

    .open=mycdev_open,
    .unlocked_ioctl=mycdev_ioctl,
    .release=mycdev_close,
};

static int __init mycdev_init(void)
{
    int ret,i;
    //1.分配對象空間
    cdev=cdev_alloc();
    if(cdev==NULL)
    {
        printk("分配字符設備驅動對象失敗\n");
        ret=-EFAULT;
        goto OUT1;
    }
    printk("分配對象空間成功\n");
    //2.初始化對象
    cdev_init(cdev,&fops);
    //3.申請設備號
    if(major>0)//靜態(tài)指定設備號
    {
        ret= register_chrdev_region(MKDEV(major,minor),3,"myled");
        if(ret)
        {
            printk("靜態(tài)指定設備號失敗\n");
            goto OUT2;
        }
    }
    else if(major==0)//動態(tài)申請設備號
    {
        ret=alloc_chrdev_region(&devno,minor,3,"myled");
        if(ret)
        {
            printk("動態(tài)申請設備號失敗\n");
            goto OUT2;
        }
        //獲取主設備號和次設備號
        major=MAJOR(devno);
        minor=MINOR(devno);
    }
    printk("申請設備號成功\n");
    //4.注冊字符設備驅動對象
    ret=cdev_add(cdev,MKDEV(major,minor),3);
    if(ret)
    {
        printk("注冊字符設備驅動對象失敗\n");
        goto OUT3;
    }
    printk("注冊字符設備驅動對象成功\n");
    //向上提交目錄
    cls=class_create(THIS_MODULE,"myled");
    if(IS_ERR(cls))
    {
        printk("向上提交目錄失敗\n");
        ret=-PTR_ERR(cls);
        goto OUT4;
    }
    printk("向上提交目錄成功\n");
    //向上提交設備節(jié)點信息
    for(i=0;i<3;i++)
    {
         dev=device_create(cls,NULL,MKDEV(major,i),NULL,"myled%d",i);
         if(IS_ERR(dev))
         {
            ret=-PTR_ERR(dev);
            goto OUT5;
         }
    }
    printk("向上提交設備節(jié)點成功\n");
    //完成硬件寄存器地址的映射以及初始化
    return 0;
OUT5:
    //釋放已經(jīng)申請的設備節(jié)點信息
    for(--i;i>=0;i--)
    {
        device_destroy(cls,MKDEV(major,i));
    }
    //釋放目錄空間
    class_destroy(cls);
OUT4:
    //注銷字符設備驅動對象
    cdev_del(cdev);
OUT3:
    //釋放設備號
    unregister_chrdev_region(MKDEV(major,minor),3);
OUT2:
//釋放對象空間
    kfree(cdev);
OUT1:
    return ret;
}
static void __exit mycdev_exit(void)
{
    //銷毀設備節(jié)點
    int i;
    for(i=0;i<3;i++)
    {
        device_destroy(cls,MKDEV(major,i));
    }
    //釋放目錄空間
    class_destroy(cls);
    //1.注銷字符設備驅動對象
     cdev_del(cdev);
    //2.釋放設備號
     unregister_chrdev_region(MKDEV(major,minor),3);
    //3.釋放對象空間
     kfree(cdev);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

到了這里,關于驅動開發(fā)--字符驅動設備2的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【嵌入式Linux學習筆記】platform設備驅動和input子系統(tǒng)

    【嵌入式Linux學習筆記】platform設備驅動和input子系統(tǒng)

    對于Linux這種龐大的操作系統(tǒng),代碼重用性非常重要,所以需要有相關的機制來提升效率,去除重復無意義的代碼,尤其是對于驅動程序,所以就有了platform和INPUT子系統(tǒng)這兩種工作機制。 學習視頻地址:【正點原子】STM32MP157開發(fā)板 platform 驅動框架分為總線、設備和驅動。總

    2024年02月07日
    瀏覽(25)
  • 韋東山嵌入式Liunx入門驅動開發(fā)一(Hello 驅動編程、GPIO基礎知識、LED驅動、總線設備驅動模型)

    韋東山嵌入式Liunx入門驅動開發(fā)一(Hello 驅動編程、GPIO基礎知識、LED驅動、總線設備驅動模型)

    本人學習完韋老師的視頻,因此來復習鞏固,寫以筆記記之。 韋老師的課比較難,第一遍不知道在說什么,但是堅持看完一遍,再來復習,基本上就水到渠成了。 看完視頻復習的同學觀看最佳! 基于 IMX6ULL-PRO 參考視頻 Linux快速入門到精通視頻 參考資料 :01_嵌入式Linux應用

    2024年04月25日
    瀏覽(96)
  • 嵌入式培訓機構四個月實訓課程筆記(完整版)-Linux ARM驅動編程第五天-ARM Linux編程之字符設備驅動(物聯(lián)技術666)

    嵌入式培訓機構四個月實訓課程筆記(完整版)-Linux ARM驅動編程第五天-ARM Linux編程之字符設備驅動(物聯(lián)技術666)

    鏈接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd=1688 提取碼:1688 教學內(nèi)容: 1 、內(nèi)核模塊的簡單框架: __init __exit 執(zhí)行完后就釋放空間 簡單框架:包含三個部分 1)模塊初始化和模塊退出函數(shù) 2)注冊模塊函數(shù) 3)模塊許可 //*************************************************** #include linux

    2024年02月21日
    瀏覽(22)
  • 嵌入式Linux驅動開發(fā)——解決/sys/bus/spi/devices下沒有對應的spi設備文件

    嵌入式Linux驅動開發(fā)——解決/sys/bus/spi/devices下沒有對應的spi設備文件

    最近在學習Linux驅動開發(fā)中SPI總線的驅動框架,但在修改完設備樹添加完對應的spi設備節(jié)點后,理應在/sys/bus/spi下會有對應的spi設備,我的目錄下面沒有。 無spi設備 然后我查看了/proc/device-tree,發(fā)現(xiàn)有對應的spi設備節(jié)點,我就先沒有過多理會這個問題。 /proc/device-tree下有對應

    2024年02月16日
    瀏覽(23)
  • 華清遠見嵌入式學習——驅動開發(fā)——作業(yè)1

    華清遠見嵌入式學習——驅動開發(fā)——作業(yè)1

    通過字符設備驅動分步注冊過程實現(xiàn)LED驅動的編寫,編寫應用程序測試,發(fā)布到CSDN

    2024年02月20日
    瀏覽(28)
  • 【嵌入式Linux內(nèi)核驅動】04_Jetson nano GPIO應用 | 驅動開發(fā) | 官方gpiolib、設備樹與chip_driver

    【嵌入式Linux內(nèi)核驅動】04_Jetson nano GPIO應用 | 驅動開發(fā) | 官方gpiolib、設備樹與chip_driver

    0.暴露給應用層 應用 解決調(diào)試目錄為空的問題 調(diào)試信息 1.最簡讀寫文件(在/SYS下) 設備樹 驗證測試 編譯文件 驅動 of_get_named_gpio_flags //獲取設備樹節(jié)點的屬性 gpio_is_valid //判斷是否合法 devm_gpio_request //申請使用gpio,并調(diào)用設置pinctrl device_create_file //根據(jù)設備樹節(jié)點屬性,創(chuàng)建

    2024年02月07日
    瀏覽(54)
  • 嵌入式開發(fā),如何防止設備被抄襲?

    嵌入式開發(fā),如何防止設備被抄襲?

    在國內(nèi)做產(chǎn)品設計開發(fā),很難避免被抄襲,被仿照。在沒有形成技術壁壘之前,如何防止產(chǎn)品被抄襲是一個不可回避的問題。 常規(guī)設備主要的防護手段有: 專利保護 加密保護代碼 授權校驗 持續(xù)更新和改進 對于一些比較重要的技術發(fā)明或是創(chuàng)新,應該盡快申請專利。雖然目

    2024年02月08日
    瀏覽(30)
  • 驅動開發(fā)——嵌入式(驅動)軟開基礎(十)

    1. 64位的計算機有哪些優(yōu)點? (1)可以進行更大范圍的整數(shù)計算。 (2)可以支持更大的內(nèi)存,虛擬內(nèi)存空間大小一般為2^48(256TB)。64位的Linux一般使用48位表示虛擬內(nèi)存空間地址,40位表示物理內(nèi)存地址。 2. 中斷分為哪兩種? (1) 異步中斷 :也叫 外部中斷 ,由CPU外設產(chǎn)

    2024年02月06日
    瀏覽(25)
  • 驅動開發(fā)——嵌入式(驅動)軟開基礎(七)

    1 Linux驅動程序的功能是什么? (1)對設備初始化和釋放。 (2)進行內(nèi)核與硬件的數(shù)據(jù)交互。 (3)檢測和處理設備出現(xiàn)的錯誤。 2. 內(nèi)核程序中申請內(nèi)存使用什么函數(shù)? 答案:kmalloc()、kzalloc()、vmalloc()。 解讀: (1)void *kmalloc(size_t size, gfp_t flags); ①申請連續(xù)的物理內(nèi)存,

    2024年02月06日
    瀏覽(22)
  • 嵌入式內(nèi)核及驅動開發(fā)高級

    嵌入式內(nèi)核及驅動開發(fā)高級

    僅devfs,導致開發(fā)不方便以及一些功能難以支持: 熱插拔 不支持一些針對所有設備的統(tǒng)一操作(如電源管理) 不能自動mknod 用戶查看不了設備信息 設備信息硬編碼,導致驅動代碼通用性差,即沒有分離設備和驅動 uevent機制:sysfs + uevent + udevd(上層app) sysfs用途:(類似于

    2024年02月16日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包