博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux内核嵌入式依赖,Linux 嵌入式驱动开发:LED控制(2)---不依赖于linux内核程序...
阅读量:6469 次
发布时间:2019-06-23

本文共 1974 字,大约阅读时间需要 6 分钟。

1、驱动程序 my_led_module.c

#include 

#include 

#include 

#include 

#include 

#define DEVICE_NAME "mini2440_leds" //设备名称

#define LED_MAJOR  260

#define LED_ON      1       //LED亮状态

#define LED_OFF     0       //LED灭状态

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,因开发板上只有4个,索引从0开始

if(arg  3){

return -EINVAL;

}

//判断LED要执行哪种状态

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的连续空间

//这样,物理地址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 

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");

2、测试程序见:

转载地址:http://zxdko.baihongyu.com/

你可能感兴趣的文章
虚拟机类加载机制
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
uva 10815 - Andy's First Dictionary(快排、字符串)
查看>>
观察者模式
查看>>
SQL性能优化:如何定位网络性能问题
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>
struct和typedef struct
查看>>
RPC框架Thrift例子-PHP调用C++后端程序
查看>>
cell reuse & disposebag
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>
Go的基本示例
查看>>
js判断移动端是否安装某款app的多种方法
查看>>