硬件平台:mt7688
软件平台:原生sdk MediaTek_ApSoC_SDK_4300_20140916  linux-3.10.14内核ws2811是单总线接口的led驱动芯片,通过单个GPIO模拟高低时序发出颜色值,芯片收到后控制输出对应PWM改变三路RGB灯的颜色。#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/timer.h>
#include <linux/delay.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include "ralink_gpio.h"static dev_t sys_led_dev;
static struct class* sys_led_class = 0;
static struct cdev* sys_led_cdev = 0;
#define SYS_LED_NAME        "sys_led"union _rgb
{unsigned int color;struct {unsigned char r;unsigned char g;unsigned char b;}u_s;
};#define set_led_hight()       *(volatile u32*)(RALINK_REG_PIOSET1) = (1 << (44 - 32))
#define set_led_low()       *(volatile u32*)(RALINK_REG_PIORESET1) = (1 << (44 - 32))inline void set_out()//设置GPIO为输出以便控制WS2811
{unsigned long tmp;tmp = *(volatile u32 *)(RALINK_REG_GPIOMODE2);tmp |= 1;*(volatile u32 *)(RALINK_REG_GPIOMODE2) = tmp;tmp = *(volatile u32*)(RALINK_REG_PIODIR1);tmp |= (1 << (44 - 32));*(volatile u32*)(RALINK_REG_PIODIR1) = tmp;
}static void set_led_1(void)//发出二进制1
{set_led_hight();ndelay(678);set_led_low();ndelay(278);
}static void set_led_0(void)//发出二进制0
{set_led_hight();ndelay(278);set_led_low();ndelay(678);
}// >= 50us
static void reset_op(void)//发出Reset信号
{set_led_hight();//首先将总线拉高ndelayndelay(300);//保持一段时间set_led_low();//拉低udelay(50);//至少保持50us,之后芯片等待接收新的数据
}static int sys_led_open(struct inode* in, struct file* fi)
{set_out();return 0;
}static int sys_led_ioctl(struct file* fi, unsigned int cmd, unsigned long data)
{union _rgb rgb;int i;unsigned int fl;switch (cmd){case 0:if (copy_from_user((char*)&rgb, (char*)data, sizeof(rgb)))//从用户空间获得颜色值{return -1;}set_out();reset_op();local_irq_save(fl);//把当前中断状态保存到flags中,然后禁用当前处理器上的中断发送for (i = 0; i < 24; ++i)//发出24bit的颜色值{if (1 & rgb.color)set_led_1();elseset_led_0();rgb.color >>= 1;}local_irq_restore(fl);//中断恢复break;case 1:reset_op();break;}return 0;
}static ssize_t sys_led_write(struct file* fi, char* __user buf, size_t len, loff_t* ff)
{union _rgb rgb;unsigned int fl;int i;if (copy_from_user((char*)&rgb, (char*)buf, sizeof(rgb))){return -1;}set_out();reset_op();local_irq_save(fl);for (i = 0; i < 24; ++i){if (1 & rgb.color)set_led_1();elseset_led_0();rgb.color >>= 1;}local_irq_restore(fl);return sizeof(union _rgb);
}static struct file_operations led_file =
{.owner = THIS_MODULE,.open = sys_led_open,.unlocked_ioctl = sys_led_ioctl,.write = sys_led_write,
};
static void __exit sys_led_exit(void);static int __init sys_led_init(void)
{int ret;sys_led_class = class_create(THIS_MODULE, "sys_led_class");if (IS_ERR(sys_led_class)){printk("error : sys led class create failed\n");return -1;}ret = alloc_chrdev_region(&sys_led_dev, 0, 1, SYS_LED_NAME);if (ret < 0){printk("error : get dev number failed\n");goto error_exit;}device_create(sys_led_class, NULL, sys_led_dev, NULL, "%s", SYS_LED_NAME);sys_led_cdev = cdev_alloc();if (!sys_led_cdev){printk("new memory cdev failed\n");goto error_exit;}cdev_init(sys_led_cdev, &led_file);sys_led_cdev->owner = THIS_MODULE;ret = cdev_add(sys_led_cdev, sys_led_dev, 1);if (ret < 0){printk("sys led cdev add failed\n");goto error_exit;}return 0;
error_exit:sys_led_exit();return -1;
}static void __exit sys_led_exit(void)
{if (sys_led_cdev){cdev_del(sys_led_cdev);}if (sys_led_class){device_destroy(sys_led_class, sys_led_dev);class_destroy(sys_led_class);}unregister_chrdev_region(sys_led_dev, 1);
}module_init(sys_led_init);
module_exit(sys_led_exit);MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("system status led control");
MODULE_AUTHOR("system led");

单总线led驱动芯片WS2811在linux下的驱动相关推荐

  1. linux下usb驱动编写

    linux下usb驱动编写(内核2.4)--2.6与此接口有区别2006-09-15 14:57我们知道了在Linux下如何去使用一些最常见的USB设备.但对于做系统设计的程序员来说,这是远远不够的, ...

  2. 【驱动】linux下I2C驱动架构全面分析

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  3. linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序

    内核版本:linux-3.4.2 源程序:    linux-3.4.2\drivers\i2c\busses\I2c-s3c2410.c 这次要解决的问题是:如何配置soc的I2C模块,输出想要的时 ...

  4. linux下I2C驱动架构全面分析

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  5. linux下IIC驱动开发分析

    1.  IIC规范 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.IIC总线产生于在80年代,最初为音频和 ...

  6. nvidia Quadro P620在linux下安装驱动

    nvidia Quadro P620在linux下安装驱动 在官网上下载最新的驱动: NVIDIA-Linux-x86_64-460.67.run 执行安装的时候提示: ERROR: You appe ...

  7. linux系统下的打印机驱动下载,方法论:Linux下如何驱动主流品牌打印机

    薄荷站长浸淫 Linux 桌面领域十余年,一直致力于 Linux 桌面系统的推广.对于桌面用户办公中必需的打印功能,薄荷站长也是有所研究.为了使新手朋友们少走弯路,薄荷站长介绍一下常见品牌打印机的 L ...

  8. linux安装ati工具,Linux下ATI驱动安装傻瓜安装方法

    Linux下ATI驱动安装傻瓜安装方法 发布时间:2006-01-04 12:58:15来源:红联作者:zz123 菜鸟我刚刚接触Debian不久(其实时间也不短了,但是没有深研究),在各位前辈的指导 ...

  9. linux 网卡驱动分析,基于linux下网卡驱动分析及实现技术研究

    摘    要 Linux技术是当前计算机技术中最大的一个热点,在我国以及全世界得到了迅猛的发展,被广泛的应用于嵌入式系统.服务器.网络系统.安全等领域.从而使得掌握在 Linux环境下的开发技术,成为 ...

  10. 在Linux下如何驱动联想D-link DFE-530TX(也叫D-link DFE-530TX Rev B)网卡

    在Linux下如何驱动联想D-link DFE-530TX(也叫D-link DFE-530TX Rev B)网卡 2001-05-18 18:22 发布者:郑良 阅读次数:435 在Linux下如何 ...

最新文章

  1. 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理
  2. Azure Automation 自动化-自动关闭Azure
  3. HTML第三课——css盒子
  4. 添加vlan后无法上网_KTV多SSID绑定VLAN实用案例,值得一看的干货
  5. JNI基础 c语言调用java方法
  6. 飞行计算机人机工程,人机工程学版
  7. OC中property的有关属性
  8. InteliJ Idea通过maven创建webapp
  9. 20155207 2016-2017-2 《Java程序设计》第七周学习总结
  10. 【算法】排序_直接插入排序及其 优化(希尔排序)
  11. 数字全息干涉偏振相移实验经验总结
  12. 历时一年 Apache Spark 3.3.0 正式发布,新特性详解
  13. MATLAB做三维图时值为0的点不画出来
  14. GSMA公布MWC19上海最新进展
  15. linux内存占用过高问题解决方法
  16. Wi-Fi Display
  17. PAT甲级真题 1011 World Cup Betting (20分) C++实现
  18. Spring Task定时任务
  19. eCharts.js使用心得
  20. Vue - 渲染函数render

热门文章

  1. ad9 自动捕捉功能
  2. JMeter下载和安装
  3. java拼接sql字符串
  4. 国产CAD_手机也能看CAD图纸了?国产软件助力CAD告别电脑时代!
  5. Apache Shiro框架
  6. 深入C++库分析sync_with_stdio实现
  7. oracle /etc/fonts simfang.ttf,xelatex 无法找到方正字体
  8. docker部署springboot父子级项目+mysql+redis菜鸟教程
  9. 论文阅读_ICD编码_MSMN
  10. xp安全模式下如何修复计算机,xp安全模式下怎么解决蓝屏_xp开机进入安全模式修复蓝屏教程...