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添加设置来更改引用库的优先级,优先 ...
Hexo便携套装制作
背景使用环境:Win10-X64可以放在U盘,无论是在家里还是公司,或者其他Win10的电脑上,能很方便地进行写作后续可能会支持Ubuntu
软件准备:
Nodejs
Git
portable VSCode
都下载Portable版本
配置环境新建一个主目录, 如PortableBlog目录结构
+ PortableBlog //主目录
Hexo //Hexo主文件夹
blog //博客文件夹
node_modules //
Tools //需要加到环境变量里的文件
Git //用来给VS Code,Hexo提供git
NodeJS //Hexo需要
VSCode //编辑器
安装配置Hexo在 PortableBlog\Hexo 文件夹里初始化 Hexo (如果没有安装 Hexo 组件,安装到这个文件夹里)或者将自己已经有的博客文件拷贝进来也行安装初始化要使用局部安装:
npm install he ...
Hexo相关
安装安装准备
Node.js (Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本)
Git
安装Hexo
全局安装: npm install -g hexo-cli
局部安装: npm install hexo
安装以后,可以使用以下两种方式执行 Hexo:
npx hexo <command>
将 Hexo 所在的目录下的 node_modules 添加到环境变量之中即可直接使用hexo <command>: echo 'PATH="$PATH:./node_modules/.bin"' >> ~/.profile
建站安装 Hexo 完成后,请执行下列命令,Hexo 将会在指定文件夹中新建所需要的文件。
$ hexo init <folder>
$ cd <folder>
$ npm install
新建完成后,指定文件夹的目录如下:
.
├── _config.yml
├── package.json
├── scaffolds
├── source
| ├── _drafts
| ...
Android监听UVC插拔
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
之前调试UVC,需监听UVC的插拔状态
处理以下方式已在Android7.1.2上验证
/*获取USB设备*/
private UsbDevice getUsbCameraDevice(Context context) {
UsbManager usbManager = (UsbManager)context.getSystemService(Context.USB_SERVICE);
for(UsbDevice usbDevice : usbManager.getDeviceList().values()) {
Log.i("camera","\n"+usbDevice.toString());
if (isUsbCamera(usbDevice)) {
return usbDevice;
}
}
return null; ...
Android进recovery模式后自动重启
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
产品偶发会进recovery模式,比如升级失败等,进recovery模式后,需要根据提示人为进行操作,但该产品应用场景无人值守,且维护比较麻烦(你懂的那种地方~),所以需要进recovery模式后需要自动重启。
修改
修改等待用户选择的超时时间10s:bootable/recovery/ui.cpp //zdd fix,20200915
//#define UI_WAIT_KEY_TIMEOUT_SEC 120
#define UI_WAIT_KEY_TIMEOUT_SEC 10
```
2. 将`get_menu_selection`代码中等待选项超时后,默认选择项改为0,直接返回
`bootable/recovery/recovery.cpp`
```cpp
if (key == -1) { // ui_wait_key() timed out
if (ui->Wa ...
Android系统设置和状态栏去掉WIFI等部分选项
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
某些特殊需求,需要去掉设置里面关于WIFI、BT等无线的设置
系统设置packages/apps/Settings/src/com\android/settings/SettingsActivity.java
setTileEnabled(new ComponentName(packageName, WifiSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_WIFI) &&false, isAdmin, pm);
setTileEnabled(new ComponentName(packageName,
Settings.BluetoothSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_BLUETOO ...
制作ubuntu文件系统
制作ubuntu文件系统:https://community.nxp.com/docs/DOC-330147
ubuntu16.04Installing with debootstrap:
$ mkdir ubuntu_rootfs
$ target=ubuntu_rootfs
$ distro=xenial
$ sudo debootstrap --arch=armhf --foreign --include=ubuntu-keyring,apt-transport-https,ca-certificates,openssl $distro "$target" http://ports.ubuntu.com
$ sudo cp /usr/bin/qemu-arm-static $target/usr/bin
$ sudo cp /etc/resolv.conf $target/etc
$ sudo chroot $target
# distro=xenial
# export LC_ALL=C LANGUAGE=C LANG=C
# /debootstra ...
源码管理与协作
SVNGit相关命令操作
配置git config --global user.email "xxxx"
git config --global user.name "xxxx"
# 配置密钥
ssh-keygen -o -t rsa -b 4096 -C "xxxx@foxmail.com"
```
+ 操作
```shell
cd xxx
git init
git add .
git commit -m 'first commit'
git remote add origin http://xxxx
git push -u origin master
#会提示输入用户名密码或使用ssh方式,添加SSH-Key,免密登陆
其他#不同操作系统 回车换行处理
git config --global core.autocrlf false
忽略某些文件.gitignore文件
bundlefirefly更新是用bundle更新原厂的代码,有的时候发的patch,有的是发的bundle当你在没有合适的网络或者可共享仓库的情况下,git bundle 很适合用于共享或者网络类型的操作 ...