您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何不依賴于linux內(nèi)核程序進(jìn)行LED控制,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
1、驅(qū)動(dòng)程序 my_led_module.c
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <asm/io.h> #include <linux/fs.h> #define DEVICE_NAME "mini2440_leds" //設(shè)備名稱 #define LED_MAJOR 260 #define LED_ON 1 //LED亮狀態(tài) #define LED_OFF 0 //LED滅狀態(tài) volatile unsigned long virt, phys;//用于存放虛擬地址和物理地址 volatile unsigned long *GPBCON, *GPBDAT, *GPBUP;//用與存放三個(gè)寄存器的地址 static int leds_open(struct inode *inode, struct file *file){ return 0; } static int leds_ioctl(struct inode *inode, struct file *file ,unsigned int cmd, unsigned long arg){ //檢測是第幾個(gè)LED,因開發(fā)板上只有4個(gè),索引從0開始 if(arg < 0 || arg > 3){ return -EINVAL; } //判斷LED要執(zhí)行哪種狀態(tài) switch(cmd){ case LED_ON:{ if(arg == 0){ *GPBDAT &= 0x1C0; } else if(arg == 1){ *GPBDAT &= 0x1A0; } else if(arg == 2){ *GPBDAT &= 0x160; } else if(arg == 3){ *GPBDAT &= 0x0E0; } break; } case LED_OFF:{ if(arg == 0){ *GPBDAT |= 0x020; } else if(arg == 1){ *GPBDAT |= 0x040; } else if(arg == 2){ *GPBDAT |= 0x080; } else if(arg == 3){ *GPBDAT |= 0x100; } break; } default:{ return -EINVAL; } } return 0; } static struct file_operations leds_fops = { .owner = THIS_MODULE, .open = leds_open, .ioctl = leds_ioctl, }; void led_device_init(void){ // 0x56000010 + 0x10 包攬全所有的IO引腳寄存器地址 phys = 0x56000010; // 0x56000010=GPBCON //在虛擬地址空間中申請(qǐng)一塊長度為0x10的連續(xù)空間 //這樣,物理地址phys到phys+0x10對(duì)應(yīng)虛擬地址virt到virt+0x10 virt =(unsigned long)ioremap(phys, 0x10); GPBCON = (unsigned long *)(virt + 0x00);//指定需要操作的三個(gè)寄存器的地址 GPBDAT = (unsigned long *)(virt + 0x04); GPBUP = (unsigned long *)(virt + 0x08); // GPBCON *GPBCON = 0x154FD; // GPBDAT *GPBDAT = 0x1E0; // GPBUP *GPBUP = 0x7FF; } static int __init led_init(void){ int ret; led_device_init(); // 設(shè)備的注冊(cè) ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &leds_fops); if(ret < 0){ printk(DEVICE_NAME " register falid!\n"); } else { printk(DEVICE_NAME " initialized!\n"); } return ret; } static void __exit led_exit(void){ //注銷設(shè)備 unregister_chrdev(LED_MAJOR, DEVICE_NAME); } module_init(led_init); module_exit(led_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Benjamin"); MODULE_DESCRIPTION("Mini2440 led driver");
以上就是如何不依賴于linux內(nèi)核程序進(jìn)行LED控制,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。