首先要編寫字符設(shè)備驅(qū)動,代碼大同小異,隨便復(fù)制粘貼就行了傻丝。 但是要注意了甘有,一定要保護(hù)好寄存器,不要亂搞葡缰,要不然系統(tǒng)崩了可別怪老夫沒提醒亏掀。led.c#include#include#include#include#include#include辣雞 #include"led.h"#defineLED_MAJOR245//主設(shè)備號unsignedint*led_config;unsignedint*led_data;unsignedint*led_pull;structcdevcdev;dev_tdevno;intled_open(structinode*node,structfile*filp){uint32_tregister_dat;//000:Input001:Outputled_config=ioremap(PA_CFG1,4);//從datesheet里面查詢你的寄存器這里用的是PA10register_dat=readl(led_config);//先讀取寄存器值只操作你需要操作的位段不要干擾其他端口register_dat&=~(0x7<<8);//清空PA10的值writel(register_dat|0x1<<8,led_config);//PA10設(shè)置成輸出//00:Pull-up/downdisable01:Pull-up10:Pull-down11:Reservedled_pull=ioremap(PA_PILL0,4);register_dat=readl(led_pull);//讀取寄存器值register_dat&=~(0x3<<2*10);//清空PA10設(shè)置writel((register_dat|0x1<<2*10),led_pull);//PA10上拉led_data=ioremap(PA_DAT,4);return0;}longled_ioctl(structfile*filp,unsignedintcmd,unsignedlongarg){uint32_treg_dat;switch(cmd){caseLED_ON:reg_dat=readl(led_data);reg_dat&=~(1<<10);writel(reg_dat|0x0<<10,led_data);return0;caseLED_OFF:reg_dat=readl(led_data);reg_dat&=~(1<<10);writel(reg_dat|0x1<<10,led_data);return0;default:return-EINVAL;}}staticstructfile_operationsled_fops={.owner=THIS_MODULE,.open=led_open,.unlocked_ioctl=led_ioctl,};#defineDEVICE_NAME"myled"staticstructclass*leds_class;staticintled_init(void){intret;//注冊LED設(shè)備為字符設(shè)備ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&led_fops);if(ret<0){printk(DEVICE_NAME"majornumberregisterfalid!\n");returnret;}//注冊一個類,使mdev可以在/dev/下面建立設(shè)備節(jié)點leds_class=class_create(THIS_MODULE,DEVICE_NAME);if(IS_ERR(leds_class)){printk("creatleds_classfailed!");return-1;}//創(chuàng)建一個設(shè)備節(jié)點泛释,節(jié)點名字為DEVICE_NAMEdevice_create(leds_class,NULL,MKDEV(LED_MAJOR,0),NULL,DEVICE_NAME);printk(DEVICE_NAME"initialized!");return0;}staticvoidled_exit(void){//注銷設(shè)備unregister_chrdev(LED_MAJOR,DEVICE_NAME);//刪除設(shè)備節(jié)點device_destroy(leds_class,MKDEV(LED_MAJOR,0));//注銷類class_destroy(leds_class);}module_init(led_init);module_exit(led_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("leo_learning");MODULE_DESCRIPTION("myleddriver");以下是led.h這里把所有的GPIO都列出來了#ifndef_LED_H#define_LED_H//GPIOA_10#defineGPIO_BASE0x01C20800#definePA_CFG0GPIO_BASE+0x0000+0*0x24//GPIOA0-7#definePA_CFG1GPIO_BASE+0x0004+0*0x24//GPIOA8-15#definePA_CFG2GPIO_BASE+0x0008+0*0x24//GPIOA17-21#definePA_CFG3GPIO_BASE+0x000C+0*0x24//GPIOA#definePA_DATGPIO_BASE+0x0010+0*0x24//GPIOA_DAT#definePA_DRV0GPIO_BASE+0x0014+0*0x24#definePA_DRV1GPIO_BASE+0x0018+0*0x24#definePA_PILL0GPIO_BASE+0x001C+0*0x24#definePA_PILL1GPIO_BASE+0x0020+0*0x24#definePC_CFG0GPIO_BASE+0x0000+1*0x24//GPIOC0-7#definePC_CFG1GPIO_BASE+0x0004+1*0x24//GPIOC8-15#definePC_CFG2GPIO_BASE+0x0008+1*0x24//GPIOC17-21#definePC_CFG3GPIO_BASE+0x000C+1*0x24//GPIOC#definePC_DATGPIO_BASE+0x0010+1*0x24//GPIOC_DAT#definePC_DRV0GPIO_BASE+0x0014+1*0x24#definePC_DRV1GPIO_BASE+0x0018+1*0x24#definePC_PILL0GPIO_BASE+0x001C+1*0x24#definePC_PILL1GPIO_BASE+0x0020+1*0x24#definePD_CFG0GPIO_BASE+0x0000+2*0x24//GPIOD0-7#definePD_CFG1GPIO_BASE+0x0004+2*0x24//GPIOD8-15#definePD_CFG2GPIO_BASE+0x0008+2*0x24//GPIOD17-21#definePD_CFG3GPIO_BASE+0x000C+2*0x24//GPIOD#definePD_DATGPIO_BASE+0x0010+2*0x24//GPIOD_DAT#definePD_DRV0GPIO_BASE+0x0014+2*0x24#definePD_DRV1GPIO_BASE+0x0018+2*0x24#definePD_PILL0GPIO_BASE+0x001C+2*0x24#definePD_PILL1GPIO_BASE+0x0020+2*0x24#definePE_CFG0GPIO_BASE+0x0000+3*0x24//GPIOE0-7#definePE_CFG1GPIO_BASE+0x0004+3*0x24//GPIOE8-15#definePE_CFG2GPIO_BASE+0x0008+3*0x24//GPIOE17-21#definePE_CFG3GPIO_BASE+0x000C+3*0x24//GPIOE#definePE_DATGPIO_BASE+0x0010+3*0x24//GPIOE_DAT#definePE_DRV0GPIO_BASE+0x0014+3*0x24#definePE_DRV1GPIO_BASE+0x0018+3*0x24#definePE_PILL0GPIO_BASE+0x001C+3*0x24#definePE_PILL1GPIO_BASE+0x0020+3*0x24#definePF_CFG0GPIO_BASE+0x0000+4*0x24//GPIOF0-7#definePF_CFG1GPIO_BASE+0x0004+4*0x24//GPIOF8-15#definePF_CFG2GPIO_BASE+0x0008+4*0x24//GPIOF17-21#definePF_CFG3GPIO_BASE+0x000C+4*0x24//GPIOF#definePF_DATGPIO_BASE+0x0010+4*0x24//GPIOF_DAT#definePF_DRV0GPIO_BASE+0x0014+4*0x24#definePF_DRV1GPIO_BASE+0x0018+4*0x24#definePF_PILL0GPIO_BASE+0x001C+4*0x24#definePF_PILL1GPIO_BASE+0x0020+4*0x24#definePG_CFG0GPIO_BASE+0x0000+5*0x24//GPIOG0-7#definePG_CFG1GPIO_BASE+0x0004+5*0x24//GPIOG8-15#definePG_CFG2GPIO_BASE+0x0008+5*0x24//GPIOG17-21#definePG_CFG3GPIO_BASE+0x000C+5*0x24//GPIOG#definePG_DATGPIO_BASE+0x0010+5*0x24//GPIOG_DAT#definePG_DRV0GPIO_BASE+0x0014+5*0x24#definePG_DRV1GPIO_BASE+0x0018+5*0x24#definePG_PILL0GPIO_BASE+0x001C+5*0x24#definePG_PILL1GPIO_BASE+0x0020+5*0x24#definePL_CFG0GPIO_BASE+0x0000+6*0x24//GPIOL0-7#definePL_CFG1GPIO_BASE+0x0004+6*0x24//GPIOL8-15#definePL_CFG2GPIO_BASE+0x0008+6*0x24//GPIOL17-21#definePL_CFG3GPIO_BASE+0x000C+6*0x24//GPIOL#definePL_DATGPIO_BASE+0x0010+6*0x24//GPIOL_DAT#definePL_DRV0GPIO_BASE+0x0014+6*0x24#definePL_DRV1GPIO_BASE+0x0018+6*0x24#definePL_PILL0GPIO_BASE+0x001C+6*0x24#definePL_PILL1GPIO_BASE+0x0020+6*0x24#definePA_INT_CFG00x0200+0x00+0*0x20#definePA_INT_CFG10x0200+0x04+0*0x20#definePA_INT_CFG20x0200+0x08+0*0x20#definePA_INT_CFG30x0200+0x0C+0*0x20#definePA_INT_CTL0x0200+0x10+0*0x20#definePA_INT_STA0x0200+0x14+0*0x20#definePA_INT_DEB0x0200+0x18+0*0x20#definePF_INT_CFG00x0200+0x00+1*0x20#definePF_INT_CFG10x0200+0x04+1*0x20#definePF_INT_CFG20x0200+0x08+1*0x20#definePF_INT_CFG30x0200+0x0C+1*0x20#definePF_INT_CTL0x0200+0x10+1*0x20#definePF_INT_STA0x0200+0x14+1*0x20#definePF_INT_DEB0x0200+0x18+1*0x20#definePG_INT_CFG00x0200+0x00+2*0x20#definePG_INT_CFG10x0200+0x04+2*0x20#definePG_INT_CFG20x0200+0x08+2*0x20#definePG_INT_CFG30x0200+0x0C+2*0x20#definePG_INT_CTL0x0200+0x10+2*0x20#definePG_INT_STA0x0200+0x14+2*0x20#definePG_INT_DEB0x0200+0x18+2*0x20#defineLED_MAGIC'L'#defineLED_ON_IO(LED_MAGIC,1)#defineLED_OFF_IO(LED_MAGIC,0)#endifMakefile把這里的KDIR改成你開發(fā)板內(nèi)核源碼對應(yīng)目錄滤愕,指定交叉編譯工具鏈,如果沒有什么問題怜校,make會編譯出led.ko间影,只要insmod led.ko就行了, so easyobj-m:=led.oKDIR:=/home/share/OrangePi_H5SDK/kernelall:make-C$(KDIR)M=$(PWD)modules\CROSS_COMPILE=/home/share/OrangePi_H5SDK/toolchain/gcc-linaro-aarch/bin/aarch64-linux-gnu-ARCH=arm64clean:rm-f*.ko*.o*.mod.o*.mod.c*.symvers*.bak*.order最后是應(yīng)用軟件,安裝led.ko內(nèi)核模塊會產(chǎn)生一個/dev/myled的設(shè)備節(jié)點茄茁,現(xiàn)在我們需要打開它魂贬,并對其進(jìn)行讀寫操作led_app.c#include#include#include#include#include #include"led.h"intmain(intargc,char*argv[]){intfd;intcmd;if(argc<2){printf("pleaseenterthesecondpara!\n");return0;}cmd=atoi(argv[1]);fd=open("/dev/myled",O_RDWR);if(cmd==1)ioctl(fd,LED_ON);elseioctl(fd,LED_OFF);return0;}aarch64-linux-gnu-gcc -o led_app led_app.c通過./led_app 0熄滅LED./led_app 1點亮然后隨便浪吧