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. Feign客户端实现RPC 调用

    1,springcloud 中支持http调用的两种方式,RestTemplate,Feign客户端 2,Feign 客户端是一个声明式(注解方式)http 远程调用工具 3,实现方式如下: 第一步: ...

  2. 基于MVP模式实现四则运算器

    基于MVP模式四则运算器 来到新东家,项目的框架采用的是MVP模式,刚来公司的时候,项目经理给予分配小任务,首先熟悉MVP模式,而后普通的四则运算器的实现使用MVP分层.这里主要回顾当时做任务时候的对 ...

  3. jdk安装和配置教程

    目录 jdk的下载 jdk的安装 配置环境变量 验证是否配置成功] 一些常见的错误(待更新) 一.首先是jdk的下载 链接:https://pan.baidu.com/s/1ojQDuCwiGSA7A ...

  4. 爬虫简介和requests模块

    目录 爬虫介绍 requests模块 requests模块 1.requests模块的基本使用 2.get 请求携带参数,调用params参数,其本质上还是调用urlencode 3.携带header ...

  5. 在线诊断工具arthas (windows)

    介绍: arthas是阿里巴巴开发的一款开源的,Java应用程序排查问题的非常好用的工具 当你遇到以下类似问题而束手无策时 arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各 ...

  6. Appium自动化 - 设置unicodeKeyboard: True运行脚本后,手机输入时无法调出软键盘

    问题背景 做appium自动化的时候,使用了UiAutomator1驱动,然后设置了UnicodeKeyboard 执行自动化脚本之后,玩手机的时候发现平时用的输入法键盘没法调出来了 'automat ...

  7. python:*args和**kwargs的用法

    1.*args用来将参数打包成tuple给函数体调用 代码: # *args用来将参数打包成tuple给函数体调用 def func(*args): print(args,type(args)) fu ...

  8. 《Three.js 入门指南》3.1.1 - 基本几何形状 -圆环结(TorusKnotGeometry)

    3.1 基本几何形状 圆环结(TorusKnotGeometry) 构造函数 THREE.TorusKnotGeometry(radius, tube, radialSegments, tubular ...

  9. C9K Stackwise Virtual(一)

    一.SV技术基本说明 思科Catalyst9K平台的Stackwise Virtual技术是将两个物理的交换机虚拟成一个逻辑的实体(从网络控制层面和管理的角度来看),这两个交换机合二为一之后,将共享相 ...

  10. Zabbix监控平台

                                                                     Zabbix监控平台 案例1:常用系统监控命令 案例2:部署Zabbi ...