UVC之MJPEG流
背景
Platform: IMX6Q
OS: Linux-QT5
Kernel: 4.1.15
问题因项目需要,以前产品(IMX6Q,QT),客户觉得摄像头(OV5640)的效果不行,但以前的硬件的摄像头接口只支持DVP,现在很难找得到匹配的摄像头,且如果换摄像头,驱动调试等周期太长,所以打算使用USB摄像头。去深圳华强那边搜罗了一圈,找到了几个需要评估调试。大致参数:
1. YUYV(YUV 4:2:2 (YUYV))
discrete: 640x480: 1/30 1/25 1/20 1/15 1/10 1/5
discrete: 160x120: 1/30 1/25 1/20 1/15 1/10 1/5
discrete: 320x240: 1/30 1/25 1/20 1/15 1/10 1/5
discrete: 352x288: 1/ ...
GPIO控制问题
背景
Platform: IMX6
OS: Linux
Kernel: v4.1.35
问题用GPIO去控制一个外扩板的复位引脚,开始直接在用户态使用export去控制GPIO,但Kernel起来时的默认状态没法控制,Uboot是高电平,但到Kernel起来变成低电平,需修改进Kernel的默认电平
分析与解决改用leds-gpio的方式去控制。dts类似如下:
leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_leds>;
reset-ctl {
gpios = <&gpio4 30 0>;
label = "reset_ctl";
default-state = "on";
...
Hexo管理博客文章
需求博客文章渐渐多了,为了方便整理文章
方案可以使用以下方案之一,也可以结合使用,VS Code集成有控制台,Hexo-Admin方便新建,实时预览效果
使用Visual Studio Code将Hexo整个目录导入到Visual Studio Code不仅方便整理文章,也方便自定义修改主题文件,及配置文件
使用Hexo-Admin插件
安装插件npm install —save hexo-admin
启动Hexo本地服务器hexo server -d
访问Admin管理页浏览器访问http://localhost:4000/admin可修改编辑文章,设置管理的账号,密码等,要发布还需做下面的设置
设置deploy调用脚本
注: 以Windows为例,Linux类似 4.1. 编辑Hexo配置文件_config.yml,在后面追加: admin:
deployCommand: 'hexo-pubish.bat' 4.2. 在配置文件同级目录新建hexo-pubish.bat文件,内容如下: hexo g -d
Shell实现菜单选择
需求命令太长,参数难得记,每次难得敲
方案主要有以下2种方法,都已验证
read 和 case 实现function menu ()
{
cat << EOF
----------------------------------------
|********* Product Model Menu **********|
----------------------------------------
`echo -e "\033[35m 1)NAS8531(default)\033[0m"`
`echo -e "\033[35m 2)NAS8533\033[0m"`
`echo -e "\033[35m 3)Menu\033[0m"`
`echo -e "\033[35m 4)Quit\033[0m"`
EOF
read -p "Please select product model:" input
case $input in
1)
PRODUCT_MODEL=8531
;;
2)
PRODUCT_MODEL=8533
;;
3)
c ...
RK3399添加Android新的产品
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
需求RK3399添加Android新的产品,来区别多个项目产品
解决Uboot添加如果Uboot配置或驱动有差异,可以考虑兼顾所有的,或者每种产品单独再对应一个defconfig
内核添加新建一个项目产品对应的dts,可参考已有的产品如果内核驱动配置有差异,可以考虑兼顾所有的,或者每种产品单独再对应一个defconfig
Android添加产品命令规则: Box 产品名中需带有“box”字样
新增文件夹device/rockchip/rk3399/rk3399_box_xxx, 基于 rk3399_box.mk 创建rk3399_box_xxx.mk,将 rk3399_box 目录下的所有文件拷贝至 rk3399_box_xxx 目录下,或者参考自己已有的一个产品 cd device/rockchip/rk3399
mkdir rk3399_box_xxx
cp rk3399_box.mk ./rk3399_box_xxx.mk
cp rk3399_box/* rk33 ...
Android 7.1 去掉桌面上的谷歌搜索框
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
需求去掉桌面上的谷歌搜索框
解决diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 3b5cd02..7e20bf8 100755
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1315,6 +1315,7 @@ public class Launcher extends Activity
mWorkspace = (Workspace) mDragLayer.findViewById(R.id.workspace);
mQsbContainer = mDragLayer.findViewById(mDeviceProfile.isVerticalBa ...
POE双网口问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
Switch Phy: ksz8463
问题单独用POE供电,网络不通
分析双网口设计:一个为”进”(机器默认绑定的active Phy),一个为”出”。硬件设计:设计在”出”的网口上。POE要设计在”进”的网口上,机器的网络才能正常,所以需要硬件交换POE的设计,或者软件交换机器的active Phy追踪代码:drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c文件中的stmmac_mdio_register函数:默认bind到MAC的phy(plat->phy_addr)是最先找到的phy,伪代码:
for(addr = 0; addr < PHY_MAX_ADDR; addr++) {
struct phy_device *phydev = new_bus->phy_map[addr];
if(phydev) {
//....
...
Android音频系统的Standby模式问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题:当使用MediaPlayer停止本地播放后,如果切换我们自定义的音频通道(线路输入,只有模拟通道,数字通道没有工作),开始正常但隔几秒钟后就会没声音输出
原因分析Android系统默认播放停止后3秒(默认)会进入Standby模式来降低功耗。这个主要是通过AudioFlinger控制的,当AudioFlinger检测到没有AudioTrack处于活动状态,且达到standbyTime的延时时间就会进入Standby模式,系统系统会进入待机,关闭所有的输出设备,Standby模式后具体的一些操作可在tinyalsa HAL层standby调用接口里找到
解决1. 禁止Standbytinyalsa HAL层有standby调用接口(out->stream.common.standby = out_standby),开始打算直接屏蔽掉,但发现里面有route_pcm_close等其他操作,而且有很多地方有调用,可能会引起系统其他问题,所以就采用了下面的方法2. 延长St ...
SDIO WiFi问题排查
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题:Android系统没法打开wifi,10几台机器,有1,2台可以,其他要么一直不行,要么时好时坏,不稳定。log打印,SDIO传输下载wifi固件失败:
[ 32.446909] sdioh_buffer_tofrom_bus: TX FAILED ffffffc07aac3000, addr=0x0c000,pkt_len=2048, ERR=-84[ 32.446937] dhdsdio_membytes: membytes transfer failed[ 32.448113] dwmmc_rockchip fe310000.dwmmc: All phases bad![ 32.448167] mmc1: tuning execution failed[ 32.448195] bcmsdh_sdmmc: Failed to Write byte F1:@0x1000a=00, Err: -5
原因配置的SDIO的时钟太高,硬件PCB设计不 ...
Android添加物理按键
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
调试
通过命令cat /proc/bus/input/devices 确认按键使用的键值对的文件名 通过“name”字段判断。
getevent可以查看上报的键值和状态
添加android已有的功能按键当新增的按键功能是android系统默认自带的,需要在frameworks/base/data/keyboards/Generic.kl 中找到你需要的按键键值然后在对应的dts中添加对应的按键映射就可以了。需确保使用的键值对的文件device/rockchip/common/rk29-keypad.kl里也有该键值对
添加自定义按键具体可以参考某个已有的按键,在同一位置添加自定义按键
在device/rockchip/common/rk29-keypad.kl 中添加按键的键值对。驱动上报的键值。
frameworks/native/include/android/keycodes.h 和frameworks/native/include/input/InputEventL ...
IMX6Q-Linux(QT)双屏同显
背景
Platform: IMX6Q
OS: Linux-QT5
Kernel: 4.1.15
需求因项目需求,需要在imx6Q-Linux(QT)上实现双屏同显(LVDS+HDMI)QT:5.8LVDS(1280*800)HDMI(此方法只支持1280*720,因为LVDS屏为1280*800,所以做720P不需要进行缩放或拉伸)
方法
修改DTS的HDMI对应的fb的配置mode_str ="1280x720M@60";
修改fb的驱动(drivers/video/fbdev/mxc/mxc_ipuv3_fb.c)://mxcfb_set_par函数, 处理mxcfb_unmap_video_memory:
if(strcmp("DISP3 BG", fbi->fix.id) == 0){
for (i = 0; i < num_registered_fb; i++) {
if(strcmp("DISP4 BG", registere ...
Android内嵌web服务器
背景因项目需求,需要在Android(7.1.2)中内嵌web服务器(lighttpd+PHP环境)硬件平台: RK3399
方案选择
通过现成的APK安装:https://zhuanlan.zhihu.com/p/34730760https://blog.csdn.net/Jye13/article/details/8987620?locationNum=4版本低,自由度低,自己不好把控
自己移植,复杂参考:android 自己移植编译lighttpd:http://blog.chinaunix.net/uid-14735472-id-5213247.html
内嵌Linux+chroot,通过buildroot构建,方便扩展,之前老项目用过,可行性高
先通过apk(Linux Deploy)安装Linux发行版,再编译安装Lighttpd + phphttp://www.webhek.com/post/instll-lighttpd-php-sqlite3-on-android-arm-linux.html需要手机root
最终选择用方案3, 采用buildroot+chroot ...