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背光的更多相关文章

  1. 十二、使用PWM调整LCD背光亮度

    和手机一样,开发板中也带有调整背光亮度的功能. 调整背光亮度依赖于PWM,它通过调节脉冲宽度来控制背光亮度,此方式需要使用PWM驱动.本章将对其进行讲解. 一.用户空间调整背光亮度 一般应用程序可以通 ...

  2. [LED]如何配置LCD背光和LED,调试方法

    [DESCRIPTION] 如何配置LCD背光和LED,调试方法 [SOLUTION]LCD背光和LED配置文件alps/custom/<proj name>lk/cust_leds.ca ...

  3. 如何配置LCD背光和LED,调试方法

    LCD背光和LED配置文件 alps/custom/<proj name>lk/cust_leds.c alps/custom/<proj name>/kernel/leds/ ...

  4. PWM控制led渐变

    PWM,中文释义:脉冲宽度调制.它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术. PWM 是一种对模拟信号电平进行数字编码的方法.通过高分辨率计数器的使用,方波的占空比被调制用来对 ...

  5. 使用IOCTL代码实现LCD背光调节

    国内这种代码找不到.于是參考了相关代码后完好例如以下代码,且实现方式通过IOCTL代码实现LCD背光调节的功能. 适合场合为平板电脑或者笔记本.主要还是要靠BIOS支持与否. 编译环境使用:Dev-c ...

  6. 树莓派 温度监控 PWM 控制风扇 shell python c 语言

    Mine: 图中圈出来的是三极管 和滤波电容 依赖库: wiringPi sudo apt-get install wiringpi Shell脚本 本文介绍使用Shell脚本在树莓派上启用软件PWM ...

  7. 8_陀螺仪MPU6050和PWM控制在STM32F4-Discovery开发板上的实现

    非常早曾经就把圆点博士的程序从STM32F103移植到STM32F4_Discovery (STM32F407), battery.陀螺仪和PWM电机控制的程序都已经測试完成,执行有一段时间,正常.以 ...

  8. PWM控制灯亮暗的verilog实现

    PWM的全称为Pulse-Width Modulation(脉冲宽度调制),即调节脉冲的占空比.当输出的脉冲频率一定时,输出的脉冲占空比越大,相当于输出的有效电平越大,这样也就简单实现了由FPGA来控 ...

  9. ambarella H2平台fpga捕捉卡驱动案例

    公司最近开发的一款产品用到了ambarella H2平台的一款Soc,众所周知ambarella的H2系列的Soc编码能力很强,最高可达4kp60,捕捉上没有用ambarella开发板推荐的几个捕捉卡 ...

随机推荐

  1. ajax实现图片上传与进度条

    这里使用的是bootstract的一个插件来实现 详情请查看文档中的进度条 https://v3.bootcss.com/components/ 引入必要的文件 <link href=" ...

  2. iOS 响应链

    一.UIResponder app 使用响应者对象接收和处理事件,只有继承 UIResponder 的类,才能处理事件. UIApplication.UIView.UIViewController 都 ...

  3. 《Flutter 动画系列》组合动画

    老孟导读:在前面的文章中介绍了 <Flutter 动画系列>25种动画组件超全总结 http://laomengit.com/flutter/module/animated_1/ < ...

  4. 140行Python代码实现Flippy Bird

    140行代码实现Flippy Bird 话说这游戏中文名叫什么来着,死活想不起来了,算了话不多说,140行实现小游戏系列第二章,依然是简单小游戏,与数独游戏相比,在游戏界面显示上更难一些,但是在逻辑方 ...

  5. [vijos]1051送给圣诞夜的极光<BFS>

    送给圣诞夜的极光 题目链接:https://www.vijos.org/p/1051 这是一道很水很水的宽搜水题,我主要是觉得自己在搜素这一块有点生疏于是随便找了一题练手,找到这么一道水题,原本以为可 ...

  6. NodeMCU入坑指南-低成本打造零舍友闻风丧胆WiFi断网神器

    前言 最近对IoT方面比较感兴趣,所以在某宝上入手了一块NodeMCU的开发板,至于为什么我选择这块开发板呢?嘿嘿,当然是因为便宜啊

  7. (17/34)AC自动机/后缀数组/后缀自动机(施工中)

    快补题别再摸鱼了(17/34) 1.AC自动机 #define maxnode 1000010 #define maxsize 26 struct ahocT{ int ch[maxnode][max ...

  8. PTA数据结构与算法题目集(中文) 7-10

    PTA数据结构与算法题目集(中文)  7-10 7-10 公路村村通 (30 分)   现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低 ...

  9. Pytest系列(11)- 失败重跑插件pytest-rerunfailures详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 环境前提 以下先决条件才能使用py ...

  10. 从String 聊源码解读

    @ 目录 源码实现 构造方法 equals 其他方法 常见面试题 你真的了解String吗?之前一篇博客写jvm时,就觉得String可以单独拎出来写一篇博客,毕竟几乎所有的面试都是以String开始 ...