本篇文章給大家分享的是有關如何不依賴于linux內(nèi)核程序進行LED控制,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
我們提供的服務有:成都網(wǎng)站設計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、清河ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的清河網(wǎng)站制作公司
1、驅動程序 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" //設備名稱 #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;//用與存放三個寄存器的地址 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){ //檢測是第幾個LED,因開發(fā)板上只有4個,索引從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 //在虛擬地址空間中申請一塊長度為0x10的連續(xù)空間 //這樣,物理地址phys到phys+0x10對應虛擬地址virt到virt+0x10 virt =(unsigned long)ioremap(phys, 0x10); GPBCON = (unsigned long *)(virt + 0x00);//指定需要操作的三個寄存器的地址 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(); // 設備的注冊 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){ //注銷設備 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)核程序進行LED控制,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標題:如何不依賴于linux內(nèi)核程序進行LED控制
標題鏈接:http://www.rwnh.cn/article38/jsdhsp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、面包屑導航、全網(wǎng)營銷推廣、做網(wǎng)站、電子商務、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)