linux firmware相关
背景在bt、wifi、tp-touch、camera、vpu等驱动中会经常遇到firmware, firmware主要是其他外设控制器的运行程序或者配置;
一般有以下2种使用方式:
将fw data转化为特定的数组,编码在驱动代码中。会造成kernel镜像size变大, 有可能造成镜像超限, 导致kernel启动失败; 调试升级都不方便, 每次修改fw都需要重新编译内核
将fw打包到文件系统中,如vendor,system,lib/firmware等等,需要的时候从用户空间中load到kernel空间中,在驱动中应用比较广泛
以前在汇顶的TP-touch驱动中load配置2种方式都有使用,常用的最后一种,比较灵活;
使用主要API:
Synchronous:request_firmware
Asynchronous:request_firmware_nowait该接口不会导致进程睡眠,cannot be called in atomic contexts
使用流程:request_firmware -> memcpy -> release_firmware
requ ...
Android编译报错SSL error when connecting to the Jack server
背景换了个新机器,重新搭RK3399d的Android7.1的编译环境,编译报错:
Jack server already installed in "/home/xxx/.jack-server"
Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'
解决百度了很多都是说修改端口,改来改去还是不行。以前编译也没遇到过这个问题。
后面在参考的这篇博文中找到了答案。编译时用的是较新的open-jdk 8,默认禁用了TLSv1, TLSv1.1,以前编译用的是没有禁用的。
从/etc/java-8-openjdk/s ...
win10-已阻止你运行此应用处理
背景最近在win10上面安装不常用的一个串口驱动,弹出提示“管理员已阻止你运行此应用。有关详细信息,请与管理员联系”,导致始终无法安装以下解决方案在我电脑(Win10家庭版)上已验证通过
解决
打开组策略打开运行,可以使用开始菜单右键点击或直接快捷键win+R打开, 输入gpedit.msc,确定。 如果提示找不到,我的电脑就是。。。就跳到下一节《家庭版开启组策略》。
依次点击打开右侧计算机配置 ->Windows 设置-> 安全设置 -> 本地策略 -> 安全选项
在安全选项中,选择“用户账户控制:以管理员批准运行所有管理员”打开, 修改为已禁用,点击确认
重启电脑
家庭版开启组策略因为我的是win10家庭版,很多功能都阉割简化了。所以需要自行开启组策略功能
新建一个批处理文件,比如打开组策略.bat
编辑批处理文件,输入以下代码: @echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-Client ...
简单认识Meson
背景与介绍最近在弄某个包的时候,发现其编译构建用的是meson,以前没接触过,顺道“科普”了下,简单大体的认识。以前接触比较多的可能是autotools–autogen.sh,autoconf,automake
官网:https://mesonbuild.com/上面有详细的文档,手册,包括介绍,怎么获取等等它支持Linux, Windows and macOS等,适用于交叉编译由Python实现
一般将Meson和Ninja配合使用,Meson负责构建项目依赖关系,Ninja进行编译Ninja是一个轻量的构建系统,由Google推出,Android系统也是用它构建。
它与其他构建系统的区别主要在于两个方面:1. Ninja被设计成需要一个输入文件的形式,这个输入文件则由高级别的构建系统生成;2. Ninja被设计成尽可能快速执行构建的工具。
简单使用 meson 构建编译代码这里只是简单介绍,此前提是该源码是别人现成的,已配置好meson,只需要构建编译;如果是自己新建的工程,则需要配置工程的meson编译环境,具体的可参考官方文档,或下面的参考链接。
#安装
##安装pip3, ...
Ubuntu重置root密码
背景
Platform: X64
OS: Ubuntu20.04 Server
Kernel: v5.4
接手一个Debug任务,测试忘记了登陆密码,自己又懒得重装,所以就想着重置root密码
重置密码方式一(recovery模式) – 亲测OK
开机进grub
选择recovery模式
选择root (Drop to root shell prompt)
进命令行后重新挂载文件系统mount -rw -o remount
修改密码passwd root
重启reboot
方式二(修改启动参数)
开机进grub
按e进编辑模式
修改ro以及后面的内容为rw single init=/bin/bash 按F10或者ctrl + x保存已修改的配置
进入了单用户模式, 修改密码passwd xxx
重启reboot
关于进grub现在Ubuntu开机默认是不显示grub菜单的,所以需要配置进入grub。有些开机长按 shift 无效,要长按Esc,会进grub命令行在 grub 命令行窗口中使用 normal 回车, 回到开启界面后再按一次 Esc 成功的让界面停留在 g ...
Linux分区及格式化操作
相关操作#查看系统挂在磁盘状态
sudo fdisk -l
#查看U盘基本属性,包含分区格式
sudo fdisk -l /dev/sdb
#删除分区
sudo fdisk /dev/sdb
Command (m for help): p <- 输入p打印当前硬盘的分区信息
Command (m for help): d <- 输入d删除分区
Partition number (1-5): <- 输入要删除的分区编号
...
Command (m for help): w <- 分区删除完毕,输入w,写入磁盘分区表
#创建分区
sudo fdisk /dev/sdb
Command (m for help): n <- 新建分区
Command action <- 选择要创建的分区类型
e extended <- 扩展分区
p primary partition (1-4) <- 主分区
p <- 输入建立主分区
Par ...
Linux之V4L2视频输入
内核部分Linux系统中视频输入设备主要包括以下四个部分:
字符设备驱动:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间;
V4L2驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数;
平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册 video_device和 v4l2_dev;
具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册 v4l2_subdev。
V4L2框架v4L2的核心源码位于 drivers/media/v4l2-core,根据功能可以划分为四类:
字符设备模块:由 v4l2-dev.c实现,主要作用申请字符主设备号、注册class和提供video device注册注销等相关函数;
V4L2基础框架:由 v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c等文件构建V4L2基础框架;
videobuf管理:由 videobuf2-core.c、v ...
Linux网络驱动MDIO及Phy梳理
知识点
mdio子模块属于总线型驱动
NAPI(New API)网卡数据处理API,用于提高网络处理效率。NAPI是中断和轮询poll的结合,数据量低时采用中断,数据量高时采用轮询
通用phy驱动genphy。符合802.3,phy寄存器地址统一
流程梳理以RK3399(Android7.1.2)为例路径为: kernel/drivers/net/ethernet/stmicro/stmmac/
dts(“rockchip,rk3399-gmac”)->rk_gmac_probe(dwmac-rk.c),gmac时钟、电源等配置->stmmac_dvr_probe(stmmac_main.c)mac时钟使能、mac硬件初始化、net_device和NAPI绑定(netif_napi_add)、register_netdev()等等->stmmac_mdio_register->mdiobus_register->
mdiobus_register
mdiobus_scan
get_phy_device
get_phy_id
...
Linux之Input子系统
子系统框架@startmindmap
* Input
** 设备驱动层
*** 转化统一事件,上报输入核心(Input Core)
** Input Core
** 事件层
*** 和用户空间交互(/dev/input)
@endmindmap
驱动主要工作:
设备注册 //注册输入设备函数:
int input_register_device(struct input_dev *dev)
//注销输入设备函数:
void input_unregister_device(struct input_dev *dev)
初始化(事件支持): set_bit()//告诉input输入子系统支持哪些事件,哪些按键,例如:
/* 设置按键能产生哪类事件 */
set_bit(EV_KEY,buttons_dev->evbit);
/* 设置能产生这类操作的哪些事件 */
set_bit(KEY_ENTER,buttons_dev->keybit);
set_bit(KEY_LEFTSHIFT,buttons_dev->keybit);
/ ...
Linux音频驱动之Asoc框架
背景最近,把Linux的音频驱动梳理了下,以现在正在用的RK3399平台为基础。
ASoC(ALSA System on Chip)详细参考内核文档: kernel\documentation\sound\alsa\soc\Overview.txt
ASOC由来ALSA存在的问题:
Codec驱动与SOC中断CPU耦合严重,这将导致代码重复,一个Codec驱动每个cpu上会出现不同的版本,很难维护
当音频事件发生时(插拔耳机,音箱)没有标准的方法通知用户,尤其在移动端此事件非常常见
当播放/录制音频时,驱动会让整个codec处于上电状态,这样会在移动端非常浪费电量。同时也不支持改变采样频率/偏置电流来节约功耗
针对以上问题,提出了ASOC(ALSA System on Chip)来力争解决上述问题。解决方法如下:
Codec代码独立,不再与CPU耦合,这样可以增加Codec代码重复利用。
在Codec和Soc之间通过简单的I2S/PCM音频接口通信,这样SOC和Codec只需要注册自己相关的接口到ASOC Code即可。
动态的电源管理(Dynamic Audio ...
QT编译及运行相关
编译移植QT源码编译&运行Qt应用#编译Qt应用
qmake搜索路径qt.conf
qmake -project
qmake X.pro
make
#环境变量设置
export QT5_HOME=/opt/bin31v/qt5_8_0_lib
export QT_QPA_PLATFORM=eglfs
export QT_VIRTUALKEYBOARD_PINYIN_DICTIONARY=$QT5_HOME/virtualkeyboard/pinyin/dict_pinyin.dat
export LD_PRELOAD=$QT5_HOME/lib/preloadable_libiconv.so
#
export LD_LIBRARY_PATH=$QT5_HOME/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT5_HOME/plugins/
export QT_QPA_FONTDIR=/usr/share/fonts/
export QML2_IMPORT_PATH=$QT5_HOME/qml
expor ...
Android工程导入系统Jar包
背景有时候在开发APK时需要一些特殊权限的API或者hide的方法,比如打开WIFI热点等,可以调用通过系统源码编译出来的系统Jar包来解决
导入系统Jar包
将framework_all.jar添加进工程,一般为app/libs目录右击选择Add As Library,或在Project Structure中添加导入相关依赖,也可直接修改文件。
根目录下的build.gradle中设置
allprojects {
repositories {
jcenter()
google()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework_all.jar')
}
}
}
module下的build.gradle添加设置来更改引用库的优先级,优先 ...