RK3399-WIFI&BT模块
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
这里主要调试的是AP6236、AP6256,SDIO接口
检查硬件:电源: VDDIO,VBAT时钟:LPO(32.768K) , AXTAL(26M)
检查WL_REG_ON引脚,不能下拉到地检查WIFI_WAKE_HOST引脚,信号与电平
检查SDIO相关信号sdio3.0 VDDIO->1.8V检查SDIO SDIO_CLK、 SDIO_CMD电平及波形测量 VDDIO sdio_clk、 sdio_cmd、 sdio_data0~sdio_data3 的电压;正常情况下 sdio_clk 为 0V,sdio其他五根线与vddio电压一致sdio_clk clk绝对不要加外部上拉,它内部为开漏
硬件OK就能够扫描到模块硬件, 在sys/bus/sdio/devices查看到相应设备,VID和PID也可以在这里找到
添加固件
WIFI路径:./external/wlan_loader/firmware/添加配置nvram_ap6236.txt添加固件fir ...
RK3399-HDMI音频
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
主要针对HDMI-OUT, HDMI-IN这里不做讨论
内核HDMI声卡驱动HDMI相关的声卡驱动官方已支持,只需修改DTS配置:dts:
hdmi_sound: hdmi-sound {
status = "disabled";
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,name = "rockchip,hdmi";
simple-audio-card,cpu {
sound-dai = <&i2s2>;
};
simple-audio-card,codec ...
Anroid系统默认设置修改
首先要确认是否有默认值:在reboot(重启)之后开关状态仍旧保存或者是在reset(恢复出厂设置)之后开关状态恢复到默认的,才能找到默认值
/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java:该文件中对状态值进行存储
/frameworks/base/packages/SettingsProvider/res/values/defaults.xml:定义了开关状态的默认值
/frameworks/base/core/java/android/provider/Settings.java:定义了各开关状态默认值存储时对应的key
关闭所有系统提示音frameworks/base/packages/SettingsProvider/res/values/defaults.xml:
<integer name="def_lockscreen_sounds_enabled">0</integer>
<!-- Defaul ...
插入无线鼠标Android应用重启问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题在运行我们自己的APK时,插入某些USB的无线鼠标,APK会“重启”,重新走一次生命周期。
分析与解决开始觉得很奇怪,为啥有的鼠标可以有的却不行,还以为是牌子问题。。。后面发现插入有问题的USB无线收发器,会生成2个设备,一个鼠标和一个键盘。没错,这是键鼠套装一体的无线收发器,正是这个键盘导致出现了现在的这个现象,而有些无线鼠标的无线收发器不是键鼠套装,所有只会有1个鼠标设备,所以插上去没有问题。
在Activity中,如果不设置android:configChanges属性,当相应属性发生改变时,APK会重新调用执行各个生命周期所以解决办法就是设置configChanges:在APK工程的AndroidManifest.xml中配置configChanges,具体是在<activity>中添加android:configChanges
android:configChanges="keyboard|keyboardHidden"
但配置完configCh ...
PyQT环境搭建
环境
Win10 X64
安装
安装Python3,并确认添加到环境变量可直接在python下载对应的安装包进行安装
安装PyQt,使用pip pip install PyQt5
pip install PyQt5-tools
使用清华大学的镜像源,提高访问下载速度:
pypi 镜像每 5 分钟同步一次。
临时使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
注意,simple 不能少, 是 https 而不是 http
设为默认升级 pip 到最新的版本 (>=10.0.0) 后进行配置:
pip install pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
如果您到 pip 默认源的网络连接较差,临时使用本镜像站来升级 pip:
pip install -i https://pypi ...
Android设置系统时间问题
背景及问题
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
在新的产品开发中,需要设置系统时间。发现使用老产品中的那一套报错,无法用date命令去设置,使用的代码及报错如下:
String.format("date -s %04d%02d%02d.%02d%02d%02d", year, month, day, hour, min, sec);
date: Unknown option s
解决及扩展
后面发现在Android shell里面的date命令没有-s选项。使用help查看:
usage: date [-u] [-r FILE] [-d DATE] [+DISPLAY_FORMAT] [-D SET_FORMAT] [SET]
Set/get the current date/time. With no SET shows the current date.
Default SET format is "MMDDhhmm[[CC]YY][.ss]", that's ...
SVN上传SO库文件问题
问题及解决
OS: Ubuntu16.04 X64
在Ubuntu中,上传项目开发相关的工程到SVN版本库,发现所有的.so、.a的库文件都上传不上去,应该是ignore的问题
方法一(已验证成功):安装SVN成功后,会在用户目录下会生成.subversion的隐藏文件夹,里面的config即为SVN的配置文件。打开config文件,搜索global-ignores 字段,默认时注释掉的,表示后面的就是默认值去掉注释,把要排除过滤的类型去掉,即*.so *.a *.so.[0-9]*等
方法二每次使用SVN时,添加ignore选项--no-ignore 文件夹
或者递归目录下所有文件, --no-ignore --force
Android之init.rc语法
介绍
介绍init.rc,就要从init说起。init是Android的Linux内核启动的第一个进程,它的PID永远是1,并且该进程不会死亡,一旦死亡内核就崩溃了。init进程启动后会fork出很多重要的系统进程,比如zygote进程。而init.rc差不多就是这个init进程的配置文件,主要来规定init进程的行为和动作。
语法一个完整的init.rc 脚本由4中类型声明组成。即:
Action(动作)
Commands(命令)
Services(服务)
Options(选项)
Action 和Services 表明一个新语句的开始,这两个关键字后面跟着的Commands 或者 Options 都是属于这个语句;Action 和Services 都有唯一的名字,如果出现动作或者服务重名,则会被当做错误处理。
Action(动作)语法格式:
on <trigger> ##触发条件
<command1> ##执行命令
<command2> ##可以同时执行多个命令
<command3>
当& ...
RK3399的HDMI双屏异显的有关问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题及原因分析项目中,我们使用Presentation开发了双屏异显功能。
不稳定问题
在测试中,发现开机上电HDMI有时候有显示,有时候又没有,有时候甚至会一闪一闪的后面发现是硬件HPD脚不稳定,导致HDMI显示时好时坏。HPD为高时,主控才会通过DDC去读EDID。异显内容覆盖问题
要显示在HDMI上的异显内容,覆盖显示在了本地的MIPI屏上,非必现。代码中,我们先调用了DisplayManager的getDisplays()获取屏幕的数量,只有2个才会调用Presentation去呈现异显内容。但因为上面的原因导致屏幕数量获取错误,从而出现了这个问题。后面我们改用使用广播监听的方式去检测HDMI的热插拔状态,而且硬件也修改,但获取的屏幕数量还是不对,最后我们使用DisplayManager.DisplayListener的onDisplayAdded和onDisplayRemoved来监听屏幕的变化,监听到变化之后再调用getDisplays()方法来获取准确的屏幕信息, ...
Alsa或TinyAlsa添加控制接口
背景
Platform: RK3399
Kernel: v4.4.10
项目需要添加一个控制外部电路Mute的接口,主要是控制一个GPIO
过程DTS配置添加GPIO配置类似:
amp-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>;
...
&pinctrl {
...
xxx_gpios: xxx-gpios {
rockchip,pins = <3 16 RK_FUNC_GPIO &pcfg_pull_none>,
<1 17 RK_FUNC_GPIO &pcfg_pull_none>;
}
...
}
驱动源码添加
在驱动probe函数中获取gpio相关信息: xxx->amp_gpio = of_get_named_gpio(np, "amp-gpios", 0); if (gpio_is_valid(xxx->amp_gpio)) {
ret = devm_g ...
Android串口通信
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
内核及系统配置正常流程RK3399的串口采用的是8250通用驱动.
确定DTS里面已经okey,dev下设备节点是否存在
确认设备节点权限:文件(./device/rockchip/common/ueventd.rockchip.rc): /dev/ttyS4 0666 system system
Selinux问题(未验证,开启Selinux后需注意):
在device/rockchip/rk3399/xxx/sepolicy/目录下,添加untrusted_app.te; allow untrusted_app serial_device:chr_file {read open ioctl getattr create write};
在device.mk和system_server.te添加并编译权限; +BOARD_SEPOLICY_DIRS += \
+ device/ ...
使用NDK编译原生库或可执行应用程序
背景
Android Studio: 3.6.1
Win10 X64
项目需要编译JNI原生库接口
步骤安装配置NDK
使用SDK Manager下载安装NDK在Android Studio打开Setting->Android SDK->SDK Tools,勾选NDK和LLDB,点击应用,开始下载安装,完成之后会在SDK的目录下看到ndk和lldb两个文件夹
添加ndk的路径到环境变量
编译
参考现有的JNI工程新建一个源码目录jni
新建或修改jni目录中的Android.mk,Application.mk文件 Application.mk文件参考: # "armeabi-v7a" , "x86" , "arm64-v8a" , "x86_64" , "all"
#APP_ABI := all
APP_ABI := armeabi-v7a arm64-v8a
# Workaround for MIPS toolchain linker bein ...