雜項設(shè)備

雜項設(shè)備可以說是對一部分字符設(shè)備的封裝屁商,還有一部分不好歸類驅(qū)動也歸到雜項設(shè)備。

?1為什么會引入雜項設(shè)備?

? ? ? ? ?第一蜡镶、節(jié)省主設(shè)備號

? ? ? ? ? ? ? ?–如果所有的驅(qū)動都是用字符設(shè)備雾袱,那么所有的設(shè)備號很快就用完了,總共就255個主設(shè)備號官还。

? ? ? ? ?第二芹橡、驅(qū)動寫起來相對簡單

? ? ? ? ? ? ?–如果直接使用封裝好的雜項設(shè)備,那么就可以減少一步注冊主設(shè)備號的過程

?2雜項設(shè)備初始化文件

? ? ? ? 雜項設(shè)備初始化部分源文件“drivers/char/ misc.c”望伦,這一部分通過Makefile可知林说,是強(qiáng)制編譯的。

?3 注冊文件

? ? ? ? include/linux/miscdevice.h 頭文件

? ? ? ? struct miscdevice? {

? ? ? ? ? ? ? ? int minor;?常用的參數(shù),設(shè)備號

? ? ? ? ? ? ? ? const char *name;?常用的參數(shù),生成設(shè)備節(jié)點(diǎn)的名稱

? ? ? ? ? ? ? ? const struct file_operations *fops; ?常用的參數(shù), 指向一個設(shè)備節(jié)點(diǎn)文件

? ? ? ? ? ? ? ? struct list_head list;

? ? ? ? ? ? ? ? struct device *parent;

? ? ? ? ? ? ? ? struct device *this_device;

? ? ? ? ? ? ? ? const char *nodename;

? ? ? ? ? ? ? ?mode_t mode;

? ? ? ?};


? ? ? ? /*

? ? ? ? * NOTE:

? ? ? ?* all file operations except setlease can be called without

? ? ? ?* the big kernel lock held in all filesystems.

? ? ? */

? ? ? ? /*頭文件 include/linux/fs.h*/

? ? ? struct file_operations {

? ? ? ? ? ? ? ? struct module *owner;?必選的是參數(shù),一般是THIS_MODULE

? ? ? ? ? ? ? ? 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 (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

? ? ? ? ? ? ? ? ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

? ? ? ? ? ? ? ?int (*readdir) (struct file *, void *, filldir_t);

? ? ? ? ? ? ? ?unsigned int (*poll) (struct file *, struct poll_table_struct *);

? ? ? ? ? ? ? ? /* remove by cym 20130408 support for MT660.ko */

? ? ? ? ? ? ? ? #if 0

? ? ? ? ? ? ? ? ? ? ? ?//#ifdef CONFIG_SMM6260_MODEM

? ? ? ? ? ? ? ? ? ? ? ?#if 1// liang, Pixtree also need to use ioctl interface...

? ? ? ? ? ? ? ? ? ? ? ? ? int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

? ? ? ? ? ? ? ? ? ? ?#endif

? ? ? ? ? ? ? ? ?#endif

? ? ? ? ? ? ? ? ?/* end remove */

? ? ? ? ? ? ? ? ? ? ? ? long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);對GPIO的操作屯伞,應(yīng)用向底層驅(qū)動傳值

? ? ? ? ? ? ? ? ? ? ? ? long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

? ? ? ? ? ? ? ? ? ? ? ? int (*mmap) (struct file *, struct vm_area_struct *);

? ? ? ? ? ? ? ? ? ? ? ? int (*open) (struct inode *, struct file *);?必選的是參數(shù)

? ? ? ? ? ? ? ? ? ? ? ? int (*flush) (struct file *, fl_owner_t id);

? ? ? ? ? ? ? ? ? ? ? ? int (*release) (struct inode *, struct file *);?必選的是參數(shù)

? ? ? ? ? ? ? ? ? ? ? ? int (*fsync) (struct file *, int datasync);

? ? ? ? ? ? ? ? ? ? ? ? ?int (*aio_fsync) (struct kiocb *, 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 (*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 **);

? ? ? ? ? ? ? ? ? ? ? ?long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len);

? ? ? ? ? ? ? ? ? ? ? /* add by cym 20130408 support for MT6260 and Pixtree */

? ? ? ? ? ? ? ? ? ? ?#if defined(CONFIG_SMM6260_MODEM) || defined(CONFIG_USE_GPIO_AS_I2C)

? ? ? ? ? ? ? ? ? ? ? ? ? ? int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

? ? ? ? ? ? ? ? ? ? #endif

? ? ? ? ? ? ? ? ? /* end add */

? ? ? ? };

4.例子(devicenode_linux_module.c)

? ? ? ? #include

? ? ? ? #include

? ? ? ? /*驅(qū)動注冊的頭文件腿箩,包含驅(qū)動的結(jié)構(gòu)體和注冊和卸載的函數(shù)*

? ? ? ? /#include

? ? ? ? /*注冊雜項設(shè)備頭文件*/

? ? ? ? #include

? ? ? ? /*注冊設(shè)備節(jié)點(diǎn)的文件結(jié)構(gòu)體*/

? ? ? ? #include

? ? ? ? #define DRIVER_NAME "hello_ctl"

? ? ? ? #define DEVICE_NAME "hello_ctl123"

? ? ? ? MODULE_LICENSE("Dual BSD/GPL");

? ? ? ? MODULE_AUTHOR("TOPEET");


? ? ? ? /*ioctl*/? ? ? ?

? ? ? ? static long hello_ioctl( struct file *files, unsigned int cmd, unsigned long arg){

? ? ? ? ? ? ? ? printk("cmd is %d,arg is %d\n",cmd,arg);

? ? ? ? ? ? ? ? return 0;

? ? ? ? }

? ? ? ? ? /*close*/

? ? ? ? static int hello_release(struct inode *inode, struct file *file){

? ? ? ? ? ? ? ? printk(KERN_EMERG "hello release\n");

? ? ? ? ? ? ? ? return 0;

? ? ? ? }

? ? ? ? static int hello_open(struct inode *inode, struct file *file){

? ? ? ? ? ? ? ? printk(KERN_EMERG "hello open\n");

? ? ? ? ? ? ? ? return 0;

? ? ? ? }

? ? ? ? static struct file_operations hello_ops = {

? ? ? ? ? ? ? ? .owner = THIS_MODULE,

? ? ? ? ? ? ? ? .open = hello_open,

? ? ? ? ? ? ? ? .release = hello_release,

? ? ? ? ? ? ? ? .unlocked_ioctl = hello_ioctl,

? ? ? ? };

? ? ? ? static? struct miscdevice hello_dev = {

? ? ? ? ? ? ? ? .minor = MISC_DYNAMIC_MINOR,

? ? ? ? ? ? ? ? .name = DEVICE_NAME,

? ? ? ? ? ? ? ? .fops = &hello_ops,

? ? ? ? };

? ? ? ? static int hello_probe(struct platform_device *pdv){

? ? ? ? ? ? ? ? printk(KERN_EMERG "\tprobe initialized\n");?

? ? ? ? ? ? ? ? misc_register(&hello_dev);

? ? ? ? ? ? ? ? return 0;

? ? ? ? }

? ? ? ? static int hello_remove(struct platform_device *pdv){

? ? ? ? ? ? ? ? printk(KERN_EMERG "\tremove\n");

? ? ? ? ? ? ? ? misc_deregister(&hello_dev);

? ? ? ? ? ? ? ? return 0;

? ? ? ? }

? ? ? ? static void hello_shutdown(struct platform_device *pdv){

? ? ? ? ? ? ? ? ;

? ? ? ? }

? ? ? ? static int hello_suspend(struct platform_device *pdv,pm_message_t pmt){

? ? ? ? ? ? ? ?return 0;

? ? ? ? }

? ? ? ? static int hello_resume(struct platform_device *pdv){

? ? ? ? ? ? ? ? return 0;

? ? ? ? }

? ? ? ? struct platform_driver hello_driver = {

? ? ? ? ? ? ? ?.probe = hello_probe,

? ? ? ? ? ? ? .remove = hello_remove,

? ? ? ? ? ? ? ?.shutdown = hello_shutdown,

? ? ? ? ? ? ? ?.suspend = hello_suspend,

? ? ? ? ? ? ? ?.resume = hello_resume,

? ? ? ? ? ? ? ?.driver = {

? ? ? ? ? ? ? ? ? ? ? ?.name = DRIVER_NAME,

? ? ? ? ? ? ? ? ? ? ? ?.owner = THIS_MODULE,

? ? ? ? ? ? ?}

? ? ? ? };

? ? ? ? static int hello_init(void)

? ? ? ? {

? ? ? ? ? ? ? ?printk(KERN_EMERG "HELLO WORLD enter!\n");

? ? ? ? ? ? ? ?int DriverState = platform_driver_register(&hello_driver);?

? ? ? ? ? ? ? ?printk(KERN_EMERG "\tDriverState is %d\n",DriverState);

? ? ? ? ? ? ? ?return 0;

? ? ? ?}

? ? ? ? static void hello_exit(void)

? ? ? ? {

? ? ? ? ? ? ? ? printk(KERN_EMERG "HELLO WORLD exit!\n");

? ? ? ? ? ? ? ?platform_driver_unregister(&hello_driver);

? ? ? ? }

? ? ? ? module_init(hello_init);

? ? ? ? module_exit(hello_exit);

5.Makefile

? ? ? ? #!/bin/bash

? ? ? ?#通知編譯器我們要編譯模塊的哪些源碼

? ? ? ? #這里是編譯devicenode_linux_module.c這個文件編譯成中間文件devicenode_linux_module.o

? ? ? ??obj-m += devicenode_linux_module.o

? ? ? ? #源碼目錄變量,這里用戶需要根據(jù)實(shí)際情況選擇路徑

? ? ? ? #作者是將Linux的源碼拷貝到目錄/home/topeet/android4.0下并解壓的

? ? ? ??KDIR := /home/topeet/android4.0/iTop4412_Kernel_3.0

? ? ? ? #當(dāng)前目錄變量

? ? ? ?PWD ?= $(shell pwd)

? ? ? ?#make命名默認(rèn)尋找第一個目標(biāo)

? ? ? ?#make -C就是指調(diào)用執(zhí)行的路徑

? ? ? ? #$(KDIR)Linux源碼目錄劣摇,作者這里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0

? ? ? ? #$(PWD)當(dāng)前目錄變量

? ? ? ? #modules要執(zhí)行的操作

all:

make -C $(KDIR) M=$(PWD) modules

#make clean執(zhí)行的操作是刪除后綴為o的文件

clean:

rm -rf *.o

6.make,編譯后同驅(qū)動注冊一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末珠移,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子末融,更是在濱河造成了極大的恐慌钧惧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勾习,死亡現(xiàn)場離奇詭異浓瞪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巧婶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門乾颁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艺栈,你說我怎么就攤上這事英岭。” “怎么了眼滤?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵巴席,是天一觀的道長历涝。 經(jīng)常有香客問我诅需,道長,這世上最難降的妖魔是什么荧库? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任堰塌,我火速辦了婚禮,結(jié)果婚禮上分衫,老公的妹妹穿的比我還像新娘场刑。我一直安慰自己,他們只是感情好蚪战,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布牵现。 她就那樣靜靜地躺著铐懊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞎疼。 梳的紋絲不亂的頭發(fā)上科乎,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機(jī)與錄音贼急,去河邊找鬼茅茂。 笑死,一個胖子當(dāng)著我的面吹牛太抓,可吹牛的內(nèi)容都是我干的空闲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼走敌,長吁一口氣:“原來是場噩夢啊……” “哼碴倾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悔常,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤影斑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后机打,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矫户,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年残邀,在試婚紗的時候發(fā)現(xiàn)自己被綠了皆辽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡芥挣,死狀恐怖驱闷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情空免,我是刑警寧澤空另,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蹋砚,受9級特大地震影響扼菠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坝咐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一循榆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧墨坚,春花似錦秧饮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柑船。三九已至,卻和暖如春泼各,著一層夾襖步出監(jiān)牢的瞬間椎组,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工历恐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寸癌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓弱贼,卻偏偏與公主長得像蒸苇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吮旅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容