版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
字符驅(qū)動實例本實驗電路圖4個LED指示燈的接口電路驅(qū)動程序#include<linux/kernel.h>#include<linux/module.h>#include<linux/init.h>#include<linux/fs.h>#include<linux/cdev.h>#include<linux/ioport.h>#include<asm-arm/io.h>#include<linux/ioctl.h>#include<linux/interrupt.h>#include<linux/delay.h>#include<linux/timer.h>#include<asm/irq.h>#include<linux/param.h>#include<linux/sched.h>#include<linux/errno.h>#include<asm/signal.h>定義request_mem_region所需的頭文件定義I/O讀寫,I/O內(nèi)存讀寫所需的頭文件定義ioctl函數(shù)所需的頭文件定義ioctl函數(shù)所需的頭文件定義延遲與定時器函數(shù)所需的頭文件定義中斷函數(shù)所需的頭文件#defineCDRIVER_NAME"LED_chrdev"#defineGPFCON(0X56000050)#defineGPFDAT(0X56000054)#defineGPFUP(0X56000058)staticvoid*gpfcon;staticvoid*gpfdat;staticvoid*gpfup;intCDRIVER_MAJOR=0;intCDRIVER_MINOR=0;intcount=1;定義物理地址定義映射后的虛擬地址指針loff_tLED_llseek(structfile*filp,loff_toff,intwhence);intLED_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg);intLED_open(structinode*inode,structfile*filp);intLED_release(structinode*inode,structfile*filp);externstructfile_operationsLED_fops;structcdev*LED_cdev;dev_tLED_dev;structfile_operationsLED_fops={.owner=THIS_MODULE,.llseek=LED_llseek,.open=LED_open,.release=LED_release,};staticint__initLED_init(void){……if(!request_mem_region(GPFCON,12,CDRIVER_NAME)){ printk(KERN_ERR"LED:io%Xisnotfree.\n",GPFCON); return-EBUSY; } gpfcon=ioremap_nocache(GPFCON,4); gpfdat=ioremap_nocache(GPFDAT,4); gpfup=ioremap_nocache(GPFUP,4); if(!gpfcon){ printk(KERN_ERR"LED:ioremapfailed\n");
iounmap(gpfcon); return-EINVAL; }申請I/O內(nèi)存I/O內(nèi)存映射若映射不成功,釋放
if(!gpfdat){ printk(KERN_ERR"LED:ioremapfailed\n");
iounmap(gpfdat); return-EINVAL; } if(!gpfup){ printk(KERN_ERR"LED:ioremapfailed\n");
iounmap(gpfup); return-EINVAL; } return0;}若映射不成功,釋放若映射不成功,釋放intLED_open(structinode*inode,structfile*filp){ printk("LEDDeviceisopened\n"); writel((readl(gpfcon)&(1<<14)),gpfcon); writel((readl(gpfup)&(1<<7)),gpfup); writel((readl(gpfdat)&(0<<7)),gpfdat); ssleep(1);writel((readl(gpfdat)&(1<<7)),gpfdat); ssleep(1);writel((readl(gpfdat)&(0<<7)),gpfdat); try_module_get(THIS_MODULE); return0;}設為輸出端口上拉禁止輸出低電平,燈亮輸出高電平,燈滅/*Release*/intLED_release(structinode*inode,structfile*filp){ printk("LEDDeciceisreleased!\n"); writel((readl(gpfcon)&(0<<14)),4); writel((readl(gpfup)&(1<<7)),4); writel((readl(gpfdat)&(0<<7)),4); module_put(THIS_MODULE); return0;}staticvoid__exitLED_exit(void) {printk("UnloadingLED_cdevnow...\n");
iounmap(gpfcon); iounmap(gpfdat); iounmap(gpfup); cdev_del(LED_cdev); unregister_chrdev_region(LED_dev,count); }釋放內(nèi)存makefileifneq($(KERNELRELEASE),)obj-m:=LED_chrdev.oelsePWD:=$(shellpwd)default:$(MAKE)-C$(KERNELDIR)M=$(PWD)endif最終生成LED_chrdev.ko的可執(zhí)行文件件應用程序#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<errno.h>#include<unistd.h>#include<linux/delay.h>#include<sys/ioctl.h>#defineDEVICE_GPIOTEST"/dev/LED_chrdev"intmain(intargc,char*argv[]){intfd;fd=open(DEVICE_GPIOTEST,O_RDONLY);提供對文件控控制的函數(shù)open等提供對I/O控制的函數(shù)數(shù)提供錯誤號errno的的定義,用于于錯誤處理linux/unix的的系統(tǒng)調(diào)用,,包含了許多多系統(tǒng)服務的的函數(shù)原型,例如read,write等函函數(shù)。if(fd<0){perror("cannotopendevice");exit(1);}close(fd);return0;}makefileTEST_LED:TEST_LED.o$(LD)-rTEST_LED.o-oTEST_LEDTEST_LED.o:TEST_LED.c$(CC)-O2-Wall-I$(INCLUDE)-L$(LIB)-cTEST_LED.c-oTEST_LED.o最終生成TEST_LED的可執(zhí)行行文件將驅(qū)動程序編編譯進內(nèi)核在超級終端下下將驅(qū)動程序序LED_chrdev.ko和應用程序TEST_LED下載到到/tmp路徑下執(zhí)行Chmod755LED_chrdev.koChmod755TEST_LEDInsmodLED_chrdev.ko./TEST_LED觀察燈的情況況!將驅(qū)動程序編編譯進內(nèi)核一.將驅(qū)動程程序LED_chrdev.c放在相應的目目錄下,比如如對于字符設設備,就放置置在fs2410/drivers/char/;二.修改drivers/…/Makefile文件三.修改drivers/…/Kconfig配置文件四.重新編譯譯內(nèi)核,下載載將驅(qū)動程序放放在相應的目目錄下修改drivers/char/Makefile修改drivers/char/Makefile修改drivers/char/Kconfig這些將出現(xiàn)在在內(nèi)核的編譯譯配置中簡化我們的設設計對I/O端口口定義的簡化化,加入頭文文件#include<asm/arch/regs-gpio.h>對I/O端口口操作的簡化化,加入頭文文件#include<asm/arch/hardware.h>#include<asm/arch/regs-gpio.h>#include<asm/arch/regs-gpio.h>I/O端口不不同功能的定定義對特殊功能寄寄存器的定義義#include<asm/arch/hardware.h>在<asm/arch/hardware.h>中包含了了對I/O端口口操作的函數(shù)數(shù)externvoids3c2410_gpio_cfgpin(unsignedintpin,unsignedintfunction);externvoids3c2410_gpio_pullup(unsignedintpin,unsignedintto);externvoids3c2410_gpio_setpin(unsignedintpin,unsignedintto);externunsignedints3c2410_gpio_getpin(unsignedintpin);函數(shù)在arch/arm/mach-s3c2410/gpio.c中定義/*s3c2410_gpio_cfgpin:設定定特定端口的的功能*eg:*s3c2410_gpio_cfgpin(S3C2410_GPA0,S3C2410_GPA0_ADDR0);*s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_OUTP);*/將GPF7設設置成輸出端端口s3c2410_gpio_cfgpinvoids3c2410_gpio_cfgpin(unsignedintpin,unsignedintfunction){staticvoid*base;unsignedlongmask;unsignedlongcon;unsignedlongflags;base=ioremap_nocache(S3C2410_GPIO_PA_BASE(pin),0x0000004);if(pin<S3C2410_GPIO_BANKB){mask=1<<S3C2410_GPIO_OFFSET(pin);}else{mask=3<<S3C2410_GPIO_OFFSET(pin)*2;}local_irq_save(flags);con=__raw_readl(base+0x00);con&=~mask;con|=function;__raw_writel(con,base+0x00);local_irq_restore(flags);}將端口對應的的GPnCON寄存器進進行I/O內(nèi)內(nèi)存映射根據(jù)相應的功功能對GPnCON寄存存器的對應位位寫入相應的的值externvoids3c2410_gpio_pullup(unsignedintpin,unsignedintto);/*s3c2410_gpio_pullup**設置特定定端口的上拉拉**to=1=>disablethepull-up*0=>enablethepull-up**例子:**s3c2410_gpio_pullup(S3C2410_GPB0,0);*s3c2410_gpio_pullup(S3C2410_GPF7,1);*/s3c2410_gpio_getpinunsignedints3c2410_gpio_getpin(unsignedintpin);**設置特定輸入入端口的值**返返回非0=>高電平平*0=>低電平平**例子:**s3c2410_gpio_getpin(S3C2410_GPB0);*s3c2410_gpio_getpin(S3C2410_GPE8);*/s3c2410_gpio_getpinunsignedints3c2410_gpio_getpin(unsignedintpin){staticvoid*data;unsignedlongoffs=S3C2410_GPIO_OFFSET(pin);data=ioremap_nocache(S3C2410_GPIO_PA_BASE(pin)+0x04,0x0000004);return__raw_readl(data)&(1<<offs);}將端口對應的的GPnDAT寄存器進進行I/O內(nèi)內(nèi)存映射讀入GPnDAT寄存器器中對應位的的值s3c2410_gpio_setpinexternvoids3c2410_gpio_setpin(unsignedintpin,unsignedintto);/**設置特定定輸出端口的的高/低電平平**to=1=>高電平平*0=>低電平平**例子:**s3c2410_gpio_setpin(S3C2410_GPB0,0);*s3c2410_gpio_setpin(S3C2410_GPF7,0);*/對驅(qū)動程序的的修改……#include<asm/arch/regs-gpio.h>#include<asm/arch/hardware.h>對I/O端口口定義的頭文文件對I/O端口口操作的頭文文件staticint__initLED_init(void){……s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_OUTP);s3c2410_gpio_pullup(S3C2410_GPF7,1);s3c2410_gpio_setpin(S3C2410_GPF7,0);return-EINVAL;}intLED_open(structinode*inode,structfile*filp){printk("LEDDeviceisopened\n");s3c2410_gpio_setpin(S3C2410_GPF7,0);ssleep(1);s3c2410_gpio_setpin(S3C2410_GPF7,1);ssleep(1);s3c2410_gpio_setpin(S3C2410_GPF7,0);try_module_get(THIS_MODULE);return0;}/*Release*/intLED_release(structinode*inode,structfile*filp){printk("LEDDeciceisreleased!\n");s3c2410_gpio_cfgpin(S3C2410_GPF7,S3C2410_GPF7_INP);s3c2410_gpio_pullup(S3C2410_GPF7,0);s3c2410_gpio_setpin(S3C2410_GPF7,1);module_put(THIS_MODULE);return0;}中斷驅(qū)動程程序的簡化化……#include<asm/arch/irq.h>#include<asm/arch/regs-irq.h>對各個中斷斷號的定義義對中斷寄存存器定義的的頭文件asm-arm/arch-s3c2410/irq.hIrq:表示所要要申請的中中斷號;中斷號在include/asm-arm/arch-s3c2410/irq.h中定義義asm-arm/arch-s3c2410/irq.h#include<asm/arch/regs-irq.h><arch/arm/math-s3c2410/irq.c>在<arch/arm/math-s3c2410/irq.c>中定義義有中斷操操作的相關關函數(shù),可可以通過extern語句句加入這些些函數(shù)在<arch/arm/math-s3c2410/irq.c>中定義義有中斷操操作的相關關函數(shù)s3c_irq_mask(unsignedintirqno)//中斷斷屏蔽s3c_irq_unmask(unsignedintirqno)//中斷斷使能s3c_irq_ack(unsignedintirqno)//清中中斷掛起void__inits3c2410_init_irq(void)//中中斷初初始化s3c_irqext_mask(unsignedintirqno)//外部中斷斷屏蔽s3c_irqext_ack(unsignedintirqno)//清清外部中斷斷掛起s3c_irqext_unmask(unsignedintirqno)//外部部中斷使能能<arch/arm/math-s3c2410/irq.c>函數(shù):s3c_irq_mask(unsignedintirqno)參數(shù):irqno表示中斷斷號作用:屏屏蔽特定定中斷例子:s3c_irq_mask((IRQ_EINT0)s3c_irq_mask(unsignedintirqno){unsignedlongma
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《歐姆定律習題》課件
- 2025年度船舶股份聯(lián)營合同范本8篇
- 2025年度商業(yè)綜合體地下車位代理銷售管理協(xié)議4篇
- 語文課件《羅布泊,消失的仙湖》
- 二零二五年度旅游交通保險代理服務合同4篇
- 二零二五年度體育賽事贊助合同標的品牌曝光:1、客戶市場推廣4篇
- 2025年度汽車租賃保險合同范本4篇
- 《學校綠化設計》課件
- 二零二五版金融資產(chǎn)交易與投資管理合同3篇
- 二零二五年度門面商鋪租賃合同含租賃雙方權利義務說明4篇
- 《工貿(mào)企業(yè)有限空間作業(yè)安全規(guī)定》知識培訓
- 高層次人才座談會發(fā)言稿
- 垃圾清運公司管理制度(人員、車輛、質(zhì)量監(jiān)督、會計管理制度)
- 《建筑工程設計文件編制深度規(guī)定》(2022年版)
- 營銷人員薪酬考核方案
- 2024年版的企業(yè)績效評價標準
- 2024至2030年中國it外包服務行業(yè)市場深度分析及發(fā)展趨勢預測報告
- 工程項目計價結算付款情況統(tǒng)計表
- GB/T 20554-2024海帶
- 廣東廣州中醫(yī)藥大學第一附屬醫(yī)院招聘筆試真題2022
- ISO 15189醫(yī)學實驗室認可內(nèi)審員培訓試題附答案
評論
0/150
提交評論