①驱动源码

#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设备驱动的更多相关文章

  1. 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发

    在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...

  2. Linux 驱动——LED(驱动分离分层)

    led_dev.c文件: #include <linux/module.h>#include <linux/version.h> #include <linux/init ...

  3. 深入理解Linux字符设备驱动

    文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...

  4. Linux字符设备驱动结构(一)--cdev结构体、设备号相关知识机械【转】

    本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50839042 一.字符设备基础知识 1.设备驱动分类 linux系统将设备分为3类:字符 ...

  5. Linux字符设备驱动

    一.字符设备基础 字符设备 二.字符设备驱动与用户空间访问该设备的程序三者之间的关系 三.字符设备模型 1.Linux内核中,使用 struct cdev 来描述一个字符设备 动态申请(构造)cdev ...

  6. Linux 字符设备驱动及一些简单的Linux知识

    一.linux系统将设备分为3类:字符设备.块设备.网络设备 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见 ...

  7. (笔记)linux设备驱动--LED驱动

    linux设备驱动--LED驱动 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋友 ...

  8. 一步步理解linux字符设备驱动框架(转)

    /* *本文版权归于凌阳教育.如转载请注明 *原作者和原文链接 http://blog.csdn.net/edudriver/article/details/18354313* *特此说明并保留对其追 ...

  9. linux字符设备驱动--基本知识介绍

    一.设备驱动的分类 1.字符设备 字符设备是指那些能一个字节一个字节读取数据的设备,如LED灯.键盘.鼠标等.字符设备一般需要在驱动层实现open().close().read().write().i ...

随机推荐

  1. Serializable 和 parcelable的实现和比较

    首先这个两个接口都是用来序列化对象的 但是两者在性能和应用场合上有区别,parcelable的性能更好,但是在需要保存或者网络传输的时候需要选择Serializable因为parcelable版本在不 ...

  2. day17 14.dao模式介绍

    Web的三层架构,不是MVC,Web层,Service层,DAO层. 之前玩的JSP Servlet JavaBean那是MVC模式,那玩意只是表现层的东西. 转账汇款的例子. 说了这么多有啥用啊,一 ...

  3. Ros学习——roslaunch

    roslaunch:启动定义在launch文件中的多个节点 1.launch文件解析 <launch> #以launch标签开头以表明这是一个launch文件 #两个节点分组并以'命名空间 ...

  4. 常用linux配置文件

    /etc/hosts:用户IP与域名的对应解析表/etc/sysconfig/network:机器名.网卡启动.网关等配置/etc/fstab:记录开机自动挂载的文件系统/etc/rc.local:开 ...

  5. 3.内网渗透之reGeorg+Proxifier

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxIAAAE2CAIAAAB6BDOVAAAgAElEQVR4Aey9Z5Aex3X327MRGVzkRH ...

  6. 《Head First Servlets & JSP》-4-请求和响应

    Servlet生命周期 生命周期三大重要时刻 Servlet集成结构: 方法 init() service() doGet()/goPost() 何时调用 Servlet实例被创建之后.为客户请求提供 ...

  7. JMeter上传文件 点选form-data依旧失败的解决方法

    转子:https://blog.csdn.net/xingyunpi/article/details/77930476 这几天一直在调用JMeter上传文件的一个接口,一直出错,在网上找到一些文章说的 ...

  8. WCF寄宿控制台.WindowsService.WinFrom.WebAPI寄宿控制台和windows服务

    先建立wcf类库.会默认生成一些试用代码.如下: public class Service1 { public string GetData(int value) { return string.Fo ...

  9. iOS开发之蓝牙使用-建立连接的

    1.大佬笔记 CSDN 2.代码 github

  10. Codeforces Round #538 (Div. 2)D(区间DP,思维)

    #include<bits/stdc++.h>using namespace std;int a[5007];int dp[5007][5007];int main(){    int n ...