Linux字符设备驱动--Led设备驱动
①驱动源码
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/io.h> #define LEDCON 0x56000010
#define LEDDAT 0x56000014 unsigned int *led_config;
unsigned int *led_data; struct cdev cdev;
dev_t devno; int led_open(struct inode *node, struct file *filp)
{
unsigned int led_config_value = ; led_config = ioremap(LEDCON, );
led_data = ioremap(LEDDAT, ); led_config_value = readl(led_config);
led_config_value = led_config_value & (~(0xffff << ));
led_config_value = led_config_value | (0x5555 << ); printk("led_config_value = 0x%x\n", led_config_value); writel(led_config_value, led_config);
led_config_value = readl(led_config); printk("led_config_value = 0x%x\n", led_config_value); return ;
} long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
unsigned int led_data_value = readl(led_data); switch (cmd)
{
case :
led_data_value = led_data_value & (~(0x0f << )); printk("led_data_value = 0x%x\n", led_data_value); writel(led_data_value, led_data);
led_data_value = readl(led_data); printk("led_data_value = 0x%x\n", led_data_value); return ; case :
led_data_value = led_data_value | (0x0f << ); printk("led_data_value = 0x%x\n", led_data_value); writel(0xff, led_data);
led_data_value = readl(led_data); printk("led_data_value = 0x%x\n", led_data_value); return ; default:
return -EINVAL;
}
} static struct file_operations led_fops =
{
.open = led_open,
.unlocked_ioctl = led_ioctl,
}; static int led_init(void)
{
cdev_init(&cdev, &led_fops); alloc_chrdev_region(&devno, , , "myled");
cdev_add(&cdev, devno, ); return ;
} static void led_exit(void)
{
cdev_del(&cdev);
unregister_chrdev_region(devno,);
} MODULE_LICENSE("GPL"); module_init(led_init);
module_exit(led_exit);
② Makefile
obj-m := Led.o
KDIR := /home/Linux/Kernal/linux-2.6.
all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order
③ 应用层测试代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h> int main(int argc, char *argv[])
{
int fd;
int cmd; if (argc < )
{
printf("please enter the second para!\n");
return ;
} cmd = atoi(argv[]); fd = open("/dev/led", O_RDWR); if (cmd == )
ioctl(fd, );
else
ioctl(fd, ); return ;
}
④ 测试步骤
(1)安装驱动模块:Led.ko
(2)查看主设备号:cat /proc/devices(查找led对应的主设备号)
(3)创建设备文件:mknod /dev/led c 主设备号 0
(4)运行测试代码进行测试
Linux字符设备驱动--Led设备驱动的更多相关文章
- 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发
在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...
- Linux 驱动——LED(驱动分离分层)
led_dev.c文件: #include <linux/module.h>#include <linux/version.h> #include <linux/init ...
- 深入理解Linux字符设备驱动
文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...
- Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】
本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...
- Linux字符设备驱动
一.字符设备基础 字符设备 二.字符设备驱动与用户空间访问该设备的程序三者之间的关系 三.字符设备模型 1.Linux内核中,使用 struct cdev 来描述一个字符设备 动态申请(构造)cdev ...
- Linux 字符设备驱动及一些简单的Linux知识
一.linux系统将设备分为3类:字符设备.块设备.网络设备 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见 ...
- (笔记)linux设备驱动--LED驱动
linux设备驱动--LED驱动 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋友 ...
- 一步步理解linux字符设备驱动框架(转)
/* *本文版权归于凌阳教育.如转载请注明 *原作者和原文链接 http://blog.csdn.net/edudriver/article/details/18354313* *特此说明并保留对其追 ...
- linux字符设备驱动--基本知识介绍
一.设备驱动的分类 1.字符设备 字符设备是指那些能一个字节一个字节读取数据的设备,如LED灯.键盘.鼠标等.字符设备一般需要在驱动层实现open().close().read().write().i ...
随机推荐
- cocos2d-js 定时器
1.scheduleUpdate 节点中有scheduleUpdate接口,通过这个接口,可以让游戏在每帧执行都执行update方法 var ScheduleUpdateLayer = cc.Laye ...
- Tensorflow手写数字识别训练(梯度下降法)
# coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #p ...
- loj10100 网络
这个题目描述好难理解呀qwq... 传送门 分析 在读懂题之后我们不难发现这道题实际就是在求一张图中有多少个割点.只需要注意读入方式即可. 代码 #include<iostream> #i ...
- CodeForces 402D Upgrading Array (数学+DP)
题意:给出一个数列,可以进行一种操作将某一个前缀除去他们的gcd,有一个函数f(x),f(1) = 0 , f(x) = f(x/p)+1,f(x) = f(x/p)-1(p是坏素数), 求 sum( ...
- C#中关于换行符的记录
最近在做一个练习的时候,从其他数据库提出来数据装到自己的数据表中,发现同是编辑器的内容却在页面上显示不出来,但是在数据库中又确实存在,经过一番折腾之后发现是 换行符 的问题.在我的编辑器中是以 ‘\r ...
- 【C#】记录程序耗时方法
最近写了一个读txt题库然后导入数据库的控制台应用,查看存入数据库耗时 在C#中使用 Stopwatch 命名空间: System.Diagnostics: 使用方法: System.Diagn ...
- Intent要使用的ACTION都有哪些?在哪里能查到详细的ACTION呢?
Intent操作结构之一就是ACTION,这些ACTION都有哪些?在哪里能查到详细的ACTION呢? 官方文档: https://developer.android.com/reference/an ...
- Django博客开发教程,Django快速开发个人blog
学DjangoWEB框架,估计大部分的朋友都是从Blog开发开始入门的,Django中文网发布了一个Django开发教程,这个教程简单易懂,能让你快速的使用Django开发一个漂亮的个人blog,是D ...
- 三大文本处理工具grep、sed及awk
一. 用grep在文件中搜索文本 grep能够接受正则表达式,生成各种格式的输出.除此之外,它还有大量有趣的选项. 1. 搜索包含特定模式的文本行: 2. 从stdin中读取: 3. 单个g ...
- 关于如何使用代码触发 UIButton的Unwind Segue
当我们在一个控制视图上,在UITextField输入文字信息之后,希望可以使用键盘的Done触发一个 Done的UIButton,但是刚开始我直接在 -(BOOL)textFieldShouldRet ...