在展锐sc9820e的代码包中,有些没有在用的代码模块功能是不确定是否OK的,比如这里的PWM模块,在默认的代码里的配置是有问题的,需要花不少时间来调试,才能把功能调正常。

默认的背光是使用PMIC sc2721g的IB0~IB2,最大能输出83mA的总电流,但有些要求更大电流的话,内部PMIC就无能为力了,需要借用外部背光IC了,这里是讲由内部PMIC的改为PWM方式的背光方式。本文讲述的PWM使能引脚选用的是GPIO131/PWMBG1,可以看到该GPIO口的PWM模式为模式1

首先要注意的是,背光的修改是包含uboot和kernel部分的,所以首选修改uboot

u-boot15\include\configs\sp9820e_1h10.h注释掉背光相关宏,如下:

//#define CONFIG_BACKLIGHT_WHTLED

在u-boot15\board\spreadtrum\sp9820e_1h10\sprd_bl.c

中修改#define PWM_INDEX 的值,如果PWM使能引脚使用的是PWMGB0或PWMBG1,则表明使用的是第0 1 2 这几级PWM中的第1组,则上述这个应定义为1

#define PWM_INDEX 1

pinmap文件注意修改,u-boot15\board\spreadtrum\sp9820e_1h10\pinmap-sp9820e.c

{REG_PIN_GPIO33,                        BITS_PIN_AF(1)},
{REG_MISC_PIN_GPIO33,                   BITS_PIN_DS(1)|BIT_PIN_NULL|BIT_PIN_NUL|BIT_PIN_SLP_AP|BIT_PIN_SLP_NUL|BIT_PIN_SLP_OE},

下面讲在kernel部分的修改方法及修改过程中遇到问题的分析解决过程

先是在kernel\arch\arm\configs\sprd_sharkle_fp_defconfig中打开pwm的背光,然后再关闭原来的sc2721_bltcled方式的背光,并手动删除out目录下面的out\target\product\sp9820e_1h10ll\obj\KERNEL\drivers\video\backlight文件夹,让生成的目录更干净。

CONFIG_BACKLIGHT_PWM=y
# CONFIG_BACKLIGHT_SC2721_BLTCLED is not set

然后在sp9820e-common.dtsi中添加pwm部分的sprd_backlight内容:

 adf: sprd-adf {compatible = "sprd-adf";status = "okay";sprd,display-mode = <3>;sprd,dispc = <&swdispc>;};sprd_backlight {compatible = "pwm-backlight";pwms = <&pwms 0 20000>;pwm-names = "backlight";brightness_max = <256>;brightness-levels = <6   6   6   66   6   6   6   6   6   6   7   8   910  11  12  13  14  15  16  17  18  1920  21  22  23  24  25  26  27  28  2930  31  32  33  34  35  36  37  38  3940  41  42  43  44  45  46  47  48  4950  51  52  53  54  55  56  57  58  5960  61  62  63  64  65  66  67  68  6970  71  72  73  74  75  76  77  78  7980  81  82  83  84  85  86  87  88  8990  91  92  93  94  95  96  97  98  99100 101 102 103 104 105 106 107 108 109110 111 112 113 114 115 116 117 118 119120 121 122 123 124 125 126 127 128 129130 131 132 133 134 135 136 137 138 139140 141 142 143 144 145 146 147 148 149150 151 152 153 154 155 156 157 158 159160 161 162 163 164 165 166 167 168 169170 171 172 173 174 175 176 177 178 179180 181 182 183 184 185 186 187 188 189190 191 192 193 194 195 196 197 198 199200 201 202 203 204 205 206 207 208 209210 211 212 213 214 215 216 217 218 219220 221 222 223 224 225 226 227 228 229230 231 232 233 234 235 236 237 238 239240 241 242 243 244 245 246 247 248 249250 251>;default-brightness-level = <25>;};

这样就开始编译了,下载,看下背光显示是否正常。结果发现adb shell的背光节点/sys/class/backligth下面是空的,正常来说这下面应当有一个sprd_backlight的文件夹,为何没有这个文件夹出来呢?

应当是加载sprd_backlight的相关驱动时出错了,看log,果然是有一句sprd_backlight supply power not found, using dummy regulator提示,找到这个提示是

kernel\drivers\video\backlight\pwm_bl.c 函数的pwm_backlight_probe失败了打印出来的,所以干脆一并增加一些打印在这个函数,以确定代码究竟跑到哪里出了问题,加打印用printk,如下

 printk("pwm_backlight_probe 000\n");pb->power_supply = devm_regulator_get(&pdev->dev, "power");if (IS_ERR(pb->power_supply)) {ret = PTR_ERR(pb->power_supply);goto err_alloc;}printk("pwm_backlight_probe 111\n");pb->pwm = devm_pwm_get(&pdev->dev, NULL);if (IS_ERR(pb->pwm) && PTR_ERR(pb->pwm) != -EPROBE_DEFER&& !pdev->dev.of_node) {dev_err(&pdev->dev, "unable to request PWM, trying legacy API\n");pb->legacy = true;pb->pwm = pwm_request(data->pwm_id, "pwm-backlight");}printk("pwm_backlight_probe 222\n");if (IS_ERR(pb->pwm)) {ret = PTR_ERR(pb->pwm);printk("123 ret=%d\n",ret);if (ret != -EPROBE_DEFER){printk("pwm probe error\n");dev_err(&pdev->dev, "unable to request PWM\n");}goto err_alloc;}dev_dbg(&pdev->dev, "got pwm for backlight\n");printk("pwm_backlight_probe 333\n");

然后编译,下载,打log:

[    2.413831] c0 pwm_backlight_probe enter
[    2.417717] c0 pwm_backlight_probe 000
[    2.421418] c0 sprd_backlight supply power not found, using dummy regulator
[    2.428262] c0 pwm_backlight_probe 111
[    2.432066] c0 pwm_backlight_probe 222
[    2.435771] c0 123 ret=-517

看到了,是获取pwm的时候失败了,返回负值,并且本次log中一次开机有很多次打印上面的信息内容 ,下面加的打印 “pwm_backlight_probe 333”从没打印出来。

在kernel\include\linux\error.h 中

#define EPROBE_DEFER 517 /* Driver requests probe retry */

这导致下面的内容不会跑进去,而是继续进行retry的动作

        if (ret != -EPROBE_DEFER){printk("pwm probe error\n");dev_err(&pdev->dev, "unable to request PWM\n");}goto err_alloc;}

而sprd_backlight supply power not found, using dummy regulator的提示仅是提示,而不是错误的根本原因,可不理会这个提示。

接下来要想办法 解决pwm获取失败的原因。

在dtsi中有pwms = <&pwms 0 20000>;一句,说明该驱动是访问了一个外接的pwms节点,我们的切入点就是这里。通过 grep命令,可查找到当前工程的这个定义是在sharkle.dtsi,内容如下:

         pwms: pwm@40260020 {#pwm-cells = <2>;compatible = "sprd,pwm-r3p0";reg = <0x40260020 0x10000>;status = "disabled";};

注意看下这里的status是disabled,意味着dts中若没有其它地方覆写成status = "okay";,则与这个dts的compatible相匹配的文件不会被probe。果然,默认是没有在其它地方有覆写这行语句的,它对应的文件通过grep “sprd,pwm-r3p0” ./kernel/driver -nr来看,是在kernel\drivers\pwm\pwm-sprd.c中,并在该文件的sprd_pwm_probe函数的进入和成功附近各增加一条printk语句,以在串口log中查看是否执行成功。并在sp9820e-common.dtsi中增加打开pwms的覆写使能:

&battery {charger-det-gpios = <&pmic_eic 0 0>;battery-det-gpios = <&pmic_eic 9 0>;io-channels = <&pmic_adc 1>,<&pmic_adc 10>,<&pmic_adc 36>,<&pmic_adc 16>;io-channel-names = "adc_temp","adc_vbat","adc_vchg","adc_isense";status = "okay";
};/*add this node*/
&pwms {status = "okay";};&spi1 {

kernel\drivers\pwm\pwm-sprd.c

static int sprd_pwm_probe(struct platform_device *pdev)
{struct sprd_pwm_chip *pc;struct resource *r;struct clk *clk_parent;const struct of_device_id *of_id;int ret;pr_debug("%s:enter\n", __func__);printk("sprd_pwm_probe\n");of_id = of_match_node(sprd_pwm_matches, pdev->dev.of_node);if (of_id)sprd_core_ops = (struct pwm_core_ops *)of_id->data;elsepr_err("%s: Not found match of_id\n", __func__);pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL);if (!pc){printk("sprd_pwm_probe 000 -%d\n",ENOMEM);return -ENOMEM;}r = platform_get_resource(pdev, IORESOURCE_MEM, 0);pc->mmio_base = devm_ioremap_resource(&pdev->dev, r);if (IS_ERR(pc->mmio_base)){printk("sprd_pwm_probe 111 %d\n",(int)PTR_ERR(pc->mmio_base));return PTR_ERR(pc->mmio_base);}clk_parent = devm_clk_get(&pdev->dev, PWM_CLK_PARENT);if (IS_ERR(clk_parent)){printk("sprd_pwm_probe 22 %d\n",(int)PTR_ERR(clk_parent));return PTR_ERR(clk_parent);}pc->clk = devm_clk_get(&pdev->dev, PWM_CLK);if (IS_ERR(pc->clk)){printk("sprd_pwm_probe 33 %d\n",(int)PTR_ERR(pc->clk));return PTR_ERR(pc->clk);}

编译,下载,打log:

发现:发现它又在

sprd_pwm_probe 22 -2

这里报错返回了,

应该是clk部分缺少组件。查看其它代码包的pwms: pwm的内容写法,本代码包里的写法少了两行,sharkle.dtsi中如下红色的是新加入的:

pwms: pwm@40260020 {#pwm-cells = <2>;compatible = "sprd,pwm";reg = <0x40260020 0x10000>;clock-names = "sprd_pwm_clk_parent", "clk_pwm";clocks = <&ext_26m>, <&clk_pwm2>;status = "okay";};

增加的是如下两行:

clock-names = "sprd_pwm_clk_parent", "clk_pwm";
                clocks = <&ext_26m>, <&clk_pwm2>;

编译,下载,打log:

到这里,终于看到sprd_pwm_probe成功了:

[    1.903788] c0 sprd_pwm_probe

[    1.903979] c0 sprd_pwm_probe success

接下来就看到

[    1.908574] c0 pwm_backlight_probe enter

[    1.908618] c0 pwm_backlight_probe 000

[    1.908638] c0 sprd_backlight supply power not found, using dummy regulator

[    1.908671] c0 pwm_backlight_probe 111

[    1.908683] c0 pwm_backlight_probe 222

[    1.908684] c0 pwm_backlight_probe 333

[    1.908793] c0 pwm_backlight_probe sprd_backlight

[    1.908796] c0 backlight: pwm_bl: brightness = 25

这些sprd_backlight部分的手动加来debug的调试log全都顺利跑出来了,进入adb shell查看,终于出现了

/sys/class/backlight/sprd_backlight

的文件夹。至此,调试背光调试功能正常。

好事多磨。

原创不易,请多支持。

展锐智能机平台sc9820e调试pwm背光所遇问题小结相关推荐

  1. 芯片与android关系,紫光展锐芯片平台实现与安卓11同步意味着什么

    最近几天,大家都被苹果的新品发布会消息所吸引,其实除了苹果,谷歌也有大动作,其于9月9日凌晨放出了Android 11稳定版,作为目前智能手机市场份额最高的操作系统,Android的升级对于用户的影响 ...

  2. 展锐V516平台荣获“中国芯”优秀技术创新产品奖

    2021年12月20日,在珠海举行的2021第十六届"中国芯"集成电路产业促进大会上,展锐凭借全球首款5G R16 Ready基带芯片平台--唐古拉V516, 荣获2021&quo ...

  3. 紫光展锐驱动之sensorhub调试

    第一章 平台及硬件信息简介 本文档基于ums312(T310),Android 11,sensorhub架构,sensor的硬件接口为i2c1(该平台目前不支持spi) 第二章 紫光展锐的移植文档 第 ...

  4. 【Quectel移远展锐平台5G模组RX500U/RG200U使用指南(一)】

    概述 移远的展锐平台5G模组是基于展锐udx710平台开发的5G模组,在华为被禁,MH5000-31无法继续使用后,这个成了国产5G模组的独苗了. 目前移远出了多款展锐的5G模组,RG500U-CN, ...

  5. 展锐平台的温控策略介绍

    这里以UDX710为例介绍下展锐平台的温控策略,展锐其他平台也类似. 1. UDX710芯片内部有6颗 Thermal sensor,相关位置信息如表 1-1. 2. 温度读取: 在控制台下通过 ca ...

  6. 展锐平台 Android 10.0 OTA升级开机Logo

    通过OTA升级更换开机logo图片 展锐部分平台的logo是放在pac包的时候才去更新的.所以只有线刷pac包,才能更新logo,如果我们需要在OTA升级包含开机logo则需要单独修改,以sl8541 ...

  7. 打造人民的5G:展锐第二代5G芯片平台实现客户产品量产

    12月27日,展锐举办"人民的5G"线上发布会,携手中国电信.中兴通讯.海信.台积电.GSMA等产业生态伙伴,共同见证展锐第二代5G芯片平台唐古拉T770.唐古拉T760实现客户产 ...

  8. 展锐平台 取消蓝牙配对码弹框

    文档说明 适用于 展锐8541E平台 Android 10 代码 取消蓝牙配对码弹框,实现蓝牙自配对 修改方法 /packages/apps/Settings下 diff --git a/src/co ...

  9. 紫光展锐:大破大立 做数字世界的生态承载者

    4月20日,以"构go"为主题的2021紫光展锐创见未来大会在线上举行.会上,展锐重磅发布了5G业务新品牌--唐古拉系列,推出了Cat.1bis新技术特性,并分享了创新业务AR领域 ...

最新文章

  1. SQLSERVER常用函数汇总
  2. Codeforces Round #499 (Div. 2) Problem-A-Stages(水题纠错)
  3. c语言通讯录项目(电话簿)
  4. C++ 外部函数通过指针修改类成员的值
  5. 计算机控制系统为什么会受到干扰,浅谈计算机控制系统中的干扰及其抑制措施...
  6. mysql 查看表v空间自增涨_mysql文件结构及InnoDB引擎表空间整理
  7. 苹果13系统锁屏延迟_iPhone 11 锁屏出现延迟是怎么回事?
  8. qcalendarwidget只显示月_万家基金旗下26只产品规模迷你 万家精选重仓地产股年内收益排名靠后丨基金...
  9. php td复制剪贴板,选择一个带有Javascript的完整表格(复制到剪贴板)
  10. Centos7下Yum安装PHP5.5,5.6,7.0
  11. 《校园封神榜》个人工作总结——第十天
  12. 想学python买什么书好-看了许多python书后!我发现学好python这三本书必看
  13. 拓端tecdat|R语言k-Shape时间序列聚类方法对股票价格时间序列聚类
  14. 《Android UI基础教程》——1.4节工具
  15. 【转载】smobiler说明
  16. 高中英语单词名词分类
  17. cad怎么把图层英文变成中文_cad图层英文
  18. android 设置路由器,192.168.1.1路由器设置手机登陆
  19. 【算法】h0145. 会议安排(贪心算法)
  20. linux下的文件系统,Linux系统中常见的文件系统有哪些?

热门文章

  1. SQL语句中的嵌套子查询
  2. C# 读取处理超大TXT文本文件
  3. 室内监控与室外监控有什么区别 如何选择合适的监控摄像机
  4. 将ACII码转为浮点数
  5. WRKY转录因子通过促进GhMKK2介导的类黄酮生物合成调节棉花对尖孢镰刀菌的抗性
  6. 默认选中 input元素默认选中设置
  7. 护眼灯色温和显色指数哪个重要?台灯显色和色温的关系是什么
  8. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)
  9. 入门系列之改进小波阈值降噪
  10. ios打包证书申请流程