展锐智能机平台sc9820e调试pwm背光所遇问题小结
在展锐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背光所遇问题小结相关推荐
- 芯片与android关系,紫光展锐芯片平台实现与安卓11同步意味着什么
最近几天,大家都被苹果的新品发布会消息所吸引,其实除了苹果,谷歌也有大动作,其于9月9日凌晨放出了Android 11稳定版,作为目前智能手机市场份额最高的操作系统,Android的升级对于用户的影响 ...
- 展锐V516平台荣获“中国芯”优秀技术创新产品奖
2021年12月20日,在珠海举行的2021第十六届"中国芯"集成电路产业促进大会上,展锐凭借全球首款5G R16 Ready基带芯片平台--唐古拉V516, 荣获2021&quo ...
- 紫光展锐驱动之sensorhub调试
第一章 平台及硬件信息简介 本文档基于ums312(T310),Android 11,sensorhub架构,sensor的硬件接口为i2c1(该平台目前不支持spi) 第二章 紫光展锐的移植文档 第 ...
- 【Quectel移远展锐平台5G模组RX500U/RG200U使用指南(一)】
概述 移远的展锐平台5G模组是基于展锐udx710平台开发的5G模组,在华为被禁,MH5000-31无法继续使用后,这个成了国产5G模组的独苗了. 目前移远出了多款展锐的5G模组,RG500U-CN, ...
- 展锐平台的温控策略介绍
这里以UDX710为例介绍下展锐平台的温控策略,展锐其他平台也类似. 1. UDX710芯片内部有6颗 Thermal sensor,相关位置信息如表 1-1. 2. 温度读取: 在控制台下通过 ca ...
- 展锐平台 Android 10.0 OTA升级开机Logo
通过OTA升级更换开机logo图片 展锐部分平台的logo是放在pac包的时候才去更新的.所以只有线刷pac包,才能更新logo,如果我们需要在OTA升级包含开机logo则需要单独修改,以sl8541 ...
- 打造人民的5G:展锐第二代5G芯片平台实现客户产品量产
12月27日,展锐举办"人民的5G"线上发布会,携手中国电信.中兴通讯.海信.台积电.GSMA等产业生态伙伴,共同见证展锐第二代5G芯片平台唐古拉T770.唐古拉T760实现客户产 ...
- 展锐平台 取消蓝牙配对码弹框
文档说明 适用于 展锐8541E平台 Android 10 代码 取消蓝牙配对码弹框,实现蓝牙自配对 修改方法 /packages/apps/Settings下 diff --git a/src/co ...
- 紫光展锐:大破大立 做数字世界的生态承载者
4月20日,以"构go"为主题的2021紫光展锐创见未来大会在线上举行.会上,展锐重磅发布了5G业务新品牌--唐古拉系列,推出了Cat.1bis新技术特性,并分享了创新业务AR领域 ...
最新文章
- SQLSERVER常用函数汇总
- Codeforces Round #499 (Div. 2) Problem-A-Stages(水题纠错)
- c语言通讯录项目(电话簿)
- C++ 外部函数通过指针修改类成员的值
- 计算机控制系统为什么会受到干扰,浅谈计算机控制系统中的干扰及其抑制措施...
- mysql 查看表v空间自增涨_mysql文件结构及InnoDB引擎表空间整理
- 苹果13系统锁屏延迟_iPhone 11 锁屏出现延迟是怎么回事?
- qcalendarwidget只显示月_万家基金旗下26只产品规模迷你 万家精选重仓地产股年内收益排名靠后丨基金...
- php td复制剪贴板,选择一个带有Javascript的完整表格(复制到剪贴板)
- Centos7下Yum安装PHP5.5,5.6,7.0
- 《校园封神榜》个人工作总结——第十天
- 想学python买什么书好-看了许多python书后!我发现学好python这三本书必看
- 拓端tecdat|R语言k-Shape时间序列聚类方法对股票价格时间序列聚类
- 《Android UI基础教程》——1.4节工具
- 【转载】smobiler说明
- 高中英语单词名词分类
- cad怎么把图层英文变成中文_cad图层英文
- android 设置路由器,192.168.1.1路由器设置手机登陆
- 【算法】h0145. 会议安排(贪心算法)
- linux下的文件系统,Linux系统中常见的文件系统有哪些?