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. class-dump的安装和使用

    安装步骤 1.下载地址:http://stevenygard.com/projects/class-dump/ 2.打开终端输入 open /usr/local/bin 3.把dmg文件中的class ...

  2. python中的可变和不可变对象 有序和无序对象

    可变对象和不可变对象的定义:对象存放在地址的值是否可以被改变 不可变对象包括:整形int.浮点型float .字符串str .元祖tuple.布尔型boole 可变对象包括 :列表list.集合set ...

  3. [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林

    [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林 0x00 摘要 本文将尽量使用通俗易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来看,运用感性直觉的思考来 ...

  4. 监控一哥Prometheus你可认识?

    先大致认识认识普罗米修斯 —— Prometheus. 依据官方文档https://prometheus.io/docs/introduction/overview/ 大概能够了解到 Promethe ...

  5. 面试常问的 Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  6. Hibernate实现limit语句效果

    Hibernate hibernate实现limit效果 由于hql语句内无法直接书写limit语法,所以需要通过别的方式来达成这个效果 limit效果一般需要有两个参数:开始位置start和查询数量 ...

  7. composer换源,composer切换国内源

    首先要分清楚是局部换源还是全局换源 1.局部换源(仅对当前项目有效) 在当前项目下的composer.json中添加 { "repositories": [ { "typ ...

  8. Kylin 新定位:分析型数据仓库

    亲爱的各位社区朋友: Apache Kylin 在 2014 年 10 月开源并加入 Apache 软件基金会的孵化器,一年后从孵化器毕业成为 Apache 顶级项目.从第一天起,Kylin 的标语是 ...

  9. 页面静态化--Thymeleaf

    1.Thymeleaf简介 官方网站:https://www.thymeleaf.org/index.html Thymeleaf是用来开发Web和独立环境项目的现代服务器端Java模板引擎. Thy ...

  10. json文件操作

    1.把字典或list转换成字符串方法 json.dumps() 2.把字符串转换成字典方法 json.loads() 3.indent 存储文件时每行加缩进数 4.ensere_asci 文件中有中文 ...