Smart210---LED驱动
经过几天的学习,终于linux驱动的基本框架弄清楚了。。。真的很艰辛,,,不过终于还是熬过来了,虽然还是最基础的,,,
今晚也完成了我第一个linux驱动,,,心里还是有点小兴奋的,哈哈O(∩_∩)O
直接上驱动源程序吧:::
我的开发板是Smart210,根据原理图,IO口输出0 led亮,输出1 led灭
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/delay.h> #include <mach/gpio.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h> #define DEVICE_NAME "leds"
/* 应用程序执行ioctl(fd, cmd, arg)时的第2个参数 */
/*the second parameter that application program execute*/
#define IOCTL_GPIO_ON 1
#define IOCTL_GPIO_OFF 0
/* 用来指定LED所用的GPIO引脚 */
/*appoint the pin the LED will use*/
static unsigned long leds_table [] =
{
S5PV210_GPJ2(),
S5PV210_GPJ2(),
S5PV210_GPJ2(),
S5PV210_GPJ2(),
//arch\arm\mach-s5pv210\include\mach\gpio.h
};
static char leds_name[][]={{"LED1"},{"LED2"},{"LED2"},{"LED3"}};
#define LED_NUM ARRAY_SIZE(leds_table)
/**
*函数功能:打开/dev/led设备
*fuction:open /dev/leds device
*设备名是:/dev/leds
*devce name: /dev/leds
**/
static int my_led_open(struct inode *inode, struct file *file)
{
int i;
int err; for (i = ; i < LED_NUM; i++)
{
err = gpio_request(leds_table[i], leds_name[i]);
//drivers/gpio/gpiolib.c
if(err)
{
printk(KERN_ERR "failed to request S5PV210_GPH2(%d) for LED%d \n",i-,i);
return err;
}
} for (i = ; i < LED_NUM; i++)
{
s3c_gpio_cfgpin(leds_table[i], S3C_GPIO_OUTPUT);//Configuration pin function:input output multiplex
gpio_set_value(leds_table[i], );//Set the pin level
//arch\arm\plat-samsung\gpio-config.c
// gpio_direction_output(leds_table[i], 0);//write a value to GPIO port ,also set the port to output mode
// gpio_set_value(leds_table[i], 0);
//drivers/gpio/gpiolib.c }
printk(KERN_INFO "LEDs driver successfully close\n");
return ;
} static long my_led_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
{
arg -= ;
if(arg > LED_NUM) {
return -EINVAL;
} switch(cmd) {
case IOCTL_GPIO_ON:
printk("led light\n");
gpio_set_value(leds_table[arg], );
break; case IOCTL_GPIO_OFF:
printk("led no light\n");
gpio_set_value(leds_table[arg], );
break; default:
printk("led failed\n");
return -EINVAL;
}
return ;
} static int my_led_close(struct inode * inode,struct file * file)
{
int i;
for(i= ; i < LED_NUM; i++)
gpio_free(leds_table[i]);
printk(KERN_EMERG"close success\n");
return ;
} struct file_operations my_led_ops = {
.owner = THIS_MODULE,
.open = my_led_open,
.unlocked_ioctl = my_led_ioctl,
.release = my_led_close,
}; static struct miscdevice led_misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &my_led_ops,
}; static int __init my_led_init(void)
{
int ret; ret = misc_register(&led_misc);
if(ret) {
printk(KERN_INFO"misc_register failed\n");
} printk(KERN_INFO"misc_register sucessed\n"); return ;
} static void __exit my_led_exit(void) {
int i;
misc_deregister(&led_misc);
for(i= ; i < LED_NUM; i++)
gpio_free(leds_table[i]);
printk(KERN_INFO "LEDs driver successfully exit\n");
} module_init(my_led_init);
module_exit(my_led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("qigaohua");
应用程序:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/time.h> #define IOCTL_GPIO_ON 1
#define IOCTL_GPIO_OFF 0 int main(int argc, char **argv)
{
int fd; fd = open("/dev/leds",);
if(fd < ) {
printf("/dev/leds open failed\n");
exit();
} do {
printf("/dev/leds open sucessed\n");
ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_OFF, );
ioctl(fd, IOCTL_GPIO_OFF, );
ioctl(fd, IOCTL_GPIO_OFF, );
sleep(); ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_OFF, );
ioctl(fd, IOCTL_GPIO_OFF, );
sleep(); ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_OFF, );
sleep(); ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_ON, );
ioctl(fd, IOCTL_GPIO_ON, );
sleep(); ioctl(fd, IOCTL_GPIO_OFF, );
ioctl(fd, IOCTL_GPIO_OFF, );
ioctl(fd, IOCTL_GPIO_OFF, );
ioctl(fd, IOCTL_GPIO_OFF, );
}while(); close(fd);
return ; }
Smart210---LED驱动的更多相关文章
- 兼容可控硅调光的一款LED驱动电路记录
1.该款电路为兼容可控硅调光的LED驱动电路,采用OB3332为开关控制IC,拓扑方案为Buck: 2.FB1:磁珠的单位是欧姆,而不是亨利,这一点要特别注意.因为磁珠的单位是按照它在某一频率 产生的 ...
- FL2440驱动添加(4)LED 驱动添加
硬件信息:FL2440板子,s3c2440CPU带四个LED,分别在链接GPB5,GPB6,GPB8,GPB10 内核版本:linux-3.8.0 led驱动代码如下: 值得注意地方地方: 1,定时器 ...
- linux设备驱动归纳总结(五):4.写个简单的LED驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-84693.html linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxx ...
- uTenux——LED驱动讲解
LED驱动讲解,对于一个嵌入式的工程师还是一个刚开是学习相关电子设计的朋友,对于LED的驱动问题应该不甚陌生.我所说的LED驱动并不是类似大功率LED照明的那个驱动,而是简单的控制器对LED的控制驱动 ...
- Android系统移植与驱动开发——第七章——LED驱动
LED驱动的实现原理 编写LED驱动: 测试LED驱动之前需要用USB数据线连接开发板,然后打开电源,成功启动之后,执行build.sh脚本文件编译和安装LED驱动,顺利则会自动连接 如果有多个设备文 ...
- 全志A33 linux led驱动编程(附实测参考代码)
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 开发平台 * 芯灵思Sinl ...
- Linux驱动之LED驱动编写
从上到下,一个软件系统可以分为:应用程序.操作系统(内核).驱动程序.结构图如下:我们需要做的就是写出open.read.write等驱动层的函数.一个LED驱动的步骤如下: 1.查看原理图,确定需要 ...
- (笔记)linux设备驱动--LED驱动
linux设备驱动--LED驱动 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋友 ...
- JZ2440 启动NFS网络文件系统_初试led驱动
http://blog.csdn.net/emdfans/article/details/12260969 u-boot ---> q 修改bootargs变量 默认: bootargs=noi ...
- 基于sys文件系统的LED驱动的移植【原创】
基于RK3188平台LED驱动程序的移植的移植.如有不正确之处,欢迎大家指点. 本文的LED驱动程序不是通过打开设备节点来访问和控制LED的,是通过sys文件系统来控制LED. 板子上有四盏灯以及对应 ...
随机推荐
- .NET GC机制学习笔记
学习笔记内容来自网络资料摘录http://www.cnblogs.com/springyangwc/archive/2011/06/13/2080149.html 1.GC介绍 Garbage Col ...
- Android中 在显示ImageView时图片上面和下面都出现一段空白区间的解决办法
开始的时候是在ScrollView中显示ImageView的时候出现这样的问题,以为是要对ScrollView进行设置的,后来发现单独显示一个ImageView的时候也会出现这样的问题,由此才知道是应 ...
- 原创:ASP.Net状态管理读书笔记--思维导图
导图文件下载 课前提问几个问题 使用Session 配置 model aspnet_regsql.exe 常见问答 问:为什么Session在有些机器上偶尔会丢失?答:可能和机器的环境有关系,比如:防 ...
- linux常用的重要的命令: netstat
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Membershi ...
- Linux 下一个很棒的命令行工具
导读 Taskwarrior 是 Ubuntu/Linux 下一个简单而直接的基于命令行的 TODO 工具.这个开源软件是我曾用过的最简单的基于命令行的工具之一.Taskwarrior 可以帮助你更好 ...
- POJ 3299 Humidex 难度:0
题目链接:http://poj.org/problem?id=3299 #include <iostream> #include <iomanip> using namespa ...
- 文件浏览器及数码相框 -2.3.1freetype_pc
例子 #include <stdio.h> #include <string.h> #include <math.h> #include <ft2build. ...
- HDU 3966 基础树链剖分
题意:给一棵树,并给定各个点权的值,然后有3种操作:I C1 C2 K: 把C1与C2的路径上的所有点权值加上KD C1 C2 K:把C1与C2的路径上的所有点权值减去KQ C:查询节点编号为C的权值 ...
- Right-BICEP 测试四则运算二程序
测试方法: Right-BICEP 测试计划: 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.是否有乘除法? 4.是否有括号? 5.是否有输出方式? 6.是否可以选择出题 ...
- linux下格式化硬盘与挂载硬盘
格式化: mkfs -t ext4 /dev/sdb 自动挂载: 编辑/etc/fstab文件 sudo nano /etc/fstab,如下图将设备/dev/sdb硬盘挂载到/home/solr/s ...