3 Commity b3b1b14652 ... 3dbc5e6ef4

Autor SHA1 Wiadomość Data
  mk 3dbc5e6ef4 1 3 lat temu
  mk 0738818fa8 3 3 lat temu
  mk 7490d1219c 2 3 lat temu

+ 64 - 0
.gitignore

@@ -0,0 +1,64 @@
+# ---> C
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+
+# ---> C++
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+

+ 3 - 0
ASUS_tinker_board2S学习整理.md

@@ -0,0 +1,3 @@
+# 学习整理
+资料汇总帖子
+https://smartfire.cn/forum.php?mod=viewthread&tid=5240&highlight=tinker%2Bboard

+ 190 - 0
FFmpeg学习.md

@@ -0,0 +1,190 @@
+##FFmpeg库学习相关
+
+win下涉及环境设置挺简单
+下载ffmpeg预编译好得链接库
+项目设置lib include目录引用 用到啥库引用啥lib文件就好
+
+关于文档  官网没有SDK  API类文档  项目开源  代码注释都在源码中 .H文件就是文档
+并且符合doxygen得规范   我用doxygen工具导出就能生存html得手册 比较好用 
+
+主要是没有示例  所以即使有API文档  没有处理视频得经验 并不确定H264视频得传输方式
+需要初始化什么获得什么 这可能是需要补充学习得资料  目前项初期就只用来获取摄像头得视频来源流推
+核心示例代码已经包含推流全部得流程思路 细节不一样参考doxygen生成得文档
+示例是从文件流获取信息转为流推  实际需要获取摄像头得输入流   
+这里需要看摄像头接入方式 为产品设计考虑 应该支持所有即插即用得USB摄像头 
+并且自己定制一款摄像头模组封装成自己得摄像头  走肯定走USB接口 实际可能是串口数据或者其他类型
+USB摄像头如果非专业监控或者网络摄像头 不会有带类似rtsp得流视频数据库采集进入 
+大概率是 RGB或者YUY2,MJPEG等格式 未经压缩得  类似从本地文件打开得媒体信息 
+需要研究如何填充 输入流得 AVFormatContext 结构数据 如何转码同步 暂无示例需要文档研究或者继续找示例  余下得核心部分是图形处理  美颜 水印 自动人脸打码等  是按单帧得图形处理  用得opencv库
+opencv是基于ffmpeg开发得一个更大型很多得库  美颜相关得图形处理都靠他
+
+
+
+
+
+
+
+
+
+
+示例代码版本比较旧仅供参考 
+核心示例代码
+```cpp
+/*******************************************************************************
+**                                                                            **
+**                     Jiedi(China nanjing)Ltd.                               **
+**	               创建:夏曹俊,此代码可用作为学习参考                       **
+*******************************************************************************/
+
+/*****************************FILE INFOMATION***********************************
+**
+**  Project       : FFmpegSDK实战课程
+**  Description   : 基于FFMpegSDK的实战课程
+**  Contact       : xiacaojun@qq.com
+**  博客   : http://blog.csdn.net/jiedichina
+**  视频课程
+**  http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=961
+**  http://edu.51cto.com/lecturer/12016059.html
+**  http://study.163.com/u/xiacaojun
+**  https://jiedi.ke.qq.com/
+**  购买课程后可以加群咨询课程学习问题
+**  群号 132323693 fmpeg的直播推流课程
+**  微信公众号  : jiedi2007
+**	头条号	 : 夏曹俊
+**
+*******************************************************************************/
+
+extern "C"
+{
+#include "libavformat/avformat.h"
+#include "libavutil/time.h"
+}
+#include <iostream>
+using namespace std;
+#pragma comment(lib,"avformat.lib")
+#pragma comment(lib,"avutil.lib")
+#pragma comment(lib,"avcodec.lib")
+
+int XError(int errNum)
+{
+	char buf[1024] = { 0 };
+	av_strerror(errNum, buf, sizeof(buf));
+	cout << buf << endl;
+	getchar();
+	return -1;
+}
+int main(int argc, char *argv[])
+{
+
+	char *inUrl = "test.flv";
+	char *outUrl = "rtmp://192.168.1.44/live";
+
+	//初始化所有封装和解封装 flv mp4 mov mp3
+	av_register_all();
+
+	//初始化网络库
+	avformat_network_init();
+
+	//////////////////////////////////////////////////////////////////////////
+	//输入流 1 打开文件,解封装
+	//输入封装上下文
+	AVFormatContext *ictx = NULL;
+
+	//打开文件,解封文件头
+	int re = avformat_open_input(&ictx, inUrl, 0, 0);
+	if (re != 0)
+	{
+		return XError(re);
+	}
+	cout << "open file " << inUrl << " Success." << endl;
+
+	//获取音频视频流信息 ,h264 flv
+	re = avformat_find_stream_info(ictx, 0);
+	if (re != 0)
+	{
+		return XError(re);
+	}
+	av_dump_format(ictx, 0, inUrl, 0);
+	//////////////////////////////////////////////////////////////////////////
+
+
+	//////////////////////////////////////////////////////////////////////////
+	//输出流 
+
+	//创建输出流上下文
+	AVFormatContext *octx = NULL;
+	re = avformat_alloc_output_context2(&octx, 0, "flv", outUrl);
+	if (!octx)
+	{
+		return XError(re);
+	}
+	cout << "octx create success!" << endl;
+
+	//配置输出流
+	//遍历输入的AVStream
+	for (int i = 0; i < ictx->nb_streams; i++)
+	{
+		//创建输出流
+		AVStream *out = avformat_new_stream(octx, ictx->streams[i]->codec->codec);
+		if (!out)
+		{
+			return XError(0);
+		}
+		//复制配置信息,同于MP4
+		//re = avcodec_copy_context(out->codec, ictx->streams[i]->codec);
+		re = avcodec_parameters_copy(out->codecpar, ictx->streams[i]->codecpar);
+		out->codec->codec_tag = 0;
+	}
+	av_dump_format(octx, 0, outUrl, 1);
+	//////////////////////////////////////////////////////////////////////////
+
+
+	//rtmp推流
+
+	//打开io
+	re = avio_open(&octx->pb, outUrl, AVIO_FLAG_WRITE);
+	if (!octx->pb)
+	{
+		return XError(re);
+	}
+
+	//写入头信息
+	re = avformat_write_header(octx, 0);
+	if (re < 0)
+	{
+		return XError(re);
+	}
+	cout << "avformat_write_header " << re << endl;
+	AVPacket pkt;
+	for (;;)
+	{
+		re = av_read_frame(ictx, &pkt);
+		if (re != 0)
+		{
+			break;
+		}
+		cout << pkt.pts << " " << flush;
+		//计算转换pts dts
+		AVRational itime = ictx->streams[pkt.stream_index]->time_base;
+		AVRational otime = octx->streams[pkt.stream_index]->time_base;
+		pkt.pts = av_rescale_q_rnd(pkt.pts, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));
+		pkt.dts = av_rescale_q_rnd(pkt.pts, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));
+		pkt.duration = av_rescale_q_rnd(pkt.duration, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_NEAR_INF));
+		pkt.pos = -1;
+
+		//视频帧推送速度
+		if (pkt.stream_index == 0)
+			av_usleep(30*1000);
+
+		re = av_interleaved_write_frame(octx, &pkt);
+		if (re<0)
+		{
+			return XError(re);
+		}
+	}
+
+	cout << "file to rtmp test" << endl;
+	getchar();
+	return 0;
+}
+```

+ 8 - 0
LICENSE

@@ -0,0 +1,8 @@
+MIT License
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 2 - 2
README.md

@@ -1,3 +1,3 @@
-# stream_device_prj
+# zhibo_hard_project
 
-户外直播设备项目
+户外移动直播一体化设备项目

+ 1 - 0
WSL/wsl_ext.md

@@ -0,0 +1 @@
+1

+ 55 - 0
WSL/wsl_move.md

@@ -0,0 +1,55 @@
+## wsl迁移
+
+
+```POWERSHELL
+
+#查看所有发行版
+wsl -l -v
+
+#我本机有Ubuntu2004 和docker得两个镜像 一共三个
+
+关闭所有发行版:
+wsl --shutdown
+
+
+#docker原本得工作目录
+C:\Users\mk\AppData\Local\Docker\wsl\data
+
+##这个导出导入方法只支持小于250G得WSL系统 过大会出各种问题 很难折腾  巨坑  过大可以采用新建实例然后直接覆盖vhdx方法我并未测试
+#导出docker得镜像   (docker得镜像不会导出)
+wsl --export docker-desktop-data S:\wsl\pak\docker_data\docker_desktop_data.tar
+wsl --export docker-desktop S:\wsl\pak\docker\docker_desktop.tar
+#导出Ubuntu得镜像
+wsl --export Ubuntu-20.04 S:\wsl\pak\Ubuntu2004\Ubuntu2004.tar
+
+#注销docker-desktop-data:
+wsl --unregister docker-desktop-data
+wsl --unregister docker-desktop
+#注销Ubuntu  (会删除原始数据文件)
+wsl --unregister Ubuntu-20.04  
+
+
+
+#重新导入docker-desktop-data到要存放的文件夹:
+wsl --import docker-desktop-data S:\wsl\docker_data\ S:\wsl\pak\docker_data\docker_desktop_data.tar --version 2
+wsl --import docker-desktop S:\wsl\docker\ S:\wsl\pak\docker\docker_desktop.tar --version 2
+wsl --import Ubuntu-20.04 S:\wsl\Ubuntu2004\ S:\wsl\pak\Ubuntu2004\Ubuntu2004.tar --version 2
+
+#到此正常结束
+
+#后面都是因为我大于250G并且扩容后得WSL主机 tar包无法import 得解决
+
+
+#用LxRunOffline.exe导入  v=2参数无效 还是wsl1得版本
+LxRunOffline.exe i -n Ubuntu-20.04 -d S:\wsl\Ubuntu2004\ -f T:\Ubuntu2004\Ubuntu2004.tar -v 2
+#启动后进去删除或者转移备份系统环境无关的文件 裁剪到250G以下
+#再重新转回版本2
+wsl --set-version Ubuntu-20.04 2
+#如果遇到丢失用户配置信息的情况
+#先导入版本1之前 先新建一个建立相同的用户密码权限信息
+#改个名字再按原名字导入 再WSL1中能又用户信息 再转换成2就OK  后续再重新扩容  手动恢复为了裁剪而删除前备份的文件
+
+
+```
+
+[扩容教程](https://docs.microsoft.com/zh-cn/windows/wsl/vhd-size)

+ 246 - 0
android/4G模块NDIS驱动.md

@@ -0,0 +1,246 @@
+## SIMCOM_7600CE 4GNDIS驱动
+
+### 问题默认插上4G模块无法正常上网
+能感应到USB设备插入  
+问官方要到了安卓11得驱动包和文档 尝试移植
+
+百度也有一篇简要得移植文章  针对6.0得
+https://blog.csdn.net/weixin_44127587/article/details/115207908
+
+文档中第一步提到得LINUX内核配置文件  我全局搜索出来是这  看来和源码本身没关系  源码默认USB支持各种模式也都编译了  配置中配置来决定是否打包进去
+
+out/target/product/Tinker_Board_2/obj/PACKAGING/check_vintf_all_intermediates/kernel_configs.txt
+
+CONFIG_USB_WDM=y
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_QMI_WWAN=y
+
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_WWAN=y
+CONFIG_USB_SERIAL_OPTION=y
+
+
+以上配置并不连续在一起  分别查找确认了 默认都是y
+
+
+第二步
+
+网文 
+>修改驱动文件, 增加7600模块的VID和PID ,并且跳过 Interface 5,
+路径一般为 linux-3.10/drivers/usb/serial/option.c
+ 
+
+模块文档中
+>配置预留 NDIS 串口:
+文件路径:kernel/drivers/usb/serial/option.c;
+在 static const struct usb_device_id option_ids[]数组中添加我们的串口信息,其中包
+括设备 ID(VID、PID),以及需要跳过的设备。
+需要跳过的设备:在同一个设备 ID 下面,可能存在多个设备(同一个物理 USB 口
+虚拟出多个模拟端口);设置一个黑名单,可以把不需要配置成串口的模拟口屏蔽掉,
+这样就不会被映射为串口。
+串口配置:kernel/drivers/usb/serial/option.c;
+Android 配置中需要个人添加 blacklist 结构(可以只添加自己需要的 PID、VID):
+
+我看安卓11版本里已经有了9001得配置 所以没改
+新增了9011得识别
+
+
+46行
+```
+# mk added for simcom7600
+/dev/ttyUSB*              0666   radio      radio
+# mk added end
+```
+
+
+
+
+kernel/drivers/net/usb/Makefile
+
+4G 模块驱动文件:simcom_wwan.c
+5G 模块驱动文件:qmi_wwan_simcom_1e0e_9001.c
+我选择了4G模块驱动文件放入编译
+注释掉原来的qmi驱动
+```
+#obj-$(CONFIG_USB_NET_QMI_WWAN)	+= qmi_wwan.o
+
+
+obj-$(CONFIG_USB_USBNET)	+= usbnet.o  simcom_wwan.o #qmi_wwan_simcom_1e0e_9001.o
+```
+
+至此编译后系统有usb0 但是不会自动配置   手动配置IP掩码网关之后接口能正常上网  模块正常工作 系统LINUX层驱动工作正常    缺自动配置工具    自己写脚本也行
+
+自动rndis配置方法
+build/make/core/main.mk 
+加ADDITIONAL_BUILD_PROPERTIES += rild.simcom.rndis=1
+我选择在 374行 ADDITIONAL_BUILD_PROPERTIES += net.bt.name=Android 后加
+```
+BUILD_WITHOUT_PV := true
+
+ADDITIONAL_BUILD_PROPERTIES += net.bt.name=Android  #line 374
+
+#add by mk for simcom
+ADDITIONAL_BUILD_PROPERTIES += rild.simcom.rndis=1
+ADDITIONAL_BUILD_PROPERTIES += net.usb0.dns2=114.114.114.114
+#add by mk for simcom end
+```
+我顺手把DNS配置也加了 自动模式获取得DNS是7600得网关 192.168.255.1 实测不能完成DNS解析
+
+
+但是安卓应用层  默认并不会带上 telephony组件     短信电话4G模块都没有 
+
+第三步
+想办法尝试把telephony组件编译进去 让安卓启动后多出这些APP
+
+
+device/asus/tinker_board_2/BoardConfig.mk
+BOARD_HAS_RK_4G_MODEM 设置位true 默认是false 
+
+```
+#for rk 4g modem
+BOARD_HAS_RK_4G_MODEM ?= true
+ifeq ($(strip $(BOARD_HAS_RK_4G_MODEM)),true)
+DEVICE_MANIFEST_FILE += device/rockchip/common/4g_modem/manifest.xml
+endif
+```
+
+
+device/asus/tinker_board_2/WW_Tinker_Board_2.mk
+要加在前面否则会有变量初始化错误
+```
+$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony.mk)
+```
+
+
+
+修改 build/target/product/telephony_vendor.mk
+增加 messaging \  默认不包含短信模块
+
+PRODUCT_PACKAGES := \
+    rild \
+    messaging \  
+
+PRODUCT_COPY_FILES := \
+
+
+
+第四步
+替换原版rild层驱动为厂商提供得驱动
+
+/system/core/rootdir/init.rc 和/hardware/ril/rild.rc
+启动脚本加载库-l /vendor/lib64/libreference-ril.so
+```
+service vendor.ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril.so
+```
+
+
+hardware/ril/rild
+hardware/ril/refrence-ril
+
+这两个库 有原装的 但是我们要换成自己4G模块提供的 simcom的驱动 
+有些资料的做法是改掉android.mk的名字让他不编译 然后自己把文件放到out目录中  
+我测试失败后就考虑还是让他生成打包(失败原因是不编译也意味着不打包了如果只是依赖得文件还好,但是也包括rild.rc等相关文件不知道会少打包啥 所以留着 我们会写拷贝发布配置)  
+
+写copyfile规则
+vendor目录下新建simcom文件夹放入厂商给的驱动
+
+device/asus/tinker_board_2/WW_Tinker_Board_2.mk
+加上
+
+PRODUCT_COPY_FILES += vendor/simcom/rild:/vendor/bin/hw/rild
+PRODUCT_COPY_FILES += vendor/simcom/libril.so:/vendor/lib64/libril.so
+PRODUCT_COPY_FILES += vendor/simcom/libreference-ril.so:/vendor/lib64/libreference-ril.so
+
+
+    rild.libpath = /vendor/lib64/libreference-ril.so
+
+
+
+
+这里还会打包失败 编译环境很严格 会检测到重复发布得包 规则验证不通过(因为要拷贝得rild和libreference本身会编译发布  我们copy相当于是重复发布来覆盖他)
+修改编译配置把严格模式改成允许重复发布
+在device/asus/tinker_board_2/BoardConfig.mk
+末尾加上
+```
+BUILD_BROKEN_DUP_RULES := true
+```
+
+
+第五步
+设置默认网络模式和开启语音短信等配置选项
+
+frameworks/base/telephony/java/com/android/internal/telephony/RILConstants.java
+默认网络设置4G NETWORK_MODE_WCDMA_PREF  9
+```
+    @UnsupportedAppUsage
+    int PREFERRED_NETWORK_MODE = Optional.of(TelephonyProperties.default_network())
+            .filter(list -> !list.isEmpty())
+            .map(list -> list.get(0))
+            .orElse(NETWORK_MODE_LTE_GSM_WCDMA);
+            //.orElse(NETWORK_MODE_WCDMA_PREF);
+```
+
+
+packages/services/Telephony/res/values/config.xml 中
+```
+<bool name="config_enabled_lte" translatable="false">true</bool>
+```
+
+
+
+
+
+
+
+device/rockchip/common/overlay/frameworks/base/core/res/res/values/config.xml
+
+
+```
+    <!-- This device is not "voice capable"; it's data-only. -->
+    <bool name="config_voice_capable">true</bool>
+
+    <!-- This device does not allow sms service. -->
+    <bool name="config_sms_capable">true</bool>
+```
+默认都是false 改成true
+
+
+
+
+
+
+第六步
+
+ 最后遇到问题调试方法
+
+手动抓 log 保存到文件:
+RIL 的 log:
+adb logcat -b radio -v time >radio.txt
+GPS/pppd/CM:
+adb logcat -v time >main.txt
+如果设备和 PC 间是串口连接, 进入串口 shell 模式后执行
+Logcat –b radio –v time
+Logcat –v time
+把打印出的 log 存成文件
+
+
+
+
+adb抓  可以保存到win主机上用BareTailPro动态查看log文件就好了 就跟终端输出一样
+
+
+
+
+文件推送上传
+把 ril 库的相关文件推送到 android 对应的目录(添加开机脚本时一定要对应路径)
+若是手动 push 到系统,首先要重新挂载设备: 因为默认权限是只读的
+```PowerShell
+adb root && adb remount (低版本 android 或者 mount -o remount,rw /system)
+
+adb push ./rild /vendor/bin/hw/
+adb shell chmod 777 /vendor/bin/hw/rild
+#Simcom Android ril 适配
+
+adb push ./libril.so /vendor/lib64/
+adb push ./libreference-ril.so /vendor/lib64/
+```

+ 161 - 0
android/学习.md

@@ -0,0 +1,161 @@
+## 源码包编译流程梳理
+
+教程都是先执行这个
+```
+    source ./build/envsetup.sh
+    lunch WW_Tinker_Board_2-userdebug
+    ./build.sh
+```
+备注:build.sh代码第一行会自动source /build/envsetup.sh
+因为lunch是在envsetup.sh中定义所以第一次不能省略source ./build/envsetup.sh
+
+
+
+1. `envsetup.sh`
+    这个envsetup.sh中定义了很多环境设置环境变量的工具和函数 
+    包含lunch  mmm等函数
+
+
+ 
+
+2. lunch WW_Tinker_Board_2-userdebug 
+    lunch的代码
+    ```
+    function lunch()
+    {
+        local answer
+
+        if [ "$1" ] ; then
+            answer=$1
+        else
+            print_lunch_menu
+            echo -n "Which would you like? [aosp_arm-eng] "
+            read answer
+        fi
+
+        local selection=
+
+        if [ -z "$answer" ]
+        then
+            selection=aosp_arm-eng
+        elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
+        then
+            local choices=($(TARGET_BUILD_APPS= get_build_var COMMON_LUNCH_CHOICES))
+            if [ $answer -le ${#choices[@]} ]
+            then
+                # array in zsh starts from 1 instead of 0.
+                if [ -n "$ZSH_VERSION" ]
+                then
+                    selection=${choices[$(($answer))]}
+                else
+                    selection=${choices[$(($answer-1))]}
+                fi
+            fi
+        else
+            selection=$answer
+        fi
+
+        export TARGET_BUILD_APPS=
+
+        local product variant_and_version variant version
+
+        product=${selection%%-*} # Trim everything after first dash
+        variant_and_version=${selection#*-} # Trim everything up to first dash
+        if [ "$variant_and_version" != "$selection" ]; then
+            variant=${variant_and_version%%-*}
+            if [ "$variant" != "$variant_and_version" ]; then
+                version=${variant_and_version#*-}
+            fi
+        fi
+
+        if [ -z "$product" ]
+        then
+            echo
+            echo "Invalid lunch combo: $selection"
+            return 1
+        fi
+
+        TARGET_PRODUCT=$product \
+        TARGET_BUILD_VARIANT=$variant \
+        TARGET_PLATFORM_VERSION=$version \
+        build_build_var_cache
+        if [ $? -ne 0 ]
+        then
+            return 1
+        fi
+
+        export TARGET_PRODUCT=$(get_build_var TARGET_PRODUCT)
+        export TARGET_BUILD_VARIANT=$(get_build_var TARGET_BUILD_VARIANT)
+        if [ -n "$version" ]; then
+        export TARGET_PLATFORM_VERSION=$(get_build_var TARGET_PLATFORM_VERSION)
+        else
+        unset TARGET_PLATFORM_VERSION
+        fi
+        export TARGET_BUILD_TYPE=release
+
+        echo
+
+        set_stuff_for_environment
+        printconfig
+        destroy_build_var_cache
+    }
+    ```
+    lunch看起来就是根据给定的参数定义 三个环境变量
+    ```
+    TARGET_PRODUCT=$product \
+    TARGET_BUILD_VARIANT=$variant \
+    TARGET_PLATFORM_VERSION=$version \
+    ```
+
+    问题:参数传进来再哪里用 如果build.sh没有直接调用 要找到在哪调用了
+    全局搜索示例传入的参数获取一些信息 后再分析`build.sh`
+    竟然后26个文件7000多出有 写死的WW_Tinker_Board_2 的定义 看似不合理
+    应该是替换的原版android的某个名称  达到自定义名称的目的 否则这么一个一开始就需要全局引入的参数 应该是用变量实现  全局环境变量都有了 应该是调用 当然为这个配置项写死的配置应该很多 那应该以文件为单位  不应该出现一个文件多出该变量定义
+
+3. `build.sh`
+    发现`build.sh`脚本中依然有写死的WW_Tinker_Board_2  
+
+
+    ```
+        usage()
+        {
+        echo "USAGE: [-U] [-CK] [-A] [-p] [-o] [-u] [-v VERSION_NAME] [-n BUILD_NUMBER]"
+            echo "No ARGS means use default build option                  "
+            echo "WHERE: -U = build uboot                                 "
+            echo "       -C = build kernel with Clang                     "
+            echo "       -K = build kernel                                "
+            echo "       -A = build android                               "
+            echo "       -p = will build packaging in IMAGE      "
+            echo "       -o = build OTA package                           "
+            echo "       -u = build update.img                            "
+            echo "       -v = build android with 'user' or 'userdebug'    "
+            echo "       -n = set build number    "
+            echo "       -r = pack the release    "
+            echo "       -d = huild kernel dts name    "
+            echo "       -V = build version    "
+            echo "       -J = build jobs    "
+            exit 1
+        }
+    ```
+    支持的参数 不用解释 看说明就行
+    
+    ```
+    source build/envsetup.sh >/dev/null
+    BUILD_UBOOT=false
+    BUILD_KERNEL_WITH_CLANG=false
+    BUILD_KERNEL=false
+    BUILD_ANDROID=false
+    BUILD_AB_IMAGE=false
+    BUILD_UPDATE_IMG=false
+    BUILD_OTA=false
+    BUILD_PACKING=false
+    BUILD_VARIANT=`get_build_var TARGET_BUILD_VARIANT`
+    KERNEL_DTS=""
+    #BUILD_VERSION=""
+    BUILD_JOBS=16
+    PACK_RELEASE=false
+
+    BUILD_NUMBER="eng"-"$USER"-"$(date  +%Y%m%d.%H%M)"
+    RELEASE_NAME=Tinker_Board_2-Android11-"$BUILD_NUMBER"
+    ```
+

+ 16 - 0
android/编译思考.md

@@ -0,0 +1,16 @@
+单独编译模块
+
+
+Android源码目录下的build/envsetup.sh文件,描述编译的命令
+- m: Makes from the top of the tree.
+- mm: Builds all of the modules in the current directory.
+- mmm: Builds all of the modules in the supplied directories.
+要想使用这些命令,首先需要在android源码根目录执行. build/envsetup.sh 脚本设置环境
+m:编译所有的模块
+mm:编译当前目录下的模块,当前目录下要有Android.mk文件
+mmm:编译指定路径下的模块,指定路径下要有Android.mk文件
+下面举个例子说明,假设我要编译android下的\hardware\libhardware_legacy\power模块,当前目录为源码根目录,方法如下:
+1、. build/envsetup.sh
+2、mmm hardware/libhardware_legacy/power/
+编译完后 运行 make snod
+会重新将你改过的模块打入到system.img中

+ 14 - 0
opencv学习.md

@@ -0,0 +1,14 @@
+##opencv学习
+openCV 不用预编译得静态库  (事实上ffmpeg后期也需要自行编译,目标平台安卓 官网没有预编译库,第三方有看到ffmpeg for andriod库 暂未研究 并且按实际情况库得代码可能会需要微调 最终交叉编译发布得形式是必须得 上开发板得时候必须环境弄好)
+
+opencv采用Cmake管理编译 详细编译流程资料参考官网
+这里引用 win下链接库编译得文档 
+https://docs.opencv.org/4.x/d3/d52/tutorial_windows_install.html 
+以供参考
+
+congifure得时候需要下载依赖(需要代理,有被墙)
+
+我用vs2019得环境   生成64位得库
+使用bin lib include三个文件夹 同样自己得项目配置好 引用目录 启动运行和调试需要bin下得dll(采用动态连接得方式引用API)
+
+

+ 92 - 0
工作准备.md

@@ -0,0 +1,92 @@
+# 准备
+
+## 基础知识补习
+1.markdown学习  
+>资料:https://www.runoob.com/markdown/md-link.html
+
+2.docker学习  
+
+```shell
+    #docker镜像需要Dockerfile编写
+    docker build [imagename] [imagepath]
+    #docker本地镜像发布到远程
+    docker login
+    docker tag [local_imageid]  [dockerid]/[remote_imageid]  #dockerid=accountid
+    docker push tendollor/[remote_imageid]
+```
+
+2.行业硬件厂商了解 
++ 全志
++ 安腾
++ 晓龙
+
+## 设备组件选型
+    
+### 核心
+    
++ 开发板
+  + 树莓派测试 
+    树莓派可以跑linux 也可以跑Android但是Android兼容性有待研究
+    >资料 https://cloud.tencent.com/developer/article/1863949
+  
+  + 安卓开发板
+    + 华硕
+    >ASUS华硕tinker board 2 S瑞芯微RK3399开发板tinkerboard:
+    [裸板开发版699带屏幕配件1667块钱(已买待测)](https://item.taobao.com/item.htm?id=634344476519)
+    [资料汇总](https://smartfire.cn/forum.php?mod=viewthread&tid=5240&highlight=tinker%2Bboard)
+    + 全志V系列(V是视频处理得系列有专门得解码编码芯片)
+    >1.Sipeed MAIX-II M2dock 全志V831开发板 深度学习 AI+IOT Linux:
+    [核心板89块钱](https://item.taobao.com/item.htm?id=662129870737) 
+    >2.Lindenis全志V536双核A7低功耗专业图形图像视频编码开发板:
+    [开发板689块钱](https://item.taobao.com/item.htm?id=612677083714)
+
+    + 高端高配系列
+        >SA800U高通骁龙845机器人AGV4K视频直播视频会议4K商显主板开发板:
+        [视频会议型2000多](https://item.taobao.com/item.htm?id=669794428909)
++ 电源模块  充电宝功能可选 至少给核心板供电   资料查找
+  + 18650封装
+  + 纯锂电池封装 
++ 摄像头
+  目前发热 不防抖
+  调研手机摄像头模组价格   是否纯软件防抖  至少想有手机水准 以我锤子手机参考 低端手机无意义
+
++ 4G模块
+  + ec6000n模组 CAT.1 下行 10M上行5M 速度不太行 模组很小型 低功耗
+  >高通驱动 USB接入虚拟出串口 ttyUSB0 ttyUSB1 ttyUSB2  用1号进行AT命令设置
+  >```
+  >AT+QCFG="usbnet",3  //自动设置模式
+  >AT+qnetdevctl=3,1,1 //立即拨号并设置重启自动拨号模式
+  >```
+  >拨前进行dhcp获取能成功自动拨号模式不管dhcp 模块是rt-thread系统 lwip协议实现
+
+  + sim7600CE模组 CAT.4 下行150M上行50M 这个应该可以就是功耗大点 需要独立供电单独USB功率过小会触发自重启 至少0.6W  从电源得表现规律估算来得 没有做负荷测试
+  >默认高通USB驱动不兼容 卸载 rmmod qmi_wan SIM7600CE专门得驱动 编译产生simcom_wwan.ko insmod simcom_wwan.ko加载
+  >```
+  >AT+CNMP=2 //设置自动模式
+  >AT$QCRMCALL=1,1 //拨号  暂无找到资料表示如何自动拨号
+  >```
+  >拨号成功后才可申请dhcp  必须先手动拨号成功才行
+  >模块跑得linux系统 USB连接才初始化4G连接 独立供电也不自动连接4G网络
+  
+
+
+## 软件方案选择
+
+### 核心
++ 流推
++ 视频处理
++ 还要扩展屏幕控制
++ 以上三大核心决定开发语言 决定平台系统  参考选择开发核心板 暂定安卓 
++ go
+  + livego库https://github.com/gwuhaolin/livego   rtmp服务器  测试
+  + 理论上需要得是rtmp客户端 或者中转端 负责流推上传
++ c++
++ python
+
+
+## 思路
+结合项目最几个核心需求 考虑后面需要扩展 应该选用安卓开发板 
+项目不能一步登天  分几个阶段合适点   最开始在验证阶段可以利用手上资源  树莓派或者其他现有 LINUX开发板进行测试  模组验证 总结问题 再定  毕竟对电子硬件产业不熟悉
+
+
+

+ 15 - 0
方案验证文档.md

@@ -0,0 +1,15 @@
+###先测试livego 
+##rtmp服务器  
+###看能否实现推流功能
+>流媒体服务器都是 负责拉流转发 并不负责视频合成和推流  但是看似代码中有视频编码得代码  
+毕竟需要让别人以各种格式拉流  暂时不清楚和推流是否一个原理
+
+
+##ffmpeg库是负责流媒体传输得核心库 先查阅他得资料
+找了个教程学习中 这个库功能挺全
+
+
+###学习笔记
+>图像采集 RGB -> 美颜水印->YUV格式H264编码转FLV
+
+流媒体服务器  crtmpserver

+ 39 - 0
项目设计原型思路.md

@@ -0,0 +1,39 @@
+#产品文档
+    
+
+##核心需求
+
+    户外移动直播功能列表  穿戴式
+    
+    核心功能
+    
+    1.摄像头  必须
+        自动变焦
+        防抖
+        镜头选择    是否广角  焦距范围  防抖(软件防抖  机械云台)
+        是否支持高速捕捉
+
+    2.充电宝  必须
+    3.4G上网  必须
+        三网聚合加速 可选
+        esim卡  (电子sim卡)
+    4.流推功能 必须
+        rtmp 必须
+        其他流推格式支持  可选
+
+    可选功能
+
+    5.手机APP连接配置 可选
+    6.屏幕  可选
+        信息显示得LCD屏  可选
+        彩色触屏  可选(和APP连接配置二选一)
+    7.流推视频处理
+        美颜  可带打码 小猫图像挡脸
+        人脸打码 (可以绑定设备按钮)  
+    8.弹幕信息获取 语音播报  可选
+
+
+
+##设计思路
+
+