经过几天的学习,终于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. 在单元测试中指定log4j的配置文件

    在开发过程中,我们会使用到log4j来输出日志,我们希望在单元测试的时候,只看到部分日志信息,或者定义日志输出的级别.   这个时候手工指定log4j的配置文件:   具体做法如下: 定义类如下: i ...

  2. 解析Json的谷歌官方方法Gson和阿里巴巴的fastJson方法。

    //测试单个json文本 public void testGsonTwo(){ String jsonStr = "{\"id\":100,\"name\&qu ...

  3. c++ 普通高精乘

    //第一次提交全错了,太过相信自己了. //给我教训是注意循环后变量的值,和pascal不一样. //就不贴错误代码了. //codevs3118 高精度练习之除法 #include<cstdi ...

  4. linux 线程操作问题undefined reference to 'pthread_create'的解决办法(cmake)

    问题原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a. 所以在使用pthread_create()创建线程时,需要链接该库. 1. 终端:问题解 ...

  5. g++默认支持c++11标准的办法

    //第一种,直接包含在源程序文件中,如第一行代码所示 #pragma GCC diagnostic error "-std=c++11" #include <iostream ...

  6. ubuntu 14.04 安装截图工具 Shutter及使用

    一.安装截图工具 Shutter 1. 添加安装包软件源 sudo add-apt-repository ppa:shutter/ppa 1 2. 更新源并安装 shutter sudo apt-ge ...

  7. html,body最顶层元素.

    1,元素百比分是相对父元素,所有元素默认父元素是body. absolute,fixed[只有一个父元素,浏览器窗口]除外[浏览器窗口,为父元素].css3:vh,vw也永远相对,浏览器窗口.heig ...

  8. Windows的同步I/O和异步I/O

    同步I/O操作 执行步骤 1.        程序通过FileStream对象来打开磁盘文件,然后调用Read方法(内部调用Win32 ReadFile函数),从文件中读取数据.这时,线程从托管代码转 ...

  9. 前端CSS编程之道-LESS

    由于前端css编写繁琐,最近开始学习LESS,用LESS编写文件.less文件可以直接编译成我们要的.css文件 学习Less 我下面是我练习时的截图,希望小伙伴也能动手自己写一下,而不是复制粘贴模式 ...

  10. [pjsip]Pjlib中配置文件config.h解析

    config_site.h 这个头文件包含在config.h中,用于引入平台?(site)/用户特定的配置以控制PJLIB的特性,用户需要自己生成这个文件. 譬如说我们要把PJLIB编译成DLL,那么 ...