经过几天的学习,终于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驱动的更多相关文章

  1. 兼容可控硅调光的一款LED驱动电路记录

    1.该款电路为兼容可控硅调光的LED驱动电路,采用OB3332为开关控制IC,拓扑方案为Buck: 2.FB1:磁珠的单位是欧姆,而不是亨利,这一点要特别注意.因为磁珠的单位是按照它在某一频率 产生的 ...

  2. FL2440驱动添加(4)LED 驱动添加

    硬件信息:FL2440板子,s3c2440CPU带四个LED,分别在链接GPB5,GPB6,GPB8,GPB10 内核版本:linux-3.8.0 led驱动代码如下: 值得注意地方地方: 1,定时器 ...

  3. linux设备驱动归纳总结(五):4.写个简单的LED驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-84693.html linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxx ...

  4. uTenux——LED驱动讲解

    LED驱动讲解,对于一个嵌入式的工程师还是一个刚开是学习相关电子设计的朋友,对于LED的驱动问题应该不甚陌生.我所说的LED驱动并不是类似大功率LED照明的那个驱动,而是简单的控制器对LED的控制驱动 ...

  5. Android系统移植与驱动开发——第七章——LED驱动

    LED驱动的实现原理 编写LED驱动: 测试LED驱动之前需要用USB数据线连接开发板,然后打开电源,成功启动之后,执行build.sh脚本文件编译和安装LED驱动,顺利则会自动连接 如果有多个设备文 ...

  6. 全志A33 linux led驱动编程(附实测参考代码)

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 开发平台 * 芯灵思Sinl ...

  7. Linux驱动之LED驱动编写

    从上到下,一个软件系统可以分为:应用程序.操作系统(内核).驱动程序.结构图如下:我们需要做的就是写出open.read.write等驱动层的函数.一个LED驱动的步骤如下: 1.查看原理图,确定需要 ...

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

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

  9. JZ2440 启动NFS网络文件系统_初试led驱动

    http://blog.csdn.net/emdfans/article/details/12260969 u-boot ---> q 修改bootargs变量 默认: bootargs=noi ...

  10. 基于sys文件系统的LED驱动的移植【原创】

    基于RK3188平台LED驱动程序的移植的移植.如有不正确之处,欢迎大家指点. 本文的LED驱动程序不是通过打开设备节点来访问和控制LED的,是通过sys文件系统来控制LED. 板子上有四盏灯以及对应 ...

随机推荐

  1. 5 echo展开

    一.(字符)展开 1.echo在标准输出中打印出他的文本 echo this is a test 输出 this is a test 2.输出通配符时,比如*代表匹配文件名的任何字符 echo * 输 ...

  2. JDE开发端安装问题(JDE初步卸载重装)

    JDE版本:9.1.4 所遇场景:安装JDE客户端.WEBServer后,卸载重新安装.在安装client后提示找不到DV\PY包. 日志installActionsXXX.log中显示 信息: 10 ...

  3. JBOSS常用端口说明

    1.jboss 的端口修改位置总结 Jboss通常占用的端口是1098,1099,4444,4445,8080,8009,8083,8093这几个, 默认端口是8080 在windows系统中: 10 ...

  4. 完美实现自己的GetProcAddress函数(转载)

    我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress ...

  5. linux修改系统时间和linux查看时区、修改时区的方法

    一.查看和修改Linux的时区 1. 查看当前时区命令 : "date -R" 2. 修改设置Linux服务器时区方法 A命令 : "tzselect" 方法 ...

  6. SQL SERVER 创建作业

    ),,                ,            ,     , ,      ),SERVERPROPERTY(N,                ,            ,     ...

  7. redis OK

    http://redis.readthedocs.org/en/2.4/set.html1, client.end();redis.expire(key,10) ,lsize,llen APPEND ...

  8. jquery插件理解看这

    zepto 插件写法 一个更换背景颜色的小插件 html 1 <div id="box">content</div> javascript 12345678 ...

  9. 关于java.lang.reflect.InvocationTargetException

    今天遇到java.lang.reflect.InvocationTargetException错误,卡了好一会儿,报错代码 try { Class<?> c= Class.forName( ...

  10. 安装eclipse for c/c++环境

    安装eclipse for c/c++环境:       1.启动eclipse,       2.选择Help->Install New Software...,在Work with的框框下复 ...