rockchip 平台 LCD dtsi 格式转化工具


在rk平台调试时候,经常遇到 LCD 厂商提供的参数格式不是我们需要的格式,这时候需要转换格式需要额外多做很多工作,如下格式为常见格式:

  1. Resolution:800x1280
  2. External system porch setting: VS=4 ,VBP=8 ,VFP=24 ,HS=18 ,HBP=18 ,HFP=18
  3. Frame rate:60HZ
  4. MIPI CLK:405Mbps
  5. Power:VCI=3.3, IOVCC=1.8
  6. LCD_nReset=1;
  7. Delayms(5);
  8. LCD_nReset=0;
  9. Delayms(10);
  10. LCD_nReset=1;
  11. Delayms(120);
  12. //========== JD9365 B0E10.1 initial setting ==========//
  13. //Page0
  14. SSD_Single(0xE0,0x00);
  15. //--- PASSWORD  ----//
  16. SSD_Single(0xE1,0x93);
  17. SSD_Single(0xE2,0x65);
  18. SSD_Single(0xE3,0xF8);
  19. //Lane select by internal reg  4 lanes
  20. SSD_Single(0xE0,0x04);
  21. SSD_Single(0x2D,0x03);//defult 0x01
  22. SSD_Single(0xE0,0x00);
  23. SSD_Single(0x80,0x03);
  24. //--- Sequence Ctrl  ----//
  25. SSD_Single(0x70,0x02);  //DC0,DC1
  26. SSD_Single(0x71,0x23);  //DC2,DC3
  27. SSD_Single(0x72,0x06);  //DC7
  28. ... // 省略部分代码
  29. //DISP ON
  30. SSD_Number(0x01);
  31. SSD_CMD(0x29);      // DSPON
  32. Delayms(5);
  33. //--- TE----//
  34. SSD_Single(0x35,0x00);

几百行转化成rk认可的格式如下:

Continue reading "rockchip 平台 LCD dtsi 格式转化工具"

自制工具--串口调试工具


主界面如上图,主要功能介绍如下:

1. 打印串口的功能,支持常用的波特率,包括rk:1500000和MTK:921600
2. 串口输入的功能,还可以支持编辑快捷的输入键,在操作-》平台配置页面。
3. log分析功能,简单进行一些log高亮
下面为图片预览:

下载地址:
COMMaster

有了这个aria2,你可以忘了你的那个雷



十分怀念那个下载工具百花齐放的年代,如今的我们带宽已经超过那个年代100倍,但是除了用迅雷以外很少有下载工具能够有效的下载:BT的几大工具已经被迅雷吸血致死了;电驴已经的名存实亡;flashget,网络蚂蚁等一系列迅雷的老大哥已经被迅雷拍到沙滩上,现在都成了死鱼干了;甚至于抱着粗大腿的QQ旋风也死了。

但是需求没有变,下载是互联网最核心的需求,几乎和吃饭,喝水,呼吸一样的重要!!!

所以不甘寂寞的程序员们就一直在github上发布无数的下载工具,aira2就这无数工具中冒气的闪闪红星--自带开源免费的特点,多平台兼容开发者多,已经成为国内不少下载工具的内嵌下载工具,其功力可见一斑。

aira2的github地址:https://github.com/aria2/aria2

目前github上此项目的热门程度:

那么现在简单介绍一下这个aira2

先放个整合包,电脑直接可用的,aria2-整合下载包,后面详细介绍!

1. aria2 是一款使用 C++ 编写的轻量级跨平台命令行下载工具,支持 HTTP/HTTPS, FTP, SFTP, BitTorrent 和 Metalink 等多种协议。

2. aria2 具备很多功能特性,这里简单说一下:

  • 命令行工具
  • 支持多协议:HTTP(S)/FTP/SFTP/BitTorrent/Metalink
  • 支持 HTTP 认证,支持 HTTP 代理,Cookie,自定义头部···
  • 上传/下载速度限制
  • 支持 JSON-RPC/XML-RPC 轻量级远程调用接口

aira2的下载和环境变量的配置

1. aira2是绿色版本的,没有安装包,只有文件,你可以到 https://github.com/aria2/aria2/releases 去下载最新版本的工具,然后放到你喜欢的名录。

2. 配置你的系统的环境变量,将aira2加入到环境变量中。

aira2的使用:基础命令行简介

1)直接下载到当前路径

直接在命令提示符界面输入:aira2 url 即可,这样子可以直接下载网络内容到你操作指令的文件夹。例如下载他自己

2)一些常见的命令说明,注:-后的参数,用空格后加分隔,--后的参数用=号区隔:

-d,--dir= 指定路径。
-i,--input-file= 多文件下载是可以将url放到文件中,用换行区隔,就可以下载多个文件了。
-l,--log:指定log文件,记录下载log。若为-则在本窗口输出。
-j,--max-concurrent-downloads= 设置下载的并发数
-c,--continue [true|false]:断点续传。当前该选项只支持 HTTP(S)/FTP
-h,--help[=|]:查看帮助信息。帮助信息按标签进行分类。标签以#开头,aria2 提供的标签有:#basic,#advanced,#http,#https,#ftp,#metalink,#bittorrent,#cookie,#hook,#file,#rpc,#checksum,#experimental,#deprecated,#help,#all。默认使用#basic标签。如果未指定标签,则打印出包含该参数名称的选项内容。
--conf-path=:指定配置文件。默认配置文件为:$HOME/.aria2/aria2.conf,如果不存在,则为:$XDG_CONFIG_HOME/aria2/aria2.conf

3)使用配置文件进行统一配置,使用--conf-path=,这里是一个简单的参考:

## 下载设置 ##
## ------------

# 断点续传
continue=true
# 最大同时下载任务数, 运行时可修改, 默认:5
max-concurrent-downloads=5
# 单个任务最大线程数, 添加时可指定, 默认:5
split=16
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=1M
# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=16
# 断开速度过慢的连接
lowest-speed-limit=0
# 整体下载速度限制, 运行时可修改, 默认:0
#max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0
#max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0
#max-overall-upload-limit=0
# 单个任务上传速度限制, 默认:0
#max-upload-limit=0
# 禁用IPv6, 默认:false
#disable-ipv6=true
# 当服务器返回503错误时, aria2会尝试重连
# 尝试重连次数, 0代表无限, 默认:5
max-tries=0
# 重连冷却, 默认:0
#retry-wait=0

## 进度保存相关 ##
##--------------------

# 从会话文件中读取下载任务
# 开启该参数后aria2将只接受session中的任务, 这意味着aria2一旦使用conf后将不再接受来自终端的任务, 所以该条只需要在启动rpc时加上就可以了
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60
# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false


## RPC相关设置 ##
##---------------

# 启用RPC, 默认:false(rpc 不启动则只能使用命令行下载)
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许非外部访问, 默认:false
rpc-listen-all=true
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
#event-poll=kqueue
# RPC监听端口, 端口被占用时可以修改, 默认:6800
#rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
#rpc-secret=www.niuyoucai.org
# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-user=
# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=

## BT/PT下载相关 ##
##------------------

# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
follow-torrent=true
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=51413
# 单个种子最大连接数, 默认:55
bt-max-peers=100
# 打开DHT功能, PT需要禁用, 默认:true
enable-dht=true
# 打开IPv6 DHT功能, PT需要禁用, 默认:true
#enable-dht6=false
# DHT网络监听端口, 默认:6881-6999
dht-listen-port=6881-6999
# 本地节点查找, PT需要禁用, 默认:false
bt-enable-lpd=true
# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=true
# 每个种子限速, 对少种的PT很有用, 默认:50K
#bt-request-peer-speed-limit=50K
# 客户端伪装, PT需要
peer-id-prefix=-TR2770-
user-agent=Transmission/2.77
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
seed-ratio=0
# BT校验相关, 默认:true
#bt-hash-check-seed=true
# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=true
# 强制加密, 防迅雷必备
bt-require-crypto=true
#BT下载 tracker
bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,udp://tracker.leechers-paradise.org:6969/announce,udp://tracker.opentrackr.org:1337/announce,udp://p4p.arenabg.com:1337/announce,udp://9.rarbg.to:2710/announce,udp://9.rarbg.me:2710/announce,udp://tracker.openbittorrent.com:80/announce,udp://exodus.desync.com:6969/announce,udp://tracker.tiny-vps.com:6969/announce,udp://retracker.lanta-net.ru:2710/announce,udp://open.stealth.si:80/announce,udp://tracker.moeking.me:6969/announce,udp://denis.stalker.upeer.me:6969/announce,udp://tracker.torrent.eu.org:451/announce,udp://tracker.cyberia.is:6969/announce,udp://open.demonii.si:1337/announce,udp://ipv4.tracker.harry.lu:80/announce,udp://explodie.org:6969/announce,udp://xxxtor.com:2710/announce,udp://valakas.rollo.dnsabr.com:2710/announce
## 磁盘相关 ##
##-------------

# 文件保存路径, 默认为当前启动位置
dir=E:\download
# 日志文件
#log=aria2.log
#另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?)
enable-mmap=true
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: 快none < trunc < falloc < prealloc慢
# falloc仅仅比trunc慢0.06s
# 磁盘碎片: 无falloc = prealloc < trunc = none有
# 推荐优先级: 高falloc --> prealloc --> trunc -->none低
# EXT4, btrfs, xfs, NTFS等新型文件系统建议使用falloc, falloc(fallocate)在这些文件系统上可以瞬间创建完整的空文件
# trunc(ftruncate) 同样是是瞬间创建文件, 但是与falloc的区别是创建出的空文件不占用实际磁盘空间
# prealloc 传统的创建完整的空文件, aria2会一直等待直到分配结束, 也就是说如果是在HHD上下载10G文件,那么你的aria2将会一直等待你的硬盘持续满载工作直到10G文件创建完成后才会开始下载
# none将不会预分配, 磁盘碎片程度受下面的disk-cache影响, trunc too
# 请勿在传统文件系统如:EXT3, FAT32上使用falloc, 它的实际效果将与prealloc相同
# MacOS建议使用prealloc, 因为它不支持falloc, 也不支持trunc, but可以尝试用brew安装truncate以支持trunc(ftruncate)
# 事实上我有些不能理解trunc在aria2中的角色, 它与none几乎没有区别, 也就是说:太鸡肋了
file-allocation=falloc
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
disk-cache=64M

4)整合的简单工具包:aria2-整合下载包

说明:
1. 将要下载的内容逐行加入到download-example.txt 文件中,注意每一个文件要单独一行
2. 执行run.cmd 等待下载即可

图形化操作界面

命令行适合经常玩命令行的人,但是多数人还是习惯于图形化界面,aria2 提供了 RPC模式,使我们可以远程与它进行交互(远程调用)。因此,很多的 aria2 图形界面客户端就应运而生。

在工具中执行run-gui.cmd即可以使用ariac.com进行图形化配置。

速度不亚于迅雷

写在最后:

1. 我看到目前百度网盘的下载工具里面都是用aria2的,所以百度网盘下载的难点在于分析网盘文件的原始地址,看有时间可以研究一下。

2. 迅雷吸了p2p的血,导致bt的死亡。这个工具正好可以给bt补血,希望大家都能支持,而且这个工具还可以下载被迅雷屏蔽的资源。

自制工具:修改hosts文件,访问google等网站


由于工作原因,需要经常访问google等网站查询问题,因此常见的方法就是使用vpn或者通过修改hosts文件来实现对google 的访问。

但一般情况下免费的vpn很难找到,收费的vpn仅仅是访问google也不划算,因此常用的就是修改hosts的方式,修改hosts的方法也很简单,主要就是找到有效的hosts文件,然后替换掉系统的hosts文件即可,常用系统的host文件的路径如下:

  • windows系统的host文件路径:C:\WINDOWS\system32\drivers\etc
  • Android(安卓)系统hosts路径: /etc/hosts
  • Mac(苹果电脑)系统hosts路径: /etc/hosts
  • iPhone(iOS)系统hosts路径: /etc/hosts
  • Linux系统hosts路径: /etc/hosts
  • 绝大多数Unix系统路径: /etc/hosts

针对windows系统我这边编写了一个工具,用来更新和替换hosts文件,下载地址:
https://whonee.net/wp-content/uploads/2017/06/google.zip


Continue reading "自制工具:修改hosts文件,访问google等网站"

自制工具:利用python批量获取apk中的库文件。


客制化软件时,经常遇到需要将客户提供的apk预置到系统内,但是预置apk需要将apk中的库文件预先提取出来放到system/lib目录中,因此提取apk的库文件成为了一种需求。
常见的方法是手动用rar打开apk,导出库,然后保存,但是遇到大量apk需要预置的时候,会有不小的工作量,因此按照手动导出的逻辑,简单编写一个工具,代码如下:

  1. ''' 
  2. TOOLS: tools for get apks lib. 
  3. AUTOR: whonee 
  4. DATA : 20160109 
  5. '''  
  6. import os  
  7. import sys  
  8. import shutil  
  9.   
  10. ''' 
  11.     MODIFY IT FOR YOU PATH 
  12. '''  
  13. RAR_CMD = 'D://progra~1/WinRAR/winrar.exe'  
  14. PATH = 'D://py_tools/get_apk_lib/apk'  
  15. LIBPATH = 'D://py_tools/get_apk_lib/lib'  
  16.   
  17. ''' 
  18.     MAIN FUNCTION 
  19. '''  
  20. def rename(dirname = PATH):      
  21.     listFile = os.listdir(dirname)      
  22.     print(listFile)  
  23.     for file in listFile:  
  24.         filename = os.path.splitext(file)  
  25.         if(filename[1] == '.apk'):  
  26.             name = filename[0] + '.zip'  
  27.             print(name)  
  28.             os.rename(os.path.join(dirname, file),os.path.join(dirname,name))  
  29.       
  30.       
  31. def unzip(dirname = PATH,cmd = RAR_CMD):  
  32.     listFile = os.listdir(dirname)  
  33.     CMD = cmd + ' x {} {}'  
  34.     os.chdir(dirname)  
  35.     for file in listFile:  
  36.         filename = os.path.splitext(file)  
  37.         if(filename[1] == '.zip'):  
  38.             rarCmd = CMD.format(file,(filename[0]+os.sep))  
  39.             print(rarCmd)  
  40.             os.system(rarCmd)  
  41.   
  42. def restname(dirname = PATH):      
  43.     listFile = os.listdir(dirname)  
  44.     for file in listFile:  
  45.         filename = os.path.splitext(file)  
  46.         if(filename[1] == '.zip'):  
  47.             name = filename[0] + '.apk'  
  48.             print(name)  
  49.             os.rename(os.path.join(dirname, file),os.path.join(dirname,name))        
  50.       
  51. def findlib(dirname = PATH):  
  52.     listFile = os.listdir(dirname)     
  53.     libdir = dirname + os.sep + 'alllib'  
  54.     if not os.path.exists(libdir):  
  55.         os.mkdir(libdir)  
  56.     for file in listFile:    
  57.         # Bill Z 指出错误修改,可能处理到了alllib文件夹。  
  58.         if ( file == "alllib" ):                                                             
  59.            continue                
  60.         fulldirfile=os.path.join(os.path.abspath(dirname),file)  
  61.         if os.path.isdir(fulldirfile):  
  62.             #print(file + ' is path')  
  63.             os.chdir(fulldirfile)  
  64.             if os.path.exists('lib'):  
  65.                 print(file + ' have lib')  
  66.                 directdir = '../alllib/{}_lib'.format(file)  
  67.                 shutil.move('lib',directdir)  
  68.             os.chdir('..')  
  69.             try:  
  70.                 shutil.rmtree(fulldirfile)  
  71.             except:  
  72.                 pass  
  73.               
  74. def sort(dirname = PATH):  
  75.     libdir = dirname + os.sep + 'alllib'  
  76.     os.chdir(libdir)  
  77.     libfolderlist = os.listdir(libdir)  
  78.     for folder in libfolderlist:  
  79.         fulldirfile = os.path.join(libdir,folder)  
  80.         print("APK NAME: ",fulldirfile)  
  81.         os.chdir(fulldirfile)  
  82.         listlib = os.listdir(fulldirfile)  
  83.         for libfolder in listlib:  
  84.             print('HAVE LIB FOLDER: ',libfolder)  
  85.             if not (libfolder == 'x86' and libfolder == 'x64'):  
  86.                 rootlib = os.path.join(fulldirfile,libfolder)  
  87.                 os.chdir(rootlib)  
  88.                 alllib = os.listdir(rootlib)   
  89.                 for lib in alllib:  
  90.                     srclibname = os.path.join(rootlib,lib)  
  91.                     #print(srclibname)  
  92.                     tarlibname = os.path.join(LIBPATH,lib)  
  93.                     print('USERFUL LIB: ',srclibname)  
  94.                     #print(tarlibname)  
  95.                     shutil.copycopy(srclibname,tarlibname)  
  96.     print("all lib will be copycopy to lib folder ,\  
  97.     if you want to find the base lib ,please into 'apk/alllib'")  
  98.                 
  99. def main():  
  100.     if not os.path.exists(RAR_CMD):  
  101.         print("winrar.exe is not exists, please input rar path likes: 'c://Progra~1/WinRAR/winrar' \n")          
  102.         cmd = input('rar path: ')  
  103.         if not os.path.exists(cmd):  
  104.             print('input error rar path exit !')  
  105.             exit()  
  106.     path = PATH  
  107.     rename(path)  
  108.     unzip(path)  
  109.     findlib(path)  
  110.     restname(path)  
  111.     sort(path)      
  112.     anykey = input("Sucessful ! please input Enter key to exit!")  
  113.     if anykey:      
  114.         print('quit')  
  115.         exit()  
  116.           
  117.       
  118. if __name__ == '__main__':  
  119.     main()  

在对应的文件夹放上apk,执行此工具之后就可以到指定的文件夹去寻找已经导出OK的库了。