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. 开源APP

    仿微信 https://github.com/zhengwenming/WeChat 电台韵律 https://github.com/DaMingShen 运动App https://github.c ...

  2. Python itchat库(1)

    一.实验环境 在cmd中输入以下命令,完成微信的API包itchat的安装. pip install itchat 注意这里有个问题,因为电脑里既有Python3.6,又有anaconda.所以一定要 ...

  3. js拖拽效果的实现及原理

    元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标. 拖拽原理:按下拖拽元素后开始监听文档中鼠标移动事件,然后再监听鼠标松开事件:鼠标移动时,元素div要随着鼠标一起移动,需要计算元素div位移的距离 ...

  4. JS 剑指Offer(五) 二叉树的重建

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目分析:已知二叉树的前序和中序遍历,根据前序遍历和中序遍历的规则,前序遍历的第一 ...

  5. python基础知识 目录 简介

    1.1编程语言介绍与分类 什么是编程语言? 本质:与人类语言一样.沟通 电流+一堆硬件 高电压1 低电压0 高电压1 低电压0 高电压1 低电压0 8 晶体管 010101010101 play so ...

  6. D 楼房重建

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊 ...

  7. 基于华为云IoT Studio自助生成10万行代码的奥秘

    华为IoT小助手们搬好板凳.备好笔记本.听了HDC.Cloud的几场华为云技术架构师的直播讲课,感觉获益匪浅却又似懂非懂,直后悔自己没有好好打下基础.为了避免再次出现这样的情况,小助手偷偷跑去找了华为 ...

  8. echarts图表x,y轴的设置

    https://www.cnblogs.com/cjh-strive/p/11065005.html xAxis属性代表echarts图表的x轴设置代码如下 xAxis : [ { type : 'c ...

  9. Git常用命令(二)

    git clone + URL 获取该项目源代码 $ git log 回顾提交历史 $ git log -p -(数字) 用来显示每次提交的内容差异+(数字)表示看最近几条 $ git log --s ...

  10. 从JDK源码学习HashSet和HashTable

    HashSet Java中的集合(Collection)有三类,一类是List,一类是Queue,再有一类就是Set. 前两个集合内的元素是有序的,元素可以重复:最后一个集合内的元素无序,但元素不可重 ...