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复用成其他功能,要么硬件上对该管脚做好弱上拉
Hisi网络接口修改成RMII
环境
Platform: Hi3516DV100
Kernel: v3.4
步骤
修改配置表在生成reg_info的excel表中修改:0x200f0174 2,
修改Uboot修改配置文件hi3516a.h:#define CONFIG_HIGMAC_PHY1_INTERFACE_MODE 2 值修改为1.或者mdio_intf=rmii(#define CONFIG_MDIO_INTF "rmii")
修改Kernel通过menuconfig 配置: Device Drivers
[*] Network device support --->
[*] Ethernet driver support --->
<*> hieth gmac family network device support --->
(6) hieth-gmac phy0 interface mode
#其中, 1 代表 mii, 5 代表 rmii, 6 代表 rgmii,若管脚复用有变化,请重新配置管脚复用关系。
扩展:识别phy ...
Hisi编译与烧写
环境
Platform: Hi3516DV100
Kernel: v3.4
内存DDR(256M)地址空间:
150M
106M
OS
MMZ
0x80000000
0x84000000
0xA0000000
# Memory managed by OS.
# Memory managed by MMZ block anonymous.
# Memory managed by MMZ block jpeg.
注意:
启动参数,“setenv bootargs ‘mem=150M …”
load3516d脚本
编译具体细节可参考SDK里面的文档
u-boot:
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- hi3516a_spinand_config (other: hi3516a_config)
~/dd/Hi3516A_SDK_V1.0.5.0/osdrv/opensource/uboot/u-boot-2010.06$ make ARCH=arm CROSS_COMPILE=arm-his ...