amba H2平台用PWM控制LCD背光
ambarella H2系列Soc的GPIO口能作PWM使用的个数有限(GPIO0-GPIO3),从PRM里GPIO: Function Selection章节可以得到如何配置GPIO为PWM功能。

假设想把GPIO0配置成PWM输出,根据上图修改ambarella/boards/h2_xxx/bsp/bsp.h ,如下:
即DEFAULT_IOMUX_REG0_2、DEFAULT_IOMUX_REG0_1、DEFAULT_IOMUX_REG0_0的第0位要分别设为0、1、1。
一、系统层用脚本控制PWM0示例
echo > /sys/class/pwm/pwmchip0/export
echo > /sys/class/pwm/pwmchip0/pwm0/period (设置周期)
echo > /sys/class/pwm/pwmchip0/pwm0/duty_cycle (设置有效时间)
echo > /sys/class/pwm/pwmchip0/pwm0/enable (使能PWM)
占空比= 有效时间/周期, 占空比越大,LCD背光越亮(有效时间要小于等于周期时间)。
为了方便使用写成脚本set_pwm.sh:
#! /bin/bash
#
# set_pwm.sh <gpio_id> < | > <duty_cycle> <period> do_cmd()
{
local id=$
local ena=$
local d_cycle=$
local per=$
local GPIO_ROOT=/sys/class/pwm/pwmchip0
local GPIO_DIR=$GPIO_ROOT/pwm$id if [[ ! -d $GPIO_DIR ]]; then
echo $id > $GPIO_ROOT/export
fi echo $ena > $GPIO_DIR/enable
echo $per > $GPIO_DIR/period
echo $d_cycle > $GPIO_DIR/duty_cycle
} usage()
{
echo " set_pwm.sh <gpio_id> < 1 | 0 > <duty_cycle> <period>"
} do_main()
{
case "$2" in
)
do_cmd $ $ $
;;
)
do_cmd $ $ $
;;
*)
usage
;;
esac
} if [[ -z $ ]]; then
usage
else
do_main $*
fi
二、写一个pwm驱动: pwm.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <linux/pwm.h>
#include <linux/uaccess.h> #define PWM_MAGIC 'P' //定义一个幻数
#define PWM_ON _IOW(PWM_MAGIC, 0, struct pwm_capture_t) //定义一个ioctl cmd
#define PWM_OFF _IOW(PWM_MAGIC, 1, struct pwm_capture_t) //定义另一个ioctl cmd struct pwm_device *pwm_dev_0;
struct pwm_capture_t {
unsigned int period;
unsigned int duty_cycle;
}pwmm; static long pwm_ioctl(struct file *file,
unsigned int cmd,
unsigned long arg)
{
int ret;
switch(cmd) {
case PWM_ON:
ret = copy_from_user(&pwmm, (void *)arg, sizeof(struct pwm_capture_t));
if (ret < )
return ret;
ret = pwm_config(pwm_dev_0, pwmm.duty_cycle, pwmm.period);
if (ret < ) {
printk("pwm_dev_0 ioctl fail");
return ;
}
pwm_enable(pwm_dev_0);
break;
case PWM_OFF:
ret = copy_from_user(&pwmm, (void *)arg, sizeof(struct pwm_capture_t));
if (ret < )
return ret;
ret = pwm_config(pwm_dev_0, , pwmm.period);
if (ret < ) {
printk("pwm_dev_2 ioctl fail");
return ;
}
pwm_disable(pwm_dev_0);
break;
}
return ;
}
//定义初始化硬件操作方法
static struct file_operations pwm_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = pwm_ioctl
};
//定义初始化混杂设备对象
static struct miscdevice pwm_misc = {
.minor = MISC_DYNAMIC_MINOR, //动态分配次设备号
.name = "mypwm", //dev/mypwm
.fops = &pwm_fops
};
static int pwm_init(void)
{
int ret;
printk("regisger pwm_misc device\n");
//1.申请pwm资源,设置输出为0
pwm_dev_0 = pwm_request(, "pwm_0");
if (pwm_dev_0 == NULL) {
printk("pwm_dev_0 register fail\n");
} ret = pwm_config(pwm_dev_0, , );
if (ret < ) {
printk("pwm_dev_0 config fail\n");
return ;
} ret = pwm_enable(pwm_dev_0);
if (ret == ) {
printk("pwm_dev_0 enable success\n");
} else if (ret < ) {
printk("pwm_dev_0 enable fail\n");
return ;
}
//2.注册混杂设备
misc_register(&pwm_misc);
return ;
} static void pwm_exit(void)
{
printk("unregister pwm_misc device\n");
//1.卸载混杂设备
misc_deregister(&pwm_misc);
//2.释放pwm资源
pwm_config(pwm_dev_0, , );
pwm_disable(pwm_dev_0);
pwm_free(pwm_dev_0); } module_init(pwm_init);
module_exit(pwm_exit);
MODULE_LICENSE("GPL");
测试程序pwm_test.c:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> #define PWM_MAGIC 'P' //定义一个幻数,要和pwm.c里定义的相同
#define PWM_ON _IOW(PWM_MAGIC, 0, struct pwm_capture_t) //定义一个ioctl cmd, 要和pwm.c里定义的相同
#define PWM_OFF _IOW(PWM_MAGIC, 1, struct pwm_capture_t) //同上 struct pwm_capture_t {
unsigned int period;
unsigned int duty_cycle;
}; int main(int argc, char **argv)
{
int fd;
int a;
int period, duty_cycle;
if (argc < ) {
printf("usage: %s on/off duty_cycle period\n", argv[]);
return -;
}
duty_cycle = strtol(argv[], NULL, );
period = strtol(argv[], NULL, );
if (duty_cycle > period) {
printf("duty_cycle shouldn't larger than period\n");
return -;
}
struct pwm_capture_t pwmm = {period, duty_cycle}; fd = open("/dev/mypwm", O_RDWR);
if (fd < )
return -;
while() {
/* for(a = 0; a <= period; a += 5) {
pwmm.duty_cycle = a;
ioctl(fd, PWM_ON, &pwmm);
usleep(1000);
} for(a = period; a >= 0; a -= 5) {
pwmm.duty_cycle = a;
ioctl(fd, PWM_ON, &pwmm);
usleep(1000);
}
usleep(1000000);
}
*/ if (strcmp(argv[], "on") == ) {
ioctl(fd, PWM_ON, &pwmm);
} else if (strcmp(argv[], "off") == ) {
ioctl(fd, PWM_OFF, &pwmm);
} else {
printf("invalid parameter\n");
} close(fd);
return ;
}
执行./pwm_test on 200000 500000,会看到LCD背光点亮,增加duty_cycle的值,背光会变得更亮。
pwm除了可以控制屏幕亮度外还可以控制风扇转速,根据cpu负载大小调整散热风扇的转速,也是一个常用的功能。
amba H2平台用PWM控制LCD背光的更多相关文章
- 十二、使用PWM调整LCD背光亮度
和手机一样,开发板中也带有调整背光亮度的功能. 调整背光亮度依赖于PWM,它通过调节脉冲宽度来控制背光亮度,此方式需要使用PWM驱动.本章将对其进行讲解. 一.用户空间调整背光亮度 一般应用程序可以通 ...
- [LED]如何配置LCD背光和LED,调试方法
[DESCRIPTION] 如何配置LCD背光和LED,调试方法 [SOLUTION]LCD背光和LED配置文件alps/custom/<proj name>lk/cust_leds.ca ...
- 如何配置LCD背光和LED,调试方法
LCD背光和LED配置文件 alps/custom/<proj name>lk/cust_leds.c alps/custom/<proj name>/kernel/leds/ ...
- PWM控制led渐变
PWM,中文释义:脉冲宽度调制.它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术. PWM 是一种对模拟信号电平进行数字编码的方法.通过高分辨率计数器的使用,方波的占空比被调制用来对 ...
- 使用IOCTL代码实现LCD背光调节
国内这种代码找不到.于是參考了相关代码后完好例如以下代码,且实现方式通过IOCTL代码实现LCD背光调节的功能. 适合场合为平板电脑或者笔记本.主要还是要靠BIOS支持与否. 编译环境使用:Dev-c ...
- 树莓派 温度监控 PWM 控制风扇 shell python c 语言
Mine: 图中圈出来的是三极管 和滤波电容 依赖库: wiringPi sudo apt-get install wiringpi Shell脚本 本文介绍使用Shell脚本在树莓派上启用软件PWM ...
- 8_陀螺仪MPU6050和PWM控制在STM32F4-Discovery开发板上的实现
非常早曾经就把圆点博士的程序从STM32F103移植到STM32F4_Discovery (STM32F407), battery.陀螺仪和PWM电机控制的程序都已经測试完成,执行有一段时间,正常.以 ...
- PWM控制灯亮暗的verilog实现
PWM的全称为Pulse-Width Modulation(脉冲宽度调制),即调节脉冲的占空比.当输出的脉冲频率一定时,输出的脉冲占空比越大,相当于输出的有效电平越大,这样也就简单实现了由FPGA来控 ...
- ambarella H2平台fpga捕捉卡驱动案例
公司最近开发的一款产品用到了ambarella H2平台的一款Soc,众所周知ambarella的H2系列的Soc编码能力很强,最高可达4kp60,捕捉上没有用ambarella开发板推荐的几个捕捉卡 ...
随机推荐
- 算法修炼之路——【链表】Leetcode24 两两交换链表中的节点
题目描述 给定一单链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是简单的改变节点内部的值,而是需要实际的进行节点交换. 示例: 输入:head = [1, 2, 3, 4] 输出:hea ...
- coding++:mybatis update foreach (SQL循环)批量更新
今天要做批量更新的业务,采用 mybaits 的 foreach 动态语句,遇到一些问题做下记录. 参考示例(1): <update id="" parameterType= ...
- Redis在linux环境下的安装
下载Redis安装包 wget http://download.redis.io/releases/redis-3.2.9.tar.gz 解压Redis安装包 tar -zxvf redis-3.2. ...
- [洛谷1649]障碍路线<BFS>
题目链接:https://www.luogu.org/problem/show?pid=1649 历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾: 这是一道很明显的BFS,然 ...
- 从 Linux 操作系统谈谈 IO 模型(终)
Linux 为什么要区分内核空间与用户空间? Linux 操作系统的 IO 模型有哪几种?有啥区别? 常说的阻塞现象,到底是咋回事? 网络编程研发时,那块到底耗时最多,代码是否还有优化空间? 前几期的 ...
- 《快速认识 Three.js 》
此文仅作备份之用,为了更好的阅读体验,建议访问原文链接:<Three.js - 走进3D的奇妙世界.> ,感谢原作者的好文.
- Fiddler插件---将Mapi请求自动转为HTTPRunner测试用例(YAML格式)
背景 继之前鼓捣出了Mapi解密插件之后,在团队内已经使用了三年之久,一跃成为团队最爱欢迎的测试工具之一(加个之一,低调谦虚一点). 随着团队推行HttpRunner搞接口自动化:编写和维护Case带 ...
- 如何优雅的将文件转换为字符串(环绕执行模式&行为参数化&函数式接口|Lambda表达式)
首先我们讲几个概念: 环绕执行模式: 简单的讲,就是对于OI,JDBC等类似资源,在用完之后需要关闭的,资源处理时常见的一个模式是打开一个资源,做一些处理,然后关闭资源,这个设置和清理阶段类似,并且会 ...
- PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分) 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...
- spring中BeanPostProcessor之一:InstantiationAwareBeanPostProcessor(03)
前面介绍了InstantiationAwareBeanPostProcessor后置处理器的postProcessBeforeInstantiation和postProcessAfterInstant ...