代碼:#include<linux/module.h>#include<linux/kernel.h>#include<asm/io.h>#include<linux/miscdevice.h>#include<linux/fs.h>#include<asm/uaccess.h>//流水燈代碼#defineGPM4CON0x110002e0#defineGPM4DAT0x110002e4staticunsignedlong*ledcon=NULL;staticunsignedlong*leddat=NULL;//自定義write文件操作(不自定義的話,內核有默認的一套文件操作函數)staticssize_ttest_write(structfile*filp,constchar__user*buff,size_tcount,loff_t*offset){intvalue=0;intret=0;ret=copy_from_user(&value,buff,4);//底層驅動只定義基本操作動作,不定義功能if(value==1){*leddat|=0x0f;*leddat&=0xfe;}if(value==2){*leddat|=0x0f;*leddat&=0xfd;}if(value==3){*leddat|=0x0f;*leddat&=0xfb;}if(value==4){*leddat|=0x0f;*leddat&=0xf7;}return0;}//文件操作結構體初始化staticstructfile_operationsg_tfops={.owner=THIS_MODULE,.write=test_write,};//雜設備信息結構體初始化staticstructmiscdeviceg_tmisc={.minor=MISC_DYNAMIC_MINOR,.name="test_led",.fops=&g_tfops,};//驅動入口函數雜設備初始化staticint__inittest_misc_init(void){//IO地址空間映射到內核的虛擬地址空間ledcon=ioremap(GPM4CON,4);leddat=ioremap(GPM4DAT,4);//初始化led*ledcon&=0xffff0000;*ledcon|=0x00001111;*leddat|=0x0f;//雜設備注冊函數misc_register(&g_tmisc);return0;}//驅動出口函數staticvoid__exittest_misc_exit(void){//釋放地址映射iounmap(ledcon);iounmap(leddat);}//指定模塊的出入口函數module_init(test_misc_init);module_exit(test_misc_exit);MODULE_LICENSE("GPL");擴展資料:include用法:#include命令預處理命令的一種,預處理命令可以將別的源代碼內容插入到所指定的位置;可以標識出只有在特定條件下才會被編譯的某一段程序代碼;可以定義類似標識符功能的宏,在編譯時,預處理器會用別的文本取代該宏。插入頭文件的內容#include命令告訴預處理器將指定頭文件的內容插入到預處理器命令的相應位置。有兩種方式可以指定插入頭文件:1、#include<文件名>2、#include"文件名"如果需要包含標準庫頭文件或者實現版本所提供的頭文件,應該使用第一種格式。如下例所示:#include<math.h>//一些數學函數的原型,以及相關的類型和宏如果需要包含針對程序所開發的源文件,則應該使用第二種格式。采用#include命令所插入的文件,通常文件擴展名是
.h
,文件包括函數原型、宏定義和類型定義。只要使用#include命令,這些定義就可被任何源文件使用。如下例所示:#include"myproject.h"http://用在當前項目中的函數原型、類型定義和宏你可以在#include命令中使用宏。如果使用宏,該宏的取代結果必須確保生成正確的#include命令。例1展示了這樣的#include命令。【例1】在#include命令中的宏#ifdef_DEBUG_#defineMY_HEADER"myProject_dbg.h"#else#defineMY_HEADER"myProject.h"#endif#includeMY_HEADER當上述程序代碼進入預處理時,如果_DEBUG_宏已被定義,那么預處理器會插入myProject_dbg.h
的內容;如果還沒定義,則插入myProject.h
的內容。