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 ...
QT5鼠标触摸屏键盘支持
QT5从QWS换成了QPA,对应应用程序添加鼠标、触摸屏、键盘的支持:
./xxx -plugin evdevtouch:/dev/input/eventX -plugin evdevkeyboard:/dev/input/eventX -plugin evdevmouse:/dev/input/eventX
也可以通过export环境变量(QT_QPA_GENERIC_PLUGINS)指定。
如果是自己交叉编译的QT源码,编译的时候也要记得加上-mtdev -evdev.-mtdev为多点触摸,-evdev用于鼠标键盘
扩展:
Input输入设备调试相关
Input输入设备调试相关
mice、mouse和event设备:在/dev/input/下面主要有mice、mouse和event这3类设备。mice为所有鼠标节点,可以得到所有鼠标的信息,而且是全局唯一且固定的,即使没有插入鼠标设备,它也是存在的
Input设备调试
查看所有的input设备及相关信息,包括Input Handlers、Name等:cat /proc/bus/input/devices
input event事件分析工具:evtest和getevent(android中提取)
使用hexdump直接查看命令:
cat /dev/input/eventX | hexdump
输出类似于:
//hexdump序列号 秒 微妙 type事件 Code Value
0000000 692c 5e67 20ae 000a 0002 0000 0003 0000
0000010 692c 5e67 20ae 000a 0000 0000 ...
Linux监控文件及目录变动
inotify-tools工具
Inotify一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作等inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数
Ubuntu下安装sudo apt-get install inotify-tools
例子#!/bin/bash
cd `dirname $0`
rebuild() {
local build_lock="build.lock"
local pending_lock="pending.lock"
test -f $build_lock && ...
Hisi外设ADC的使用
环境
Platform: Hi3516DV100
Kernel: v3.4
参考代码主要通过操作寄存器
himm (LSADC_CTRL0,0xff5264ff); //配置0寄存器 0x200B0000
himm (LSADC_CTRL2,0x2f); //0x200B0008
himm (LSADC_CTRL4,0x01); //0x200B0010
while(enable)
{
himm (LSADC_CTRL7,0x0f); //0x200B001C
data= readl(LSADC_CTRL3); //0x200B000C
data = (data >> 16);
read_adc_data = data;
himm (LSADC_CTRL6,0x1); //0x200B0018
msleep(100);
}
Hisi内核线程CPU占用高的问题
环境
Platform: Hi3516DV100
Kernel: v3.4
现象内核线程kworker/u:0开机时CPU占用率高
分析查看哪个模块占用CPU:cat /proc/5/stack
原因
占用大量CPU的时候是内核中对mmc模块使用4000~1000的不同频率对插入的模块分别用sd、mmc、sdio类型匹配枚举的过程。SDIO_CAERD_DETECT而悬空或者未接的时候,这个管脚默认是个低电平,而插入SD时该管脚的状态正是低电平,
解决
内核去掉不用的MMC驱动
软件上对不使用的SDIO_CAERD_DETECT复用成其他功能,要么硬件上对该管脚做好弱上拉