版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、驅(qū)動(dòng)1 模塊21.1模塊概念21.2 模塊的描述規(guī)則21.3模塊的編譯21.4模塊的使用31.5_init _exit宏41.6Printk函數(shù)41.7內(nèi)核符號(hào)42 設(shè)備驅(qū)動(dòng)62.1 linux設(shè)備驅(qū)動(dòng)的三種類型62.2 字符設(shè)備特點(diǎn)62.3 字符設(shè)備的描述62.4 字符設(shè)備的調(diào)試82.5 linux訪問(wèn)外設(shè)與使用82.6自動(dòng)創(chuàng)建設(shè)備文件92.7GPIO102.8雜項(xiàng)設(shè)備112.9自動(dòng)安裝驅(qū)動(dòng)模塊122.10高級(jí)字符驅(qū)動(dòng)IOCTL接口133linux互斥同步與中斷處理133.1原子操作:133.2自旋鎖143.3信號(hào)量與互斥鎖153.4等待隊(duì)列163.5linux中斷處理173.6軟中斷183
2、.7 內(nèi)核定時(shí)器211 模塊模塊機(jī)制,作用提高linux操作系統(tǒng)的擴(kuò)充性。1.1 模塊概念 動(dòng)態(tài)可加載內(nèi)核模塊LKM。 內(nèi)核空間運(yùn)行。 是不是一執(zhí)行文件,是一個(gè)沒(méi)有經(jīng)過(guò)鏈接,不能獨(dú)立運(yùn)行的一個(gè)目標(biāo)文件(.c-.0-.ko) 通過(guò)insmod命令,把內(nèi)核模塊載入內(nèi)核空間,rmmod命令 。koc從內(nèi)核空間移除。 一個(gè)設(shè)備驅(qū)動(dòng)的驅(qū)動(dòng)代碼對(duì)應(yīng)一個(gè)module 模塊的驅(qū)動(dòng)源代碼里面,使用那些頭文件是在內(nèi)核源代碼,是不能使用C語(yǔ)音的庫(kù)存函數(shù)。1.2 模塊的描述規(guī)則一個(gè)簡(jiǎn)單的module:#include/內(nèi)核頭文件#includeStatic int _init test1_init(void) /入口
3、函數(shù)(一般放驅(qū)動(dòng)初始化代碼,比如申請(qǐng)資源,注冊(cè)中斷,注冊(cè)字符設(shè)備。)Printk(“hello world!n”);Return 0;注意:加關(guān)鍵字static代表的是靜態(tài)函數(shù),靜態(tài)函數(shù)的調(diào)用結(jié)果不會(huì)訪問(wèn)或者修改任何對(duì)象(非static)數(shù)據(jù)成員,且只能本文件內(nèi)使用,不能在其他文件使用,防止同名函數(shù)沖突。Static void _exit teste1_exit(void)/出口函數(shù)(釋放初始化資源)Printk(“goodbye!n”);Module_init(test1_init);/驅(qū)動(dòng)入口 #insmod *.koModule_exit(test1_exit);/驅(qū)動(dòng)的出口 #rmmo
4、d *.ko/#modinfo *.ko 可以查看module的信息,不是必須的MODULE_AUTHOR(“fbxGEC”);MODULE_DESCRIPTION(“the first module of drivers”);MODULE_LICENES(“GPL”);MODULE_VERSION(“V1.0”);注意 1. 由module_init()指定模塊入口函數(shù)test_init,像應(yīng)用程序main(),入口函數(shù)返回值int 0 代表成功,非0代表失敗。 2. 由module_exit()宏 指定出口函數(shù)test_txit 退出函數(shù)返回值void 3. MODULE_GLICENSE
5、等宏描述的是當(dāng)前模塊對(duì)應(yīng)的信息。1.3 模塊的編譯Makefile文件:obj-m += module.o KERN_DIR=/home/gec/syscro/kernel/android-kernel-samsung-devPWD := $(shell pwd)modules:$(MAKE) -C $(KERN_DIR) M=$(PWD) modulesclean:$(MAKE) -C $(KERN_DIR) M=$(PWD) modules clean- obj-m += module.o (module.c) /將驅(qū)動(dòng)源代碼編譯成一個(gè)獨(dú)立的module .ko KERN_DIR=/hom
6、e/gec/syscro/kernel/android-kernel-samsung-dev 驅(qū)動(dòng)源代碼在編譯時(shí)候,所使用內(nèi)核源碼包的目錄路徑(跟安裝當(dāng)前模塊的內(nèi)核應(yīng)一致) PWD :=$(shell pwd)當(dāng)前目錄 $(MAKE) C $(KERN_DIR) M=$(PWD) modules$(MAKE) make-C $(KERN_DIR)轉(zhuǎn)到內(nèi)核源碼包的目錄下執(zhí)行make -調(diào)用內(nèi)核源碼包根目錄下的Makefile .oM=$(PWD) modules -轉(zhuǎn)回當(dāng)前目錄下,-.ko這句是Makefile的規(guī)則:這里的$(MAKE)就相當(dāng)于make,-C選項(xiàng)的作用是指將當(dāng)前工作目錄轉(zhuǎn)移到你
7、所指定的位置。“M=”選項(xiàng)的作用是,當(dāng)用戶需要以某個(gè)內(nèi)核為基礎(chǔ)編譯一個(gè)外部模塊的話,需要在make modules命令中加入“M=dir”,程序會(huì)自動(dòng)到你所指定的dir目錄中查找模塊源碼,將其編譯,生成KO文件.編譯過(guò)程:makemake -C /home/gec/syscro/kernel/android-kernel-samsung-dev M=/mnt/hgfs/105/driver/001/demo1 modulesmake1: Entering directory /home/gec/syscro/kernel/android-kernel-samsung-dev CC M /mnt
8、/hgfs/105/driver/001/demo1/module.o Building modules, stage 2.make2: Warning: File /mnt/hgfs/105/driver/001/demo1/module.o has modification time 1.4e+02 s in the future MODPOST 1 modules CC /mnt/hgfs/105/driver/001/demo1/module.mod.o LD M /mnt/hgfs/105/driver/001/demo1/module.komake2: warning: Clock
9、 skew detected. Your build may be incomplete.make1: Leaving directory /home/gec/syscro/kernel/android-kernel-samsung-dev1.4 模塊的使用模塊的使用命令1. file 查看下文件的屬性2. modinfo 查看信息3. size 數(shù)據(jù)大小 text data bss dec hexfilename 296 292 0 588 24cmodule.ko注意:1. 編譯驅(qū)動(dòng)時(shí)候,必須要有一個(gè)內(nèi)核源碼包 2. 內(nèi)核源碼包必須配置,編譯過(guò)的,(make)3. 最好編譯驅(qū)動(dòng)所使用編譯驅(qū)
10、動(dòng)所使用的內(nèi)核源代碼包與生成uImag的內(nèi)核源碼包使用同一個(gè)。.Ko的使用1. 下載tftp -g -r module.ko (根文件燒寫flash) NFS2. 安裝insmod module.ko 3. 查看內(nèi)核已安裝的模塊顯示lsmod module 538 0 - Live 0xbf00000struct module -state -MODULE_STATE_LIVE (已安裝成功,正常使用中)-MODULE_STATE_CONING (模塊當(dāng)前正在安裝(被加載)4.移除rmmod module.kostruct module -state -MODULE_S
11、TATE_GOING(當(dāng)前模塊正在移除)1.5 _init _exit宏 _init所修飾代碼-.init.text段 如果模塊直接參給編譯進(jìn)內(nèi)核,并不是變成.ko文件再加載,那么_init修飾的函數(shù),在完成初始化后,直接釋放_(tái)init修飾的函數(shù)的資源 _exit所修飾代碼- .exit.text段 _exit用于驅(qū)動(dòng)變成模塊時(shí)候,在模塊移除時(shí),通知系統(tǒng)實(shí)現(xiàn)資源釋放。1.6 Printk函數(shù)在內(nèi)核中,通知console輸出的時(shí)候,使用printk()Printk和printf 在不同空間運(yùn)行的。 Printk輸出有優(yōu)先級(jí),printf沒(méi)有kernel:printk(hellon);user :
12、printf(hellon);printk的優(yōu)先級(jí)#defineKERN_EMERG/* system is unusable*/#defineKERN_ALERT/* action must be taken immediately*/#defineKERN_CRIT/* critical conditions*/#defineKERN_ERR/* error conditions*/#defineKERN_WARNING/* warning conditions*/#defineKERN_NOTICE/* normal but significant condition*/#defineK
13、ERN_INFO/* informational*/#defineKERN_DEBUG/* debug-level messages*/printk(hellon)-printk(KERN_WARNING hellon); -printk( hellon)查看默認(rèn)優(yōu)先級(jí):GEC2103 /# cat /proc/sys/kernel/printk7 4 1 77-控制臺(tái)輸出的最低優(yōu)級(jí),優(yōu)先級(jí)的數(shù)字小于當(dāng)前值,才可以輸出.4-控制臺(tái)輸出的默認(rèn)優(yōu)先級(jí)1-控制臺(tái)可能最小的優(yōu)先級(jí) echo 7 5 1 7 /proc/sys/kernel/printk1.7 內(nèi)核符號(hào)1.6.1 內(nèi)核的每個(gè)函數(shù)與變量都
14、有一個(gè)內(nèi)核符號(hào)Add_x() - kstrtab_add_x1.6.2 內(nèi)核符合表:內(nèi)核符號(hào)導(dǎo)出公用后,所公用的內(nèi)核符號(hào)集合add_x()EXPORT_SYMBOL(add_x) /導(dǎo)出為公用static int count = 4;module_param(count, int, 0); /聲明一個(gè)變量是模塊的參數(shù),安裝ko的時(shí)候可以引入該參數(shù)MODULE_PARM_DESC(count, count - the count of printk ); /參數(shù)的描述。 #modinfo *.ko2 設(shè)備驅(qū)動(dòng)設(shè)備驅(qū)動(dòng)程序:以內(nèi)核模塊存在。設(shè)備程序和系統(tǒng)調(diào)度的關(guān)系:系統(tǒng)調(diào)度: 應(yīng)用程序與操作系統(tǒng)(
15、內(nèi)核)之間的接口設(shè)備驅(qū)動(dòng)程序: 內(nèi)核和設(shè)備硬件之間的接口2.1 linux設(shè)備驅(qū)動(dòng)的三種類型 字符設(shè)備:LED,顯卡,聲卡,鍵盤,觸摸屏。 塊設(shè)備:硬盤,nandflash,SD,U盤。 網(wǎng)絡(luò)設(shè)備:網(wǎng)卡(無(wú)線,有線)2.2 字符設(shè)備特點(diǎn)(1)應(yīng)用程序和設(shè)備進(jìn)行數(shù)據(jù)交互時(shí),是以字節(jié)單位經(jīng)行的。(2)訪問(wèn)的數(shù)據(jù)是連續(xù)時(shí),實(shí)時(shí)的。(3)不帶緩存,塊設(shè)備驅(qū)動(dòng)是帶緩存的。2.3 字符設(shè)備的描述(1)cdev結(jié)構(gòu)struct cdev struct kobject kobj;/不關(guān)心,是內(nèi)核管理設(shè)備使用struct module *owner;/cdev屬于那個(gè)體module,一般寫THIS_MODULE
16、const struct file_operations *ops;/操作集(設(shè)備驅(qū)動(dòng)),是應(yīng)用程序訪問(wèn)設(shè)備的驅(qū)動(dòng)接口struct list_head list;/內(nèi)核鏈表:將當(dāng)前的cdev放到一鏈表,方便內(nèi)核管理cdevdev_t dev;/設(shè)備號(hào),每個(gè)字符設(shè)備都有字節(jié)的設(shè)備號(hào),設(shè)備好在當(dāng)前內(nèi)核是唯一的,在32BITs,32無(wú)符號(hào)整形unsigned int count;/在當(dāng)前設(shè)備號(hào)里面有多少個(gè)次設(shè)備號(hào);struct file_operations struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssiz
17、e_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
18、(*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned i
19、nt, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);文件操作集(2)cdev里的設(shè)備號(hào)1 定義 typedef u_long dev_t; typedef unsigned long u_long; 設(shè)備號(hào).每個(gè)字符設(shè)備都有自已的設(shè)備號(hào),
20、設(shè)備號(hào)在當(dāng)內(nèi)核中是唯一,在32 BITs,32無(wú)符號(hào)整形。設(shè)備號(hào)是由主設(shè)備號(hào)和次設(shè)備號(hào)組成:主設(shè)備號(hào):其類型類的設(shè)備 31:20次設(shè)備號(hào):該類型的設(shè)備下,具體那個(gè)設(shè)備實(shí)例。19:02 相關(guān)函數(shù)2.1由設(shè)備號(hào)得到主次設(shè)備號(hào)#define MAJOR(dev) (unsigned int) (dev) MINORBITS)#define MINOR(dev)(unsigned int) (dev) & MINORMASK)2.2主次設(shè)備號(hào)得到設(shè)備號(hào)#define MKDEV(ma,mi)(ma) 主設(shè)備號(hào)mi-次設(shè)備號(hào)2.3設(shè)備號(hào)向內(nèi)核注冊(cè)定義一個(gè)cdev時(shí),首先在內(nèi)核中申請(qǐng)一個(gè)設(shè)備號(hào),獲得設(shè)備號(hào)
21、的方法有兩種。2.3.1向內(nèi)核靜態(tài)注冊(cè)一個(gè)設(shè)備號(hào)字節(jié)定制一個(gè)設(shè)備號(hào),向內(nèi)核注冊(cè)(申請(qǐng)),如果內(nèi)核中沒(méi)有占用設(shè)備號(hào),代表注冊(cè)成功。int register_chrdev_region(dev_t from, unsigned count, const char *name)參數(shù)說(shuō)明:From:設(shè)備號(hào)的值Name:設(shè)備的名稱Count:次設(shè)備的數(shù)量返回值:成功:0失?。贺?fù)數(shù)2.3.2自動(dòng)分配一個(gè)(空閑)設(shè)備號(hào)int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name)參數(shù):*dev:
22、申請(qǐng)的設(shè)備號(hào)Baseminor:申請(qǐng)?jiān)O(shè)備號(hào)第一個(gè)次設(shè)備號(hào)Count:申請(qǐng)次設(shè)備號(hào)的數(shù)量Name:設(shè)備名稱返回值:成功:0失敗:負(fù)數(shù)注意:一定要判斷申請(qǐng)是否成功dev_t det;alloc_chrdev_region(&det,0,2,test);2.3.3注銷一個(gè)已經(jīng)注冊(cè)的設(shè)備號(hào)當(dāng)驅(qū)動(dòng)程序移除時(shí),一定要先注銷設(shè)備號(hào)void unregister_chrdev_region(dev_t from, unsigned count)參數(shù):from-設(shè)備號(hào)的值,第一個(gè)設(shè)備號(hào) count-次設(shè)備號(hào)的數(shù)量2.4文件操作集Struct file_operations文件操作集是內(nèi)核管理cdev那設(shè)備的驅(qū)動(dòng)
23、接口,驅(qū)動(dòng)程序程序提供應(yīng)用程序的一個(gè)接口。int testopen(struct inode *inode, struct file *file)int testclose (struct inode *inode, struct file *file);ssize_t testread(struct file *, char _user *, size_t, loff_t *)struct file_operations fops= -結(jié)構(gòu)體初始化 .owner=THIS_MODULE,.open=testopen,.read=testread,.release=testclose,2.5c
24、dev初始化和注冊(cè)(1)cdev的初始化函數(shù)Void cdev_init(struct cdev *cdev,const struct file_operations *fops)參數(shù):Cdev:要初始化的cdevFope:cdev的文件操作集(2)注冊(cè)注銷cdev到內(nèi)核的函數(shù)Int cdev_add(struct cdev *p,dev_t dev,unsigned )參數(shù):P:注冊(cè)的那個(gè)cdevDev:設(shè)備號(hào)Count:次設(shè)備個(gè)數(shù)strcut cdev cd;cdev_init(&cd,&fops)cd.owner=THIS_MODULE;(3)內(nèi)核用戶空間數(shù)據(jù)交互將內(nèi)核空間數(shù)據(jù)copy到
25、用戶空間unsigned long copy_to_user(void _user *to,const void *from,unsigned long n)將用戶空間數(shù)據(jù)copy到內(nèi)核空間unsigned long copy_from_user(void * to,const void _user * from ,unsigned long n)2.4 字符設(shè)備的調(diào)試(1)安裝驅(qū)動(dòng) insmod chrdev.ko(2)查看分配的設(shè)備號(hào) cat /proc/devices(3)手動(dòng)創(chuàng)建設(shè)備文件Mknod /dev/chrdev c 250 0Ls /dev/chrdev l(4)應(yīng)用程序來(lái)/
26、dev/chrdev設(shè)備文件,等效操作設(shè)備文件對(duì)應(yīng)那個(gè)設(shè)備2.5 linux訪問(wèn)外設(shè)與使用方法: IO端口(IO port)Linux系統(tǒng)給外設(shè)分配不同的端口號(hào),linux利用端口號(hào)來(lái)訪問(wèn)設(shè)備(驅(qū)動(dòng))(cpu x86)Cpu訪問(wèn)外設(shè)通過(guò)段號(hào),訪問(wèn)通過(guò)地址gecubuntu:/mnt/hgfs/tea/demo2$ cat /proc/ioports 0000-0cf7 : PCI Bus 0000:00 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-0060 : keyboard 006
27、4-0064 : keyboard 0070-0071 : rtc0 0080-008f : dma page reg 00a0-00a1 : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : 0000:00:07.1 0170-0177 : ata_piix IO內(nèi)存(IO mem) -ARM/MPISCpu訪問(wèn)外設(shè)的方法和訪問(wèn)內(nèi)存方法都是一樣,都是根據(jù)地址來(lái)訪問(wèn),外設(shè)(GPIO,ADC,WDT)都內(nèi)存一樣,都是同一編址。使用:Linux中IO內(nèi)存的使用:申請(qǐng)IO內(nèi)存區(qū),動(dòng)態(tài)映射,使用虛擬地址,解除動(dòng)態(tài)映射,釋放IO內(nèi)存區(qū)。2.5.1 IO內(nèi)
28、存的申請(qǐng)Struct resource *request_mem_region(resource_size_t start,resource_size_t n,const char *name)參數(shù)值:Start:資源的內(nèi)存區(qū)的開(kāi)始地址(物理地址)N:物理內(nèi)存區(qū)的大小Name:自定義內(nèi)存區(qū)的名字cat /proc/iomem返回值:Struct resource *:申請(qǐng)到的資源NULL:申請(qǐng)失敗2.5.2 釋放IO內(nèi)存Void release_men_region(resource_size_t start,resource_size_t n)2.5.3 IO的動(dòng)態(tài)內(nèi)存映射Void _iom
29、em * ioremap(unsigned long phys_addr,unsigned long size)參數(shù):Unsigned long phys_addr:需要映射的物理內(nèi)存的地址Unsigned long size :需要映射的物理內(nèi)存大小返回值:Void _iomem* :映射后虛擬地址(開(kāi)始地址)NULL:失敗2.5.4 IO內(nèi)存動(dòng)態(tài)映射的解除Void iounmap(void *addr)Void *addr:映射后的虛擬地址2.5.5 訪問(wèn)虛擬地址的函數(shù)(讀寫)unsigned int ioread32(void _iomem *addr) void _iomem *add
30、r-虛擬地址unsigned int -數(shù)據(jù)void iowrite32(u32 b, void _iomem *addr);例:unsigned int a=ioread(GPJ2CON_VA);a &= ;iowrite32(a,GPJ2CON_VA)2.static inline u32 readl(const volatile void _iomem *addr)static inline void writel(unsigned int b, volatile void _iomem *addr)3.static inline u32 _raw_readl(const volatil
31、e void _iomem *addr)static inline void _raw_writel(u32 v, volatile void _iomem *addr)2.6 自動(dòng)創(chuàng)建設(shè)備文件自動(dòng)創(chuàng)建設(shè)備文件的流程:字符設(shè)備驅(qū)動(dòng)模塊-創(chuàng)建一個(gè)設(shè)備驅(qū)動(dòng)class-創(chuàng)建屬于class的device-調(diào)用mdev工具(自動(dòng)完成)-生成設(shè)備文件Mdev工具會(huì)根據(jù)/sys下的class找到相對(duì)應(yīng)的device,然后根據(jù)device創(chuàng)建設(shè)備文件Class /sys/classDevice /sys/device 創(chuàng)建class/注銷classStruct class *class_create(stru
32、ct module *owner,const char *name)參數(shù):Struct module *owner:class屬于那些一個(gè)module-THIS_MODULEConst char * name -自定義的類名返回值:Null:失敗Void class_destroy(struct class * cls) 創(chuàng)建device /銷毀Struct device *device_create(struct class *class, struct device *parent,dev_t devt,void *drvdata,const char * fmt,)參數(shù):Struct c
33、lass *class:當(dāng)前device屬于哪個(gè)classStruct device *parent:device的parent,一般為NULLDev_t devt:設(shè)備號(hào)Void * drvdate : 設(shè)備的私有數(shù)據(jù),一般為NULLConst char * fmt :device的名字,也就是設(shè)備文件返回值:Struct device *NULL:失敗void device_destroy(struct class * class,dev_t devt);2.7 GPIO申請(qǐng)IO內(nèi)存區(qū),動(dòng)態(tài)映射,使用虛擬地址,解除動(dòng)態(tài)映射,釋放IO內(nèi)存區(qū)GPIO的標(biāo)準(zhǔn)接口函數(shù)#includeGPIO* S
34、5PV210 GPIO number definitions */#define S5PV210_GPA0(_nr)(S5PV210_GPIO_A0_START + (_nr)#define S5PV210_GPA1(_nr)(S5PV210_GPIO_A1_START + (_nr)#define S5PV210_GPB(_nr)(S5PV210_GPIO_B_START + (_nr)#define S5PV210_GPC0(_nr)(S5PV210_GPIO_C0_START + (_nr)#define S5PV210_GPC1(_nr)(S5PV210_GPIO_C1_START +
35、 (_nr)#define S5PV210_GPD0(_nr)(S5PV210_GPIO_D0_START + (_nr)#define S5PV210_GPD1(_nr)(S5PV210_GPIO_D1_START + (_nr)#define S5PV210_GPE0(_nr)(S5PV210_GPIO_E0_START + (_nr)#define S5PV210_GPE1(_nr)(S5PV210_GPIO_E1_START + (_nr)#define S5PV210_GPF0(_nr)(S5PV210_GPIO_F0_START + (_nr)#define S5PV210_GPF
36、1(_nr)(S5PV210_GPIO_F1_START + (_nr)#define S5PV210_GPF2(_nr)(S5PV210_GPIO_F2_START + (_nr)#define S5PV210_GPF3(_nr)(S5PV210_GPIO_F3_START + (_nr)#define S5PV210_GPG0(_nr)(S5PV210_GPIO_G0_START + (_nr)#define S5PV210_GPG1(_nr)(S5PV210_GPIO_G1_START + (_nr)#define S5PV210_GPG2(_nr)(S5PV210_GPIO_G2_ST
37、ART + (_nr)#define S5PV210_GPG3(_nr)(S5PV210_GPIO_G3_START + (_nr)#define S5PV210_GPH0(_nr)(S5PV210_GPIO_H0_START + (_nr)#define S5PV210_GPH1(_nr)(S5PV210_GPIO_H1_START + (_nr)#define S5PV210_GPH2(_nr)(S5PV210_GPIO_H2_START + (_nr)#define S5PV210_GPH3(_nr)(S5PV210_GPIO_H3_START + (_nr)#define S5PV21
38、0_GPI(_nr)(S5PV210_GPIO_I_START + (_nr)#define S5PV210_GPJ0(_nr)(S5PV210_GPIO_J0_START + (_nr)#define S5PV210_GPJ1(_nr)(S5PV210_GPIO_J1_START + (_nr)#define S5PV210_GPJ2(_nr)(S5PV210_GPIO_J2_START + (_nr)#define S5PV210_GPJ3(_nr)(S5PV210_GPIO_J3_START + (_nr)#define S5PV210_GPJ4(_nr)(S5PV210_GPIO_J4
39、_START + (_nr)#define S5PV210_MP01(_nr)(S5PV210_GPIO_MP01_START + (_nr)#define S5PV210_MP02(_nr)(S5PV210_GPIO_MP02_START + (_nr)#define S5PV210_MP03(_nr)(S5PV210_GPIO_MP03_START + (_nr)#define S5PV210_MP04(_nr)(S5PV210_GPIO_MP04_START + (_nr)#define S5PV210_MP05(_nr)(S5PV210_GPIO_MP05_START + (_nr)#
40、define S5PV210_MP06(_nr)(S5PV210_GPIO_MP06_START + (_nr)#define S5PV210_MP07(_nr)(S5PV210_GPIO_MP07_START + (_nr)#define S5PV210_MP10(_nr)(S5PV210_GPIO_MP10_START + (_nr)#define S5PV210_MP11(_nr)(S5PV210_GPIO_MP11_START + (_nr)#define S5PV210_MP12(_nr)(S5PV210_GPIO_MP12_START + (_nr)#define S5PV210_
41、MP13(_nr)(S5PV210_GPIO_MP13_START + (_nr)#define S5PV210_MP14(_nr)(S5PV210_GPIO_MP14_START + (_nr)2.7.1 申請(qǐng)/釋放資源Static inline int gpio_request(unsigned gpio,const char *label)參數(shù):Gpio:引腳編號(hào)S5PV210_GPJ2(0) /S5PV210_GPJ2(1) S5PV210_GPJ2(2)Label:名字“GPJ2_0”返回值:都會(huì)自動(dòng)設(shè)備創(chuàng)建設(shè)備文件)./test 2.驅(qū)動(dòng)程序本身編譯進(jìn)內(nèi)核(uImage)流程:le
42、d.c(demo.c)(驅(qū)動(dòng)源代碼) -編譯進(jìn)內(nèi)核里1.在內(nèi)核源代碼里, drivers/char/ 創(chuàng)建目錄:led2.cp led.c drivers/char/led3.drivers/char/led 創(chuàng)建一個(gè)Kconfig文件(定義條件編譯選項(xiàng),生成配置菜單 (make menuconfig) - .configmenu leds driversconfigGEC210_LEDtristate LED driver for gec210depend on ARCH_S5PV210default yhelp this is a driver for led on gec210.endm
43、enu4. drivers/char/的Kconfig文件里加下 /找到下級(jí)Kconfigsource drivers/char/led/Kconfig - CONFIG_GEC210_LED=y5. drivers/char/led 產(chǎn)生Makefile obj-$(CONFIG_GEC210_LED) +=led.o /obj-y +=led.o6.drivers/char/Makefile 找到下級(jí)makefileobj-$(CONFIG_GEC210_LED) +=led/準(zhǔn)備:led.c- zImage1.make menuconfig-Device drivers-characte
44、r devices -leds driversLED driver for gec2102. make - zImage - uImage3. CC /drviers/char/led/led.o4.uImage啟動(dòng)過(guò)程中,led驅(qū)動(dòng)自安動(dòng)安裝.2.10 高級(jí)字符驅(qū)動(dòng)IOCTL接口(1)應(yīng)用程序#includeInt ioctl(int fd,int cmd,unsigned long args)(2)驅(qū)動(dòng)程序struct file_operationsint (*ioctl) (struct inode *, struct file *, unsigned int, unsigned lon
45、g);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);在linux2.3.36以前的內(nèi)核支持ioctl接口函數(shù),過(guò)度階段中ioctl和unlock_ioctl同時(shí)使用,但帶2.6.36以后,內(nèi)核取消內(nèi)核銷機(jī)制,這樣內(nèi)核不ioctl接口(3)IOCTL作用應(yīng)用程序向驅(qū)動(dòng)程序發(fā)送命令cmd應(yīng)用程序和驅(qū)動(dòng)程序之間參數(shù)數(shù)據(jù)args(4) unsigned int cmd 格式cmd15:8 -魔數(shù)(type)cmd29:16-args的大小(size)cmd31:30-args的傳輸方向(r,w,wr)生成cmd的
46、函數(shù)_IO(type,nr) - cmd1 = _IO(G,0x60); cmd2=_IO(G,0x61,long)_IOR(type,nr,size)_IOW(type,nr,size)_IOWR(type,nr,size)3 linux互斥同步與中斷處理中斷屏蔽:Local_irq_disable()Local_irq_enable()3.1原子操作:對(duì)一個(gè)變量的操作過(guò)程是原子過(guò)程,要求操作過(guò)程不能打斷原子操作主要用于實(shí)現(xiàn)資源計(jì)數(shù)原子變量初始化Atomic_t v=atomic_init(0);原子變量初始化Void atomic(atomic_t *v,int i)獲取原子變量的值Int atomic_read(atomic_t *v)原子變量的加減Void atomic_add(int I,atomic_t *v)Void atomic_sub(int I,atomic_t *v)原子變量的自增自減Void atomic_inc(atomic_t *v);Void atomic_dec(atomic_t *v)操作測(cè)試:經(jīng)行一個(gè)特定的操作并且測(cè)試結(jié)果,如果操作后,原子變量的值是0,那么返
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全標(biāo)準(zhǔn)化生產(chǎn)責(zé)任制度
- 生產(chǎn)安全考核與獎(jiǎng)勵(lì)制度
- 生產(chǎn)車輛全過(guò)程管理制度
- 生產(chǎn)場(chǎng)所巡檢制度范本
- 企業(yè)生產(chǎn)檔案管理制度
- 生產(chǎn)副班長(zhǎng)生產(chǎn)管理制度
- 2026重慶市涪陵區(qū)武陵山鎮(zhèn)人民政府招聘公益性崗位1人參考考試題庫(kù)附答案解析
- 生產(chǎn)車間防蠅蟲(chóng)制度
- 生產(chǎn)函數(shù)與科學(xué)制度
- 先進(jìn)生產(chǎn)班組管理制度
- 交通運(yùn)輸安全檢查與處理規(guī)范(標(biāo)準(zhǔn)版)
- UCL介紹教學(xué)課件
- 扁鵲凹凸脈法課件
- 2026年開(kāi)封大學(xué)單招職業(yè)適應(yīng)性測(cè)試題庫(kù)及完整答案詳解1套
- 北京市2025北京市體育設(shè)施管理中心應(yīng)屆畢業(yè)生招聘2人筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)2套試卷
- 建筑施工現(xiàn)場(chǎng)材料采購(gòu)流程
- DB31∕T 1234-2020 城市森林碳匯計(jì)量監(jiān)測(cè)技術(shù)規(guī)程
- 園林綠化施工工藝及注意事項(xiàng)
- 2025年高中語(yǔ)文必修上冊(cè)《登泰山記》文言文對(duì)比閱讀訓(xùn)練(含答案)
- 2025年金蝶AI蒼穹平臺(tái)新一代企業(yè)級(jí)AI平臺(tái)報(bào)告-
- 2025中國(guó)機(jī)械工業(yè)集團(tuán)有限公司(國(guó)機(jī)集團(tuán))社會(huì)招聘19人筆試參考題庫(kù)附答案
評(píng)論
0/150
提交評(píng)論