国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

linux驅(qū)動(dòng)開發(fā)(十)——misc雜散設(shè)備

發(fā)布者:靜心靜氣最新更新時(shí)間:2025-02-18 來(lái)源: cnblogs關(guān)鍵字:linux  驅(qū)動(dòng)開發(fā)  misc 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

1:什么是misc驅(qū)動(dòng)模型?

2:為什么要有misc驅(qū)動(dòng)模型?

3:misc驅(qū)動(dòng)模型的代碼實(shí)現(xiàn)

4:misc驅(qū)動(dòng)模型實(shí)戰(zhàn)

參考:

http://blog.csdn.net/yicao821/article/details/6785738

http://www.thinksaas.cn/topics/0/507/507168.html

http://www.cnblogs.com/fellow1988/p/6235080.html

https://www.zhihu.com/question/21508904

http://www.cnblogs.com/snake-hand/p/3212483.html

http://blog.csdn.net/chenlong12580/article/details/7339127

--------------------------------------------------------------------------------------------------------------------------------------------------------------

1:什么是misc驅(qū)動(dòng)模型

  Linux包含了許多的設(shè)備驅(qū)動(dòng)類型,而不管分類有多細(xì),總會(huì)有些漏網(wǎng)的,這就是我們經(jīng)常說(shuō)到的“其他的”等等。
在Linux里面,把無(wú)法歸類的五花八門的設(shè)備定義為混雜設(shè)備(用miscdevice結(jié)構(gòu)體來(lái)描述)。Linux/內(nèi)核所提供的miscdevice有很強(qiáng)的包容性。如NVRAM,看門狗,DS1286等實(shí)時(shí)時(shí)鐘,字符LCD,AMD 768隨機(jī)數(shù)發(fā)生器。

miscdevice共享一個(gè)主設(shè)備號(hào)MISC_MAJOR(10),但此設(shè)備號(hào)不同,所有的miscdevice設(shè)備形成一個(gè)鏈表,對(duì)設(shè)備訪問(wèn)時(shí)內(nèi)核根據(jù)次設(shè)備號(hào)查找對(duì)應(yīng)的 miscdevice設(shè)備,然后調(diào)用其中的file_operations結(jié)構(gòu)體中注冊(cè)的文件操作接口進(jìn)程操作。


2:為什么要有misc驅(qū)動(dòng)模型

第一,節(jié)省主設(shè)備號(hào):
使用普通字符設(shè)備,不管該驅(qū)動(dòng)的主設(shè)備號(hào)是靜態(tài)還是動(dòng)態(tài)分配,都會(huì)消耗一個(gè)主設(shè)備號(hào),這太浪費(fèi)了。而且如果你的這個(gè)驅(qū)動(dòng)最終會(huì)提交到內(nèi)核主線版本上的話,需要申請(qǐng)一個(gè)專門的主設(shè)備號(hào),這也麻煩。
如果使用misc驅(qū)動(dòng)的話就好多了。因?yàn)閮?nèi)核中已經(jīng)為misc驅(qū)動(dòng)分配了一個(gè)主設(shè)備號(hào)。當(dāng)系統(tǒng)中擁有多個(gè)misc設(shè)備驅(qū)動(dòng)時(shí),那么它們的主設(shè)備號(hào)相同,而用子設(shè)備號(hào)來(lái)區(qū)分它們。

第二,使用簡(jiǎn)單:
有時(shí)候驅(qū)動(dòng)開發(fā)人員需要開發(fā)一個(gè)功能較簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng),導(dǎo)出接口讓用戶空間程序方便地控制硬件,只需要使用misc子系統(tǒng)提供的接口即可快速地創(chuàng)建一個(gè)misc設(shè)備驅(qū)動(dòng)。
當(dāng)使用普通的字符設(shè)備驅(qū)動(dòng)時(shí),如果開發(fā)人員需要導(dǎo)出操作接口給用戶空間的話,需要自己去注冊(cè)字符驅(qū)動(dòng),并創(chuàng)建字符設(shè)備class以自動(dòng)在/dev下生成設(shè)備節(jié)點(diǎn),相對(duì)麻煩一點(diǎn)。而misc驅(qū)動(dòng)則無(wú)需考慮這些,基本上只需要把一些基本信息通過(guò)struct miscdevice交給misc_register()去處理即可。

本質(zhì)上misc驅(qū)動(dòng)也是一個(gè)字符設(shè)備驅(qū)動(dòng),可能相對(duì)特殊一點(diǎn)而已。在drivers/char/misc.c的misc驅(qū)動(dòng)初始化函數(shù)misc_init()中實(shí)際上使用了MISC_MAJOR(主設(shè)備號(hào)為10)并調(diào)用register_chrdev()去注冊(cè)了一個(gè)字符設(shè)備驅(qū)動(dòng)。同時(shí)也創(chuàng)建了一個(gè)misc_class,使得最后可自動(dòng)在/dev下自動(dòng)生成一個(gè)主設(shè)備號(hào)為10的字符設(shè)備??偟膩?lái)講,如果使用misc驅(qū)動(dòng)可以滿足要求的話,那么這可以為開發(fā)人員剩下不少麻煩。

所以說(shuō)misc驅(qū)動(dòng)模型讓我們很簡(jiǎn)單的在底層實(shí)現(xiàn)了字符設(shè)備驅(qū)動(dòng),并且在在應(yīng)用層給予了一定的接口,節(jié)省了主設(shè)備號(hào);其實(shí)就相當(dāng)于一個(gè)雜貨鋪,亂七八糟的字符設(shè)備驅(qū)動(dòng)模型都可以往里面堆。


3:驅(qū)動(dòng)模型代碼實(shí)現(xiàn):
misc驅(qū)動(dòng)的實(shí)現(xiàn)代碼在driver/char/misc.c目錄下,

misc_init函數(shù):


 1 static int __init misc_init(void)

 2 {

 3     int err;

 4 

 5 #ifdef CONFIG_PROC_FS

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

 7 #endif

 8     misc_class = class_create(THIS_MODULE, 'misc');

 9     err = PTR_ERR(misc_class);

10     if (IS_ERR(misc_class))

11         goto fail_remove;

12 

13     err = -EIO;

14     if (register_chrdev(MISC_MAJOR,'misc',&misc_fops))

15         goto fail_printk;

16     misc_class->devnode = misc_devnode;

17     return 0;

18 

19 fail_printk:

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

21     class_destroy(misc_class);

22 fail_remove:

23     remove_proc_entry('misc', NULL);

24     return err;

25 }

26 subsys_initcall(misc_init);


misc_init


  class_create 創(chuàng)建了一個(gè)名為misc的類


  register_chrdev(MISC_MAJOR,'misc',&misc_fops)  使用register_chrdev注冊(cè)了一個(gè)字符設(shè)備驅(qū)動(dòng),主設(shè)備號(hào)為MISC_MAJOR(10);


1 static const struct file_operations misc_fops = {

2     .owner        = THIS_MODULE,

3     .open        = misc_open,

4 };

misc類型驅(qū)動(dòng)提供了一個(gè)統(tǒng)一.open函數(shù)misc_open函數(shù);


misc_open 這個(gè)函數(shù)的實(shí)質(zhì)是通過(guò)inode找到misc類的次設(shè)備號(hào)minor,然后在通過(guò)次設(shè)備號(hào)和misc鏈表的次設(shè)備號(hào)進(jìn)行匹配,匹配好以后取出


 1 static int misc_open(struct inode * inode, struct file * file)

 2 {

 3     int minor = iminor(inode);

 4     struct miscdevice *c;

 5     int err = -ENODEV;

 6     const struct file_operations *old_fops, *new_fops = NULL;

 7 

 8     mutex_lock(&misc_mtx);

 9     

10     list_for_each_entry(c, &misc_list, list) {

11         if (c->minor == minor) {

12             new_fops = fops_get(c->fops);        

13             break;

14         }

15     }

16         

17     if (!new_fops) {

18         mutex_unlock(&misc_mtx);

19         request_module('char-major-%d-%d', MISC_MAJOR, minor);

20         mutex_lock(&misc_mtx);

21 

22         list_for_each_entry(c, &misc_list, list) {

23             if (c->minor == minor) {

24                 new_fops = fops_get(c->fops);

25                 break;

26             }

27         }

28         if (!new_fops)

29             goto fail;

30     }

31 

32     err = 0;

33     old_fops = file->f_op;

34     file->f_op = new_fops;

35     if (file->f_op->open) {

36         file->private_data = c;

37         err=file->f_op->open(inode,file);

38         if (err) {

39             fops_put(file->f_op);

40             file->f_op = fops_get(old_fops);

41         }

42     }

43     fops_put(old_fops);

44 fail:

45     mutex_unlock(&misc_mtx);

46     return err;

47 }


 1 int misc_register(struct miscdevice * misc)

 2 {

 3     struct miscdevice *c;

 4     dev_t dev;

 5     int err = 0;

 6 

 7     INIT_LIST_HEAD(&misc->list);

 8 

 9     mutex_lock(&misc_mtx);

10     list_for_each_entry(c, &misc_list, list) {

11         if (c->minor == misc->minor) {

12             mutex_unlock(&misc_mtx);

13             return -EBUSY;

14         }

15     }

16 

17     if (misc->minor == MISC_DYNAMIC_MINOR) {

18         int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);

19         if (i >= DYNAMIC_MINORS) {

20             mutex_unlock(&misc_mtx);

21             return -EBUSY;

22         }

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

24         set_bit(i, misc_minors);

25     }

26 

27     dev = MKDEV(MISC_MAJOR, misc->minor);

28 

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

30                       misc, '%s', misc->name);

31     if (IS_ERR(misc->this_device)) {

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

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

34             clear_bit(i, misc_minors);

35         err = PTR_ERR(misc->this_device);

36         goto out;

37     }

38 

39     /*

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

41      * earlier defaults

42      */

43     list_add(&misc->list, &misc_list);

44  out:

45     mutex_unlock(&misc_mtx);

46     return err;

47 }


在include/linux/miscdevice.h中定義了miscdevice  結(jié)構(gòu)體,所有的misc模型驅(qū)動(dòng)設(shè)備;都在內(nèi)核圍護(hù)的一個(gè)misc_list鏈表中;


內(nèi)核維護(hù)一個(gè)misc_list鏈表,misc設(shè)備在misc_register注冊(cè)的時(shí)候鏈接到這個(gè)鏈表,在misc_deregister中解除鏈接。


 1 struct miscdevice  {

 2     int minor;          //次設(shè)備號(hào),若為 MISC_DYNAMIC_MINOR 自動(dòng)分配 

 3     const char *name;      //設(shè)備名  

 4     const struct file_operations *fops;    //設(shè)備文件操作結(jié)構(gòu)體

 5     struct list_head list;            //misc_list鏈表頭  

 6     struct device *parent;

 7     struct device *this_device;

 8     const char *nodename;

 9     mode_t mode;

10 };


misc_register函數(shù)


 1 int misc_register(struct miscdevice * misc)

 2 {

 3     struct miscdevice *c;

 4     dev_t dev;

 5     int err = 0;

 6 

 7     INIT_LIST_HEAD(&misc->list);

 8 

 9     mutex_lock(&misc_mtx);

10     list_for_each_entry(c, &misc_list, list) {

11         if (c->minor == misc->minor) {

12             mutex_unlock(&misc_mtx);

13             return -EBUSY;

14         }

15     }

16 

17     if (misc->minor == MISC_DYNAMIC_MINOR) {

18         int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);

19         if (i >= DYNAMIC_MINORS) {

20             mutex_unlock(&misc_mtx);

21             return -EBUSY;

22         }

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

24         set_bit(i, misc_minors);

25     }

26 

27     dev = MKDEV(MISC_MAJOR, misc->minor);

28 

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

30                       misc, '%s', misc->name);

31     if (IS_ERR(misc->this_device)) {

[1] [2]
關(guān)鍵字:linux  驅(qū)動(dòng)開發(fā)  misc 引用地址:linux驅(qū)動(dòng)開發(fā)(十)——misc雜散設(shè)備

上一篇:從samsung提供內(nèi)核進(jìn)行移植
下一篇:linux驅(qū)動(dòng)開發(fā)之九鼎板載蜂鳴器驅(qū)動(dòng)測(cè)試

推薦閱讀最新更新時(shí)間:2025-06-06 09:30

手把手教你寫Linux設(shè)備驅(qū)動(dòng)---中斷(三)--workqueue實(shí)現(xiàn)(基于友善之臂4412開發(fā)板)
上節(jié),我們講到如何來(lái)實(shí)現(xiàn)tasklet小任務(wù)機(jī)制 http://blog.csdn.NET/morixinguan/article/details/69666935 這節(jié),我們來(lái)實(shí)現(xiàn)一下中斷下半部的工作隊(duì)列: 在寫這個(gè)demo之前,我們要了解一下工作隊(duì)列的相關(guān)數(shù)據(jù)結(jié)構(gòu)還有API。 需要包含的頭文件: #include Linux/workqueue.h 基本的數(shù)據(jù)結(jié)構(gòu): //工作隊(duì)列結(jié)構(gòu) struct work_struct { atomic_long_t data; //鏈表處理 struct list_head entry; //工作處理函數(shù) work_func_t
[單片機(jī)]
手把手教你寫<font color='red'>Linux</font><font color='red'>設(shè)備</font><font color='red'>驅(qū)動(dòng)</font>---中斷(三)--workqueue實(shí)現(xiàn)(基于友善之臂4412<font color='red'>開發(fā)</font>板)
【GD32F427開發(fā)板試用】EXMC方式驅(qū)動(dòng)LCD屏幕
使用EXMC方式驅(qū)動(dòng)LCD顯示屏。 GD32 F427VEXMC系統(tǒng)架構(gòu)圖 擴(kuò)展板 硬件 擴(kuò)展板硬件EXMC 接口 部分電路圖 2.1、開發(fā)板接口部分 2.2、LCD接口部分 驅(qū)動(dòng)程序 3.1、exmc.c #include gd32f4xx.h #include exmc_lcd.h /*! brief lcd peripheral initialize param none param none retval none */ void exmc_lcd_init(void) { exmc_norsram_parameter_struct lcd_init_struc
[單片機(jī)]
【GD32F427<font color='red'>開發(fā)</font>板試用】EXMC方式<font color='red'>驅(qū)動(dòng)</font>LCD屏幕
基于AUTOSAR的電機(jī)驅(qū)動(dòng)控制系統(tǒng)開發(fā)
1、前言 純電動(dòng)汽車和混合動(dòng)力汽車是新能源汽車產(chǎn)業(yè)發(fā)展的重要方向,同時(shí),泛亞“電動(dòng)化、智能化、網(wǎng)聯(lián)化、數(shù)字化”戰(zhàn)略的提出,使得未來(lái)車載汽車電子電氣架構(gòu)系統(tǒng)的開發(fā)越來(lái)越復(fù)雜。汽車開放系統(tǒng)架構(gòu) AUTOSAR 代表的層次化、模塊化、平臺(tái)化技術(shù)則是汽車電子軟件開發(fā)的重要趨勢(shì)。在電動(dòng)汽車的三大電控系統(tǒng)中(電機(jī)控制、電池管理、整車控制),電機(jī)控制作為核心之一,其軟件架構(gòu)的研究設(shè)計(jì)對(duì)于汽車電控系統(tǒng)的開發(fā)有重要意義。本報(bào)告以電動(dòng)汽車用驅(qū)動(dòng)電機(jī)作為研究對(duì)象,以 AUTOSAR 開發(fā)架構(gòu)為基礎(chǔ),對(duì)電機(jī)驅(qū)動(dòng)控制系統(tǒng)軟件架構(gòu)設(shè)計(jì)與開發(fā)進(jìn)行探究,并在此基礎(chǔ)上對(duì)電機(jī)過(guò)調(diào)制控制算法以及旋變軟解碼技術(shù)進(jìn)行詳細(xì)研究。 2、電動(dòng)汽車的電機(jī)控制軟件基于 AUTO
[嵌入式]
基于AUTOSAR的電機(jī)<font color='red'>驅(qū)動(dòng)</font>控制系統(tǒng)<font color='red'>開發(fā)</font>
STM32F4 開發(fā)筆記7:定時(shí)器驅(qū)動(dòng)程序的移植
本文講述移植STM32CubeMX生成的驅(qū)動(dòng)程序到自己的項(xiàng)目中,以定時(shí)器為例。為什么要寫這篇文章呢?是因?yàn)槎〞r(shí)器移植這件事情耗費(fèi)了我整整2天的時(shí)間,只因?yàn)橐粋€(gè)特殊的地方?jīng)]有注意到。把整個(gè)移植過(guò)程用文字記錄下來(lái),以利于自身其它程序的移植,并對(duì)本文的讀者提供一些技術(shù)上的參考。 1、如果僅完成計(jì)時(shí)功能,在STM32CubeMX中設(shè)置比較簡(jiǎn)單,如下圖所示,只需指定其時(shí)鐘源即可。 2、對(duì)時(shí)鐘進(jìn)行進(jìn)一步設(shè)置,這個(gè)在先前的日志中已經(jīng)描述過(guò),將分頻系數(shù)與MCU的主頻系數(shù)設(shè)置成一致,例如我現(xiàn)在MCU的主頻是72M,則進(jìn)行72分頻即可,這樣單位計(jì)數(shù)周期是1us,按照下圖所示,我在Counter Period中設(shè)置為1000,則定時(shí)器
[單片機(jī)]
基于WinCE6.0的LPC3250串口驅(qū)動(dòng)程序開發(fā)
引 言 Windows CE是一個(gè)開放的、可升級(jí)、可裁減的32位實(shí)時(shí)嵌入式操作系統(tǒng),具有可靠性好、實(shí)時(shí)性高、內(nèi)核體積小的特點(diǎn),廣泛應(yīng)用于工業(yè)控制、信息家電、移動(dòng)通信、汽車電子、個(gè)人電子消費(fèi)品等領(lǐng)域。最新版本W(wǎng)indows Em-bedded CE 6.0于2006年11月發(fā)布,其特點(diǎn)有:最大進(jìn)程數(shù)量到32K,且每個(gè)進(jìn)程有最大2 GB的虛擬內(nèi)存空間;將關(guān)鍵的驅(qū)動(dòng)程序、文件系統(tǒng)和圖形界面管理器移到了內(nèi)核中,大大減少了CPU在內(nèi)核態(tài)和用戶態(tài)間切換造成的性能損失等。 LPC3250是NXP半導(dǎo)體公司(由Philips公司成立)推出的帶有矢量浮點(diǎn)協(xié)處理器的ARM926EJ-SCPU內(nèi)核的微控制器。它具有豐富的外圍接口,包括7個(gè)UART,其
[單片機(jī)]
基于WinCE6.0的LPC3250串口<font color='red'>驅(qū)動(dòng)</font>程序<font color='red'>開發(fā)</font>
基于Small RTOS51的PS/2鍵盤驅(qū)動(dòng)程序開發(fā)
引言   隨著嵌入式系統(tǒng)的發(fā)展,嵌入式軟件設(shè)計(jì)向軟件平臺(tái)靠近,單片機(jī)軟件設(shè)計(jì)不再是單一線程結(jié)構(gòu)方式,而是逐步采用多任務(wù)的設(shè)計(jì)思想。實(shí)時(shí)操作系統(tǒng)使得實(shí)時(shí)應(yīng)用程序的設(shè)計(jì)、擴(kuò)展和維護(hù)變得更容易,無(wú)需大的改動(dòng)就可以增加新的功能。然而隨著任務(wù)的增加,要求輸入的數(shù)據(jù)也會(huì)增加,類型也呈多樣化。如果仍然用矩陣式掃描鍵盤,勢(shì)必浪費(fèi)單片機(jī)巨大的資源,且增加了成本。若用PC機(jī)標(biāo)準(zhǔn)PS/2鍵盤取而代之,將可解決以上矛盾。本文介紹基于實(shí)時(shí)操作系統(tǒng)Small RTOS51的PS/2鍵盤驅(qū)動(dòng)程序的設(shè)計(jì),具有響應(yīng)快,移植性強(qiáng),占用資源少等優(yōu)點(diǎn)。 1 驅(qū)動(dòng)的設(shè)計(jì)   驅(qū)動(dòng)的實(shí)現(xiàn)一般可用以下幾種方法:① 使用任務(wù)編寫;② 使用消息編寫;③ 使用信號(hào)量編寫。PS
[嵌入式]
[國(guó)嵌筆記][008-009][遠(yuǎn)程登錄Linux]
1.windows與Linux能夠相互ping通 2.關(guān)閉Linux防火墻   /etc/init.d/iptables stop 3.通過(guò)ssh(字符界面)協(xié)議遠(yuǎn)程登錄 4.通過(guò)VNC(圖形界面)協(xié)議遠(yuǎn)程登錄   1.安裝tigervnc.rpm   2.啟動(dòng)vnc服務(wù):vncserver & 1.windows與linux能夠相互ping通 2.關(guān)閉Linux防火墻   /etc/init.d/iptables stop 3.通過(guò)SFTP共享文件 4.通過(guò)Samba服務(wù)器共享文件   1.安裝samba服務(wù)器     rpm -ivh samba.rpm   2.設(shè)置用戶登錄samba服務(wù)器的密碼     smbp
[單片機(jī)]
linux驅(qū)動(dòng)(七)gpiolib庫(kù)詳解
1:什么是gpiolib,為什么要有g(shù)piolib? linux中從2.6.35以后就開始有g(shù)piolib庫(kù)了,gpiolib的作用是對(duì)所有的gpio實(shí)行統(tǒng)一管理,因?yàn)轵?qū)動(dòng)在工作的時(shí)候,會(huì)出現(xiàn)好幾個(gè)驅(qū)動(dòng)共同使用同一個(gè)gpio的情況; 這會(huì)造成混亂。所以內(nèi)核提供了一些方法來(lái)管理gpio資源; 2:如何學(xué)習(xí)gpiolib 第一:gpiolib庫(kù)的建立; 第二:gpiolib庫(kù)的使用方法:申請(qǐng)、使用、釋放; 3:我們首先來(lái)看一下這個(gè)文件:mach-smdkc110.c這個(gè)文件: smdkc110_map_io     s5pv210_gpiolib_init 這個(gè)函數(shù)是gpiolib的初始化函數(shù) __
[單片機(jī)]
<font color='red'>linux</font><font color='red'>驅(qū)動(dòng)</font>(七)gpiolib庫(kù)詳解
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved