溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何不依賴于linux內(nèi)核程序進(jìn)行LED控制

發(fā)布時(shí)間:2021-10-22 10:10:39 來源:億速云 閱讀:178 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章給大家分享的是有關(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI