11.ok6410之led驱动程序编写
led驱动程序编写
本文主要包含三部分,led驱动程序led.c编写,编译驱动程序的makefile的编写,以及使用驱动程序的应用程序led_app的编写
一、led.c编写
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "led.h"
#define GPMCON 0x7f008820
#define GPMDAT 0x7f008824 unsigned 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(GPMCON,); //地址转化为虚拟地址
writel(0x1111,led_config); //为虚拟地址写入值 led_data = ioremap(GPMDAT,); //物理地址转化为虚拟地址
return ;
} //响应系统调用函数的驱动函数
long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch (cmd) //通过不同命令执行控制命令
{
case LED_ON:
writel(0x00,led_data);
return ; case LED_OFF:
writel(0xff,led_data);
return ; 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, , , "myled"); //设备号分配
cdev_add(&cdev, devno, ); //注册字符设备
return ;
} static void led_exit()
{
cdev_del(&cdev); //驱动注销
unregister_chrdev_region(devno,); //设备号释放
} module_init(led_init);
module_exit(led_exit);
1.1控制led命令的编写---->led.h
#define LED_MAGIC 'L'
#define LED_ON _IO(LED_MAGIC,0)
#define LED_OFF _IO(LED_MAGIC,1)
二、编译led.c的Makefile的编写
obj-m := led.o
KDIR :=/home/kernel/kernel/linux-ok6410
all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean:
rm -f *.ko *.o *.order *.symvers *.mod.c *~
三、应用程序的编写
#include "led.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <string.h> int main(int argc,char *argv[])
{
int fd;
int cmd;
if(argc<)
{
printf("please enter the secnod para!\n");
}
cmd = atoi(argv[]); //字符参数转化为整形
fd = open("/dev/myled",O_RDWR);
if(cmd==)
{
ioctl(fd,LED_ON);
printf ("led on!!!\n");
}
else
ioctl(fd,LED_OFF);
}
在完成以上步骤之后就可以安装内核模块并且运行应用程序了
运行过程如下:
首先安装内核模块:insmod led.ko
接着查看注册的设备号:cat /proc/devices

可以看出我注册的led驱动对应的设备号是252
所以接着创建字符设备文件:mknod /dev/myled c 252 0
紧接着运行应用程序:

可以看到开发板上面的所有灯都亮了!!!!!!!
四、出现的问题解决
在运行时候莫名奇妙的出现了一个Segmentation fault,后来查找了很久居然发现是应为在编写led.c的代码时候在
int led_open (struct inode *node, struct file *filp)
{
led_config = ioremap(GPMCON,); //地址转化为虚拟地址
writel(0x1111,led_config); //为虚拟地址写入值 led_data = ioremap(GPMDAT,); //物理地址转化为虚拟地址
return ;
}
这个函数里面缺少了return 0这句差点酿成大祸了。。。。。。。。。。
11.ok6410之led驱动程序编写的更多相关文章
- 使用设备树来编写led驱动程序
在总线设备驱动模型中,平台设备是写在c文件中.使用设备树时,平台设备事先并不存在,在dts文件中构造节点,节点里面含有资源.dts文件被编译成dtb文件,然后传递给内核.内核会解析dtb文件,得到一个 ...
- BeagleBone Black Linux驱动程序开发入门(1): LED驱动程序
这篇文章展示如何在BBB平台上编写LED驱动程序,本文的程序是根据国嵌S3C2440的LED驱动的例子并结合内核中OMAP系列的gpio操作来改的.本文中的程序包括驱动程序模块和用户空间程序.废话不多 ...
- 转:Linux网卡驱动程序编写
Linux网卡驱动程序编写 [摘自 LinuxAID] 工作需要写了我们公司一块网卡的Linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微软垄断的强有力武器,日益受到大 ...
- LCD驱动程序编写
学习目标:编写LCD驱动程序,熟悉根据芯片手册分析时序图,配置寄存器,并测试LCD程序. 一.LCD驱动程序编写 步骤: 1)分配fb_info结构体 2)设置fb_info结构体 a. 固定参数 b ...
- 【Linux驱动】TQ2440 LED驱动程序
★整体介绍 LED驱动程序主要实现了TQ2440开发板上的4个LED灯的硬件驱动,实现了对引脚GPIOB5.GPIOB6.GPIOB7.GPIOB8的高低电平设置(common-smdk.c中已经实现 ...
- LED驱动程序分析
混杂设备 LED驱动程序分析 /******************************* * *杂项设备驱动:miscdevice *majior=10; * * *************** ...
- Linux下的led驱动程序,ok6410
本程序採用动态映射的方法控制led.硬件平台为飞凌的ok6410 led.h:定义控制命令 #ifndef _LED_H #define _LED_H #define LED_MAGIC 'M' #d ...
- Linux驱动之LED驱动编写
从上到下,一个软件系统可以分为:应用程序.操作系统(内核).驱动程序.结构图如下:我们需要做的就是写出open.read.write等驱动层的函数.一个LED驱动的步骤如下: 1.查看原理图,确定需要 ...
- DM9000C网卡驱动程序编写与测试
一般网卡驱动程序厂商会给我们提供一份模板驱动,我们的工作就是需要根据自己的需要更改这个模板驱动 1.DM9000C的硬件连接 硬件连接图如下所示:它接在S3C2440的BANK4内存控制器上,它只占用 ...
随机推荐
- 架构师养成记--3.synchronized细节问题
一.synchronized有锁重入的特点,某个线程得到对象的锁后,再次请求此对象可以再次得到改对象的锁.如下示例,在method1中调用method2,在method2中调用method3,而met ...
- a冲刺总结随笔
Alpha版本计划完成一般的便签功能: 预期项目 实际进展 首页瀑布流方块布局 1 按新旧顺序排列 1 增加记录 1 编辑文字信息 1 标记喜爱 0 删除文字信息 1 手动添加分类 0 反馈页面 ...
- Java面试之SpringMVC总结以及在面试中的一些问题.
1.简单的谈一下SpringMVC的工作流程? 流程 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理 ...
- Java数组及其内存分配
几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...
- C#之数组篇
大杂烩 一.数组初始化 1.一维数组 String[] str = new String[3] { "1","2","3"}; ...
- rails
http://ruby-toolbox.com/ ~/.gemrc --- :backtrace: false :benchmark: false :bulk_threshold: 1000 :sou ...
- linux中ls命令
ls跟dos下的dir命令是一样的都是用来列出目录下的文件 ls参数: -a: ls -a 列出文件下所有的文件,包括以"."开头的隐藏文件(linux下文件隐藏文件是以.开头的, ...
- [Unity3d]向量的过度方法以及拖尾效果
Vector3.RotateTowards() 用法 public static function RotateTowards(current: Vector3, target: Vector3, m ...
- Unicode文件读取 出现隐藏字符 (大坑)
C#读取文件..分析时发现应该15位的.. str.Lenght 却 16位.. 字符串复制出来一位位的数..就是15位.. 纳闷中突然想起来会不会是隐藏字符.. 输出 str[0].ToBytes( ...
- Android锁屏后数据改变的解决方案
如果一个界面设置成横屏,那么锁屏再开启之后,会重新执行一遍onCreate()方法.对于这个问题的解决方案如下: 只需要在Menifest文件的activity相应标签下添加这行代码即可: andro ...