博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
led驱动程序设计
阅读量:4286 次
发布时间:2019-05-27

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

对硬件进行操作涉及到硬件相关的寄存器,内核中与之相关的几个常用函数有:

ioremap

原型:void *ioremap(unsigned long phys_addr, unsigned long size)头文件:
功能:将物理地址映射到内核虚拟地址空间,便于访问。返回转换后的虚拟地址参数:phys_addr:要映射的物理地址 size:映射的长度,如4表示4个字节

writel

原型:void writel(unsigned int value,volatile void _iomem *addr)头文件:
功能:往映射后的物理地址写入32位数据参数:value:待写入的数据 addr:映射后的物理地址,是一个虚拟地址

readl

原型:unsigned int readl(const volatile void _iomem *addr)头文件:
功能:从映射后的物理地址读取32位数据参数:addr:映射后的物理地址,是一个虚拟地址

因此,内核函数对确切的物理地址读写数据需要配合使用ioremap()函数和writel(),readl()函数。地址映射和寄存器读写还有其它的方法,具体的可以查看硬件访问技术。


led内核模块代码:

#include 
#include
#include
#include
#include
#include "led.h"#define LEDCON 0x7f008800#define LEDDAT 0x7f008808unsigned int *led_config; unsigned int *led_data; struct cdev cdev;dev_t devno;int led_open(struct inode *node, struct file *filp){ led_config = ioremap(LEDCON,4); writel(0x11110000,led_config);/*完成led硬件初始化*/ led_data = ioremap(LEDDAT,4); return 0;}long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ switch (cmd) { case LED_ON: writel(0x00,led_data); return 0; case LED_OFF: writel(0xff,led_data); return 0; default: return -EINVAL; }}static struct file_operations led_fops ={ .open = led_open, .unlocked_ioctl = led_ioctl,};static int led_init(){ cdev_init(&cdev,&led_fops); alloc_chrdev_region(&devno, 0 , 1 , "myled"); cdev_add(&cdev, devno, 1); return 0; }static void led_exit(){ cdev_del(&cdev); unregister_chrdev_region(devno,1);}module_init(led_init);module_exit(led_exit);

应用程序代码:

#include 
#include
#include
#include
#include "led.h"int main(int argc, char *argv[]){ int fd; int cmd; if (argc <2 ) { printf("please enter the second para!\n"); return 0; } cmd = atoi(argv[1]); fd = open("/dev/myled",O_RDWR); if (cmd == 1) ioctl(fd,LED_ON); else ioctl(fd,LED_OFF); return 0;}

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

你可能感兴趣的文章
【深入理解JVM】:Java类继承关系中的初始化顺序
查看>>
【深入理解JVM】:类加载器与双亲委派模型
查看>>
【深入理解JVM】:解析与分派
查看>>
【深入理解JVM】:Java内存模型JMM
查看>>
【JDK】:Java容器框架
查看>>
【JDK】:HashMap详解
查看>>
【JDK】:java.lang.String、StringBuilder、StringBuffer 源码解析
查看>>
【JDK】:ArrayList和LinkedList源码解析
查看>>
【JDK】:ConcurrentHashMap高并发机制——【转载】
查看>>
【JDK】:java.lang.Integer源码解析
查看>>
【JDK】:Java容器框架——同步容器与并发容器
查看>>
【JDK】:CopyOnWriteArrayList、CopyOnWriteArraySet 源码解析
查看>>
python 正则表达式获取进程信息文本 ?P 用法
查看>>
html jquery post后更新整个页面
查看>>
python 判断参数为Nonetype类型或空
查看>>
django js实现部分页面刷新
查看>>
python 判断输入的是不是合法(正确)的ip
查看>>
linux 生成随机密码,uuid
查看>>
django 自定义分页与bootstrap分页结合
查看>>
django Paginator分页模块
查看>>