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

Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo

這篇具有很好參考價(jià)值的文章主要介紹了Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

若該文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文出處
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-751810.html

紅胖子網(wǎng)絡(luò)科技博文大全:開(kāi)發(fā)技術(shù)集合(包含Qt實(shí)用技術(shù)、樹(shù)莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機(jī)、軟硬結(jié)合等等)持續(xù)更新中…

Linux系統(tǒng)移植和驅(qū)動(dòng)開(kāi)發(fā)專(zhuān)欄

上一篇:《Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(三):基于ubuntu的helloworld驅(qū)動(dòng)源碼編寫(xiě)、makefile編寫(xiě)以及驅(qū)動(dòng)編譯加載流程測(cè)試》
下一篇:《Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(五):驅(qū)動(dòng)連接用戶(hù)層與內(nèi)核層的文件操作集原理和Demo》


前言

??驅(qū)動(dòng)的開(kāi)發(fā)需要先熟悉基本概念類(lèi)型,本篇講解linux雜項(xiàng)設(shè)備基礎(chǔ),還是基于虛擬機(jī)ubuntu去制作驅(qū)動(dòng),只需要虛擬機(jī)就可以嘗試編寫(xiě)注冊(cè)雜項(xiàng)設(shè)備的基本流程。


linux三大設(shè)備驅(qū)動(dòng)

  • 字符設(shè)備:IO的傳輸過(guò)程是以字符為單位的,沒(méi)有緩沖,比如I2C(SDA、SCL),SPI(MISO、MOSI、SCLK、CS)。
  • 塊設(shè)備:IO的傳輸過(guò)程是以塊為單位的,跟存儲(chǔ)相關(guān)的都屬于塊設(shè)備,比如tf卡,sd卡。
  • 網(wǎng)絡(luò)設(shè)備:IO的傳輸以socket套接字來(lái)訪問(wèn)的。

雜項(xiàng)設(shè)備

  • 雜項(xiàng)設(shè)備是屬于字符設(shè)備,可以自動(dòng)生成設(shè)備節(jié)點(diǎn),設(shè)備節(jié)點(diǎn)位于/dev/目錄下,是設(shè)備名稱(chēng),如/dev/ttyS9等。
  • 主設(shè)備號(hào)相同,統(tǒng)一為10,次設(shè)備號(hào)不同,主設(shè)備相同可以節(jié)省內(nèi)核資源。
    通過(guò)下列指令,可以查看系統(tǒng)雜項(xiàng)設(shè)備
cat /proc/misc

??在虛擬機(jī)上測(cè)試,查看雜項(xiàng):
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

  • 設(shè)備號(hào)分為主設(shè)備號(hào)和次設(shè)備號(hào),主設(shè)備號(hào)是唯一的,次設(shè)備號(hào)不一定唯一。
    通過(guò)下列指令,可以查看系統(tǒng)主設(shè)備號(hào):
cat /proc/devices

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

雜項(xiàng)設(shè)備描述結(jié)構(gòu)體

??ubuntu來(lái)說(shuō),自帶的/usr/src下的就是內(nèi)核的頭文件。

cd /usr/src/linux-headers-4.18.0-15
vi include/linux/miscdevice.h

??定位到之前ubuntu自帶的內(nèi)核頭文件下:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??查看到雜項(xiàng)設(shè)備的結(jié)構(gòu)體:

struct miscdevice  {
        int minor;  // 次設(shè)備號(hào)
        const char *name;  // 設(shè)備節(jié)點(diǎn)名稱(chēng)(如/dev/ttyS8,則ttyS是名稱(chēng))
        const struct file_operations *fops; // 文件操作集(非常重要)
        struct list_head list; 
        struct device *parent;
        struct device *this_device;
        const struct attribute_group **groups; 
        const char *nodename; 
        umode_t mode;
};

??(注意:沒(méi)打注釋的,一般不管)

雜項(xiàng)設(shè)備文件操作集

cd /usr/src/linux-headers-4.18.0-15
vi include/linux/fs.h

??搜索到(vi則直接使用“/”):
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

struct file_operations {
        struct module *owner;
        loff_t (*llseek) (struct file *, loff_t, int);
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
        ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
        int (*iterate) (struct file *, struct dir_context *);
        int (*iterate_shared) (struct file *, struct dir_context *);
        __poll_t (*poll) (struct file *, struct poll_table_struct *);
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
        int (*mmap) (struct file *, struct vm_area_struct *);
        unsigned long mmap_supported_flags;
        int (*open) (struct inode *, struct file *);
        int (*flush) (struct file *, fl_owner_t id);
        int (*release) (struct inode *, struct file *);
        int (*fsync) (struct file *, loff_t, loff_t, int datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock) (struct file *, int, struct file_lock *);
        ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
        unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
        int (*setfl)(struct file *, unsigned long);
        int (*flock) (struct file *, int, struct file_lock *);
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
        int (*setlease)(struct file *, long, struct file_lock **, void **);
        long (*fallocate)(struct file *file, int mode, loff_t offset,
                          loff_t len);
        void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMU
        unsigned (*mmap_capabilities)(struct file *);
#endif
        ssize_t (*copy_file_range)(struct file *, loff_t, struct file *,
                        loff_t, size_t, unsigned int);
        int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t,
                        u64);
        ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *,
                        u64);
} __randomize_layout;

??例如read函數(shù),那么就是打開(kāi)驅(qū)動(dòng)使用系統(tǒng)read,打開(kāi)這個(gè)設(shè)備驅(qū)動(dòng)的句柄,那么久會(huì)調(diào)用read函數(shù),其他的以此類(lèi)推,還比較好理解。
??以我們一個(gè)registerHelloWorld為例子,來(lái)簡(jiǎn)單說(shuō)明。


驅(qū)動(dòng)編寫(xiě)空模板準(zhǔn)備

??首先復(fù)制之前的hello world的驅(qū)動(dòng),改個(gè)名字為:registerMiscDev:

cd ~/work/drive
cp -arf hellowolrd registerMiscDev

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

cd registerMiscDev/
rm *.ko *.o *.order *.symvers

??這里刪除起來(lái)麻煩,修改makefile,添加clean:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??然后測(cè)試一下:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??繼續(xù)修改源碼文件名稱(chēng):

mv helloworld.c registerMiscDev.c

??修改完如下:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??然后修改makefile里面的(obj-m模塊名稱(chēng)改下),模板準(zhǔn)備好了
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??下面基于registerMiscDev.c文件進(jìn)行注冊(cè)雜項(xiàng)設(shè)備,在修改.c文件:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

#include <linux/init.h>
#include <linux/module.h>

static int registerMiscDev_init(void)
{ 
    // 在內(nèi)核里面無(wú)法使用基礎(chǔ)c庫(kù)printf,需要使用內(nèi)核庫(kù)printk
    printk("Hello, I’m hongPangZi, registerMiscDev_init\n");	
    return 0;
}
static void registerMiscDev_exit(void)
{
    printk("bye-bye!!!\n");
}
MODULE_LICENSE("GPL");
module_init(registerMiscDev_init);

module_exit(registerMiscDev_exit); 

雜項(xiàng)設(shè)備注冊(cè)流程Demo

步驟一:填充miscdevice結(jié)構(gòu)體

??在編寫(xiě)驅(qū)動(dòng)的時(shí)候,代碼中填充信息結(jié)構(gòu)體。
??添加頭文件miscdevice.h

#include <linux/miscdevice.h>
#include <linux/fs.h>

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??然后填充雜項(xiàng)設(shè)備結(jié)構(gòu)體:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??(注意:開(kāi)始為“.”,結(jié)束為“,”,最后一行習(xí)慣加“,”了,這樣可以全部統(tǒng)一復(fù)制啥的,省的加沒(méi)加的)

struct miscdevice misc_dev {
    .minor = MISC_DYNAMIC_MINRO, // 這個(gè)宏是動(dòng)態(tài)分配次設(shè)備號(hào),避免沖突
    .name = "register_hongPangZi_misc,  // 設(shè)備節(jié)點(diǎn)名稱(chēng)
    .fops = misc_fops, // 這個(gè)變量記住,自己起的,步驟二使用
}

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

步驟二:填充file_operations結(jié)構(gòu)體

??在編寫(xiě)驅(qū)動(dòng)的時(shí)候,代碼中填充文件操作結(jié)構(gòu)體。
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

struct file_operations misc_fops {
  .owner = THIS_MODULE
}

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

步驟三:注冊(cè)雜項(xiàng)設(shè)備并生成設(shè)備節(jié)點(diǎn)

??注冊(cè)到內(nèi)核:

static int registerMiscDev_init(void)
{ 
    // 在內(nèi)核里面無(wú)法使用基礎(chǔ)c庫(kù)printf,需要使用內(nèi)核庫(kù)printk
    printk("Hello, I’m hongPangZi, registerMiscDev_init\n");	

    int ret = 0;
    ret = misc_register(misc_dev);
    if(ret < 0)
    {
        printk("Failed to misc_register(misc_dev)\n");	
        return -1;
    } 
    return 0;
}

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??有注冊(cè)就有注銷(xiāo):

static int registerMiscDev_init(void)
{ 
    // 在內(nèi)核里面無(wú)法使用基礎(chǔ)c庫(kù)printf,需要使用內(nèi)核庫(kù)printk
    printk("Hello, I’m hongPangZi, registerMiscDev_init\n");	

    int ret = 0;
    ret = misc_register(&misc_dev);
    if(ret < 0)
    {
        printk("Failed to misc_register(misc_dev)\n");	
        return -1;
    } 
    return 0;
}

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??完整的文件源碼:

#include <linux/init.h>
#include <linux/module.h>

#include <linux/miscdevice.h>
#include <linux/fs.h>

struct file_operations misc_fops = {
  .owner = THIS_MODULE,
};

struct miscdevice misc_dev = {
    .minor = MISC_DYNAMIC_MINOR, // 這個(gè)宏是動(dòng)態(tài)分配次設(shè)備號(hào),避免沖突
    .name = "register_hongPangZi_misc", // 設(shè)備節(jié)點(diǎn)名稱(chēng)
    .fops = &misc_fops,  // 這個(gè)變量記住,自己起的,步驟二使用
};

static int registerMiscDev_init(void)
{ 
    // 在內(nèi)核里面無(wú)法使用基礎(chǔ)c庫(kù)printf,需要使用內(nèi)核庫(kù)printk
    printk("Hello, I’m hongPangZi, registerMiscDev_init\n");	

    int ret = 0;
    ret = misc_register(&misc_dev);
    if(ret < 0)
    {
        printk("Failed to misc_register(&misc_dev)\n");	
        return -1;
    } 
    return 0;
}

static void registerMiscDev_exit(void)
{
    misc_deregister(&misc_dev);
    printk("bye-bye!!!\n");
}

MODULE_LICENSE("GPL");
module_init(registerMiscDev_init);
module_exit(registerMiscDev_exit);

步驟四:編譯make

make

??直接在驅(qū)動(dòng)工程目錄編譯:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??下面這個(gè)警告,實(shí)際上定義要在任何使用函數(shù)之前:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??修改下:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??編譯成功
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

步驟五:加載卸載驅(qū)動(dòng)測(cè)試

??將驅(qū)動(dòng)拷貝到開(kāi)發(fā)板或者目標(biāo)系統(tǒng),然后使用加載指令:

sudo insmod registerMiscDev.ko

??會(huì)打印入口加載的printk輸出。
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??出現(xiàn)問(wèn)題可能原因一是內(nèi)核編譯使用的編譯器和模塊使用的編譯器版本不一致。ubuntu中printk終端打入內(nèi)核日志消息了,可以使用dmesg進(jìn)行查看:

dmesg

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??然后查看是否加入了雜項(xiàng)設(shè)備節(jié)點(diǎn):
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??然后注銷(xiāo):

sudo rmmod registerMiscDev.ko

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

??跟隨著,結(jié)點(diǎn)消失了:
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)


入坑

入坑一:編譯報(bào)錯(cuò),結(jié)構(gòu)體之后未加分號(hào)

問(wèn)題

??編譯錯(cuò)誤,結(jié)構(gòu)體后面加分號(hào)

解決

??加分號(hào),腦袋有點(diǎn)蒙
??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

入坑二:編譯錯(cuò)誤,文件操作指針問(wèn)題

問(wèn)題

??Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo,linux驅(qū)動(dòng)開(kāi)發(fā),linux,驅(qū)動(dòng)開(kāi)發(fā)

解決

??這是寫(xiě)錯(cuò)了,是指針,需要加取地址&。


上一篇:《Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(三):基于ubuntu的helloworld驅(qū)動(dòng)源碼編寫(xiě)、makefile編寫(xiě)以及驅(qū)動(dòng)編譯加載流程測(cè)試》
下一篇:《Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(五):驅(qū)動(dòng)連接用戶(hù)層與內(nèi)核層的文件操作集原理和Demo》


若該文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文出處
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533

到了這里,關(guān)于Linux驅(qū)動(dòng)開(kāi)發(fā)筆記(四):設(shè)備驅(qū)動(dòng)介紹、熟悉雜項(xiàng)設(shè)備驅(qū)動(dòng)和ubuntu開(kāi)發(fā)雜項(xiàng)設(shè)備Demo的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 4、Linux驅(qū)動(dòng)開(kāi)發(fā):設(shè)備-設(shè)備號(hào)&設(shè)備號(hào)注冊(cè)

    4、Linux驅(qū)動(dòng)開(kāi)發(fā):設(shè)備-設(shè)備號(hào)&設(shè)備號(hào)注冊(cè)

    ??點(diǎn)擊這里查看所有博文 ??隨著自己工作的進(jìn)行,接觸到的技術(shù)棧也越來(lái)越多。給我一個(gè)很直觀的感受就是,某一項(xiàng)技術(shù)/經(jīng)驗(yàn)在剛開(kāi)始接觸的時(shí)候都記得很清楚。往往過(guò)了幾個(gè)月都會(huì)忘記的差不多了,只有經(jīng)常會(huì)用到的東西才有可能真正記下來(lái)。存在很多在特殊情況下有

    2024年02月15日
    瀏覽(44)
  • Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)戰(zhàn)(一)——設(shè)備驅(qū)動(dòng)模型

    Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)戰(zhàn)(一)——設(shè)備驅(qū)動(dòng)模型

    在早期的Linux內(nèi)核中并沒(méi)有為設(shè)備驅(qū)動(dòng)提供統(tǒng)一的設(shè)備模型。隨著內(nèi)核的不斷擴(kuò)大及系統(tǒng)更加復(fù)雜,編寫(xiě)一個(gè)驅(qū)動(dòng)程序越來(lái)越困難,所以在Linux2.6內(nèi)核中添加了一個(gè)統(tǒng)一的設(shè)備模型。這樣,寫(xiě)設(shè)備驅(qū)動(dòng)程序就稍微容易一些了。本章將對(duì)設(shè)備模型進(jìn)行詳細(xì)的介紹。 設(shè)備驅(qū)動(dòng)模型

    2024年02月16日
    瀏覽(26)
  • Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā) - 虛擬時(shí)鐘Clock驅(qū)動(dòng)示例

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā) - 虛擬時(shí)鐘Clock驅(qū)動(dòng)示例

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜歡的盆友歡迎點(diǎn)贊和訂閱! 你的喜歡就是我寫(xiě)作的動(dòng)力! 很多設(shè)備里面系統(tǒng)時(shí)鐘架構(gòu)極其復(fù)雜,讓學(xué)習(xí)Clock驅(qū)動(dòng)的盆友頭大。這里我參考S3C2440的clock驅(qū)動(dòng)寫(xiě)了一個(gè)virtual clock,即虛擬時(shí)鐘驅(qū)動(dòng),分別包含clock的provider和

    2023年04月21日
    瀏覽(27)
  • LDD學(xué)習(xí)筆記 -- Linux字符設(shè)備驅(qū)動(dòng)

    LDD學(xué)習(xí)筆記 -- Linux字符設(shè)備驅(qū)動(dòng)

    字符驅(qū)動(dòng)程序用于與Linux內(nèi)核中的設(shè)備進(jìn)行交互; 字符設(shè)備指的是像內(nèi)存區(qū)域這樣的硬件組件,通常稱(chēng)為偽設(shè)備; 用戶(hù)空間應(yīng)用程序通常使用 open read write 等系統(tǒng)調(diào)用與這些設(shè)備通信; 把用戶(hù)空間的系統(tǒng)調(diào)用連接到設(shè)備驅(qū)動(dòng)的系統(tǒng)調(diào)用實(shí)現(xiàn)方法上。 內(nèi)核的虛擬文件系統(tǒng) vir

    2024年02月02日
    瀏覽(26)
  • Linux -- 字符設(shè)備驅(qū)動(dòng)--LED的驅(qū)動(dòng)開(kāi)發(fā)(初級(jí)框架)

    Linux -- 字符設(shè)備驅(qū)動(dòng)--LED的驅(qū)動(dòng)開(kāi)發(fā)(初級(jí)框架)

    看原理圖確定引腳,確定引腳輸出什么電平才能點(diǎn)亮 / 熄滅 LED 看主芯片手冊(cè),確定寄存器操作方法:哪些寄存器?哪些位?地址是? 編寫(xiě)驅(qū)動(dòng):先寫(xiě)框架,再寫(xiě)硬件操作的代碼 注意 :在芯片手冊(cè)中確定的寄存器地址被稱(chēng)為 物理地址 ,在 Linux 內(nèi)核中無(wú)法直接使用。 需要使

    2024年04月28日
    瀏覽(27)
  • itop-3568開(kāi)發(fā)板驅(qū)動(dòng)學(xué)習(xí)筆記(22)設(shè)備樹(shù)(一)設(shè)備樹(shù)基礎(chǔ)

    itop-3568開(kāi)發(fā)板驅(qū)動(dòng)學(xué)習(xí)筆記(22)設(shè)備樹(shù)(一)設(shè)備樹(shù)基礎(chǔ)

    《【北京迅為】itop-3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南.pdf》 學(xué)習(xí)筆記 什么是設(shè)備樹(shù) 設(shè)備樹(shù)是保留著存在于系統(tǒng)中的設(shè)備信息,當(dāng)機(jī)器引導(dǎo)時(shí),OS通過(guò)使用驅(qū)動(dòng)程序和其他組件獲得的信息建立此樹(shù),并且當(dāng)添加或刪除設(shè)備時(shí)更新此樹(shù)。 上一篇筆記提到了平臺(tái)設(shè)備模型,它將設(shè)備和驅(qū)動(dòng)區(qū)

    2024年02月13日
    瀏覽(16)
  • 嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā) 04:基于設(shè)備樹(shù)的驅(qū)動(dòng)開(kāi)發(fā)

    嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā) 04:基于設(shè)備樹(shù)的驅(qū)動(dòng)開(kāi)發(fā)

    前面文章 《嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā) 03:平臺(tái)(platform)總線驅(qū)動(dòng)模型》 引入了資源和驅(qū)動(dòng)分離的概念,這篇文章將在前面基礎(chǔ)上更進(jìn)一步,引入設(shè)備樹(shù)的概念。 在平臺(tái)總線驅(qū)動(dòng)模型中資源和驅(qū)動(dòng)已經(jīng)從邏輯上和代碼組織上進(jìn)行了分離,但每次調(diào)整資源還是會(huì)涉及到內(nèi)核,所以現(xiàn)

    2024年02月16日
    瀏覽(27)
  • 正點(diǎn)原子嵌入式linux驅(qū)動(dòng)開(kāi)發(fā)——Linux 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)

    正點(diǎn)原子嵌入式linux驅(qū)動(dòng)開(kāi)發(fā)——Linux 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)

    網(wǎng)絡(luò)驅(qū)動(dòng)是linux里面驅(qū)動(dòng)三巨頭之一 ,linux下的網(wǎng)絡(luò)功能非常強(qiáng)大,嵌入式linux中也常常用到網(wǎng)絡(luò)功能。前面已經(jīng)講過(guò)了字符設(shè)備驅(qū)動(dòng)和塊設(shè)備驅(qū)動(dòng),本章就來(lái)學(xué)習(xí)一下linux里面的 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng) 。 本次筆記中討論的都是有線網(wǎng)絡(luò)! 提起網(wǎng)絡(luò),一般想到的硬件就是“網(wǎng)卡”。在

    2024年01月17日
    瀏覽(25)
  • 嵌入式Linux系統(tǒng)中的設(shè)備驅(qū)動(dòng)開(kāi)發(fā):從設(shè)備樹(shù)到驅(qū)動(dòng)實(shí)現(xiàn)

    嵌入式Linux系統(tǒng)中的設(shè)備驅(qū)動(dòng)開(kāi)發(fā):從設(shè)備樹(shù)到驅(qū)動(dòng)實(shí)現(xiàn)

    大家好,今天給大家介紹 嵌入式Linux系統(tǒng)中的設(shè)備驅(qū)動(dòng)開(kāi)發(fā):從設(shè)備樹(shù)到驅(qū)動(dòng)實(shí)現(xiàn) ,文章末尾附有分享大家一個(gè)資料包,差不多150多G。里面學(xué)習(xí)內(nèi)容、面經(jīng)、項(xiàng)目都比較新也比較全! 可進(jìn)群免費(fèi)領(lǐng)取。 在嵌入式Linux系統(tǒng)中,設(shè)備驅(qū)動(dòng)是連接硬件設(shè)備和操作系統(tǒng)之間的橋梁。

    2024年02月19日
    瀏覽(25)
  • 【Linux驅(qū)動(dòng)開(kāi)發(fā)】設(shè)備樹(shù)詳解(三)設(shè)備樹(shù)Kernel解析

    【Linux驅(qū)動(dòng)開(kāi)發(fā)】設(shè)備樹(shù)詳解(三)設(shè)備樹(shù)Kernel解析

    ? ? 活動(dòng)地址:CSDN21天學(xué)習(xí)挑戰(zhàn)賽 【Linux驅(qū)動(dòng)開(kāi)發(fā)】設(shè)備樹(shù)詳解(一)設(shè)備樹(shù)基礎(chǔ)介紹 【Linux驅(qū)動(dòng)開(kāi)發(fā)】設(shè)備樹(shù)詳解(二)設(shè)備樹(shù)語(yǔ)法詳解 【Linux驅(qū)動(dòng)開(kāi)發(fā)】設(shè)備樹(shù)詳解(三)設(shè)備樹(shù)Kernel解析 ? 個(gè)人主頁(yè):董哥聊技術(shù) 我是董哥,嵌入式領(lǐng)域新星創(chuàng)作者 創(chuàng)作理念:專(zhuān)注分享

    2023年04月24日
    瀏覽(14)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包