linux gpmod(linux gpm)
如何編寫驅(qū)動(dòng)程序?
代碼:#include<linux/module.h>#include<linux/kernel.h>#include<asm/io.h>#include<linux/miscdevice.h>#include<linux/fs.h>#include<asm/uaccess.h>//流水燈代碼#define GPM4CON 0x110002e0#define GPM4DAT 0x110002e4static unsigned long*ledcon=NULL;static unsigned long*leddat=NULL;//自定義write文件操作(不自定義的話,內(nèi)核有默認(rèn)的一套文件操作函數(shù))static ssize_t test_write(struct file*filp,const char __user*buff,size_t count,loff_t*offset){int value=0;int ret=0;ret=copy_from_user(&value,buff,4);//底層驅(qū)動(dòng)只定義基本操作動(dòng)作,不定義功能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;}return 0;}//文件操作結(jié)構(gòu)體初始化static struct file_operations g_tfops={.owner=THIS_MODULE,.write=test_write,};//雜設(shè)備信息結(jié)構(gòu)體初始化static struct miscdevice g_tmisc={.minor=MISC_DYNAMIC_MINOR,.name="test_led",.fops=&g_tfops,};//驅(qū)動(dòng)入口函數(shù)雜設(shè)備初始化static int __init test_misc_init(void){//IO地址空間映射到內(nèi)核的虛擬地址空間ledcon=ioremap(GPM4CON,4);leddat=ioremap(GPM4DAT,4);//初始化led*ledcon&=0xffff0000;*ledcon|=0x00001111;*leddat|=0x0f;//雜設(shè)備注冊(cè)函數(shù)misc_register(&g_tmisc);return 0;}//驅(qū)動(dòng)出口函數(shù)static void __exit test_misc_exit(void){//釋放地址映射iounmap(ledcon);iounmap(leddat);}//指定模塊的出入口函數(shù)module_init(test_misc_init);module_exit(test_misc_exit);MODULE_LICENSE("GPL");擴(kuò)展資料:include用法:#include命令預(yù)處理命令的一種,預(yù)處理命令可以將別的源代碼內(nèi)容插入到所指定的位置;可以標(biāo)識(shí)出只有在特定條件下才會(huì)被編譯的某一段程序代碼;可以定義類似標(biāo)識(shí)符功能的宏,在編譯時(shí),預(yù)處理器會(huì)用別的文本取代該宏。插入頭文件的內(nèi)容#include命令告訴預(yù)處理器將指定頭文件的內(nèi)容插入到預(yù)處理器命令的相應(yīng)位置。有兩種方式可以指定插入頭文件:1、#include<文件名>2、#include"文件名"如果需要包含標(biāo)準(zhǔn)庫頭文件或者實(shí)現(xiàn)版本所提供的頭文件,應(yīng)該使用第一種格式。如下例所示:#include<math.h>//一些數(shù)學(xué)函數(shù)的原型,以及相關(guān)的類型和宏如果需要包含針對(duì)程序所開發(fā)的源文件,則應(yīng)該使用第二種格式。采用#include命令所插入的文件,通常文件擴(kuò)展名是
.h
,文件包括函數(shù)原型、宏定義和類型定義。只要使用#include命令,這些定義就可被任何源文件使用。如下例所示:#include"myproject.h"http://用在當(dāng)前項(xiàng)目中的函數(shù)原型、類型定義和宏你可以在#include命令中使用宏。如果使用宏,該宏的取代結(jié)果必須確保生成正確的#include命令。例1展示了這樣的#include命令。【例1】在#include命令中的宏#ifdef _DEBUG_#define MY_HEADER"myProject_dbg.h"#else#define MY_HEADER"myProject.h"#endif#include MY_HEADER當(dāng)上述程序代碼進(jìn)入預(yù)處理時(shí),如果_DEBUG_宏已被定義,那么預(yù)處理器會(huì)插入
myProject_dbg.h
的內(nèi)容;如果還沒定義,則插入
myProject.h
的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的linux gpmod(linux gpm)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无线数传电台rs232和rs485串口接
- 下一篇: SI4463模块配合WDS的快速上手指南