diff --git a/.github/config/markdownlink.json b/.github/config/markdownlink.json index 8dc84f9..222d5d5 100644 --- a/.github/config/markdownlink.json +++ b/.github/config/markdownlink.json @@ -2,6 +2,10 @@ "ignorePatterns": [ { "pattern": "^https://docs.github.com" + }, + { + "pattern": "^/", + "replacement": "{{BASEURL}}/" } ] } \ No newline at end of file diff --git a/en/K510-CRB-KIT_AWS_Quick_Start_Guide.md b/en/K510-CRB-KIT_AWS_Quick_Start_Guide.md new file mode 100644 index 0000000..b59ac7a --- /dev/null +++ b/en/K510-CRB-KIT_AWS_Quick_Start_Guide.md @@ -0,0 +1,244 @@ +# K510-CRB-KIT AWS Quick Start Guide + +## 1. Document information + +### 1.1 Product name + +K510-CRB-KIT + +### 1.2 Version + +|Version|Date|Description|Author| +| :- | :- | :- | :- | +|1.0.0|2022-06-13|First version|Wanghao Zhangtao Shiwentao| +||||| +||||| + +## 2. Overview + +Kendryte K510 is the second-generation AI edge-side inference chip launched by Canaan, providing high-performance image and voice processing capabilities. It integrates the latest generation image processor ISP, supports TOF depth signal access. + +K510-CORE is the core module, with a K510 chip onboard, which CPU adopts dual-core 64bit RISC-V architecture. K510 is equipped with the second-generation neural network processor KPU 2.0, using independent computing data-flow technology. Compared with the previous generation, it has improved computing power significantly while reducing power consumption. The onboard memory is 512MB LPDDR3@1600MHz. It supports two MIPI serial image inputs and one DVP parallel image input, and supports one MIPI image output. + +K510 CRB-KIT is a developer kit based on the K510 chip. It adopts a hierarchical design and is based on the K510 core module. + +## 3. Hardware Description + +### 3.1 DataSheet + + + +## 4. Set up your Development Environment + +1. Install Docker Desktop on Ubuntu + Download the Installation package: [Download](https://desktop.docker.com/linux/main/amd64/docker-desktop-4.9.1-amd64.deb?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-linux-amd64) + + Install Docker Desktop: + + ```shell + sudo apt-get install ./docker-desktop-4.9.1-amd64.deb + ``` + + Reference: + +2. Download K510 SDK: + + ```shell + git clone https://github.com/kendryte/k510_buildroot.git + ``` + +3. Start Docker environment: + + ```shell + sh k510_buildroot/tools/docker/run_k510_docker.sh + ``` + +4. Generate firmware: + + ```shell + make + ``` + + __(On the docker env)__ +5. Burn the firmware to TF Card: + + ```shell + sudo dd if=k510_buildroot/k510_crb_lp3_v1_2_defconfig/image/sysimage-sdcard.img of=/dev/sdx oflag=sync bs=1M + ``` + + __(Use your actual device path instead of '/dev/sdx')__ + +## 5. Set up your hardware + +- Front view of the hardware + +![](/zh/images/aws_quick_start/board_front.png) + +- Back view of the hardware + +![](/zh/images/aws_quick_start/board_back.png) + +- 5A@2A power adaptor, USB to type-C cable(Attached parts) + +- Boot mode settting table + +![](/zh/images/aws_quick_start/boot_mode.png) + +- Uart driver download page: [Download](https://www.wch.cn/downloads/CH341SER_EXE.html) + +## 6. Setup your AWS account and Permissions + +### 6.1 Sign up for an AWS account + +1. Open +2. Follow the online instructions. + +__Note:Save your AWS account number, because you need it for the next task.__ + +### 6.2 Create a user and grant permissions + +1. Sign in to the [IAM console](https://console.aws.amazon.com/iam/) as the account owner by choosing Root user and entering your AWS account email address. On the next page, enter your password. +2. In the navigation pane, choose Users and then choose Add users. +3. For User name, enter iot_test +4. Select the check box next to AWS Management Console access. Then select Custom password, and then enter your new password in the text box. +5. (Optional) By default, AWS requires the new user to create a new password when first signing in. You can clear the check box next to User must create a new password at next sign-in to allow the new user to reset their password after they sign in. +6. Choose Next: Permissions. +7. Under Set permissions, choose Add user to group. +8. Choose Create group. +9. In the Create group dialog box, for Group name enter iot_test +10. Choose Filter policies, and then select AWS managed - job function to filter the table contents. +11. In the policy list, select the check box for AWSIoTDataAccess and AWSIoTConfigAccess. Then choose Create group. +12. Back in the list of groups, select the check box for your new group. Choose Refresh if necessary to see the group in the list. +13. Choose Next: Tags. +14. (Optional) Add metadata to the user by attaching tags as key-value pairs. For more information about using tags in IAM, see [Tagging IAM entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) in the *IAM User Guide*. +15. Choose Next: Review to see the list of group memberships to be added to the new user. When you are ready to proceed, choose Create user. + +## 7. Create Resources in AWS IoT + +### 7.1 Create an AWS IoT Policy + +Create an AWS IoT Policy document for your device to interact with AWS IoT services + +Navigate to IoT Core console > Manage > Security > Policy and click on “Create policy” + +__Note: A new policy must have a name and policy document.__ + +![](/zh/images/aws_quick_start/create_policy.png) + +Then chose Policy statements > Policy document > JSON and add policy. + +Sample Policy: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "iot:Publish", + "iot:Receive", + "iot:Subscribe" + ], + "Resource": [ + "*" + ] + }, + { + "Effect": "Allow", + "Action": [ + "iot:Connect" + ], + "Resource": [ + "arn:aws:iot:region:AWS-account-ID:client/*" + ] + } + ] +} +``` + +__Note: This policy should be used for testing only.__ + +### 7.2 Create a new Device + +Navigate to IoT Core console > Manage > All Devices > Things and click on “Create Things” + +![](/zh/images/aws_quick_start/create_things.png) + +Then click Create single thing + +![](/zh/images/aws_quick_start/create_single_thing.png) + +Then add the name of new device + +![](/zh/images/aws_quick_start/thing_properties.png) + +Then chose Auto-generate a new certificate (recommended) + +![](/zh/images/aws_quick_start/device_certificate.png) + +Then chose your policy + +![](/zh/images/aws_quick_start/attach_policies.png) + +Download the certificate, public key, and private key for the device. Next, download the root CA for AWS IoT. Finally, click Done. + +![](/zh/images/aws_quick_start/download_crts_keys.png) + +## 8. Provision the Device with credentials + +Make sure you have downloaded the k510_buildroot file in step four,put the file generated in step 7 into the certs folder,as shown in the figure + +![](/zh/images/aws_quick_start/certs_folder.png) + +Change variable name in `k510_buildroot/package/aws_iot_test/subscribe_publish_sample/aws_iot_config.h` file + +![](/zh/images/aws_quick_start/aws_iot_config.png) + +After all changes are completed, run the compiler on the premise that the build_root has been compiled + +```shell +cd k510_buildroot/k510_crb_lp3_v1_2_defconfig +make aws_iot_test-rebuild +``` + +After compilation, you can see the file in the `k510_buildroot/k510_crb_lp3_v1_2_defconfig/target/app/aws_iot_test` folder + +## 9. Build the demo + +Compile k510_buildreoot, aws_iot_test has been compiled in package, and the generated executable file is in `/app/aws_iot_test` + +## 10. Run the demo + +Test MQTT Connect + +Please enter the command on the serial port debugging page + +```shell +cd /app/aws_iot_test +./aws_iot_test +``` + +Display on the development k510 board + +![](/zh/images/aws_quick_start/aws_iot_test.png) + +AWS IoT certification display + +![](/zh/images/aws_quick_start/certification_display.png) + +Each time an individual item is verified, just run aws_iot_test directly, and the final result is displayed + +![](/zh/images/aws_quick_start/activity_log.png) + +## 11. Debugging + +During debugging, all log logs will be printed on the serial port debugging interface, as shown in the figure + +![](/zh/images/aws_quick_start/aws_iot_test_log.png) + +## 12. Troubleshooting + +In case of network fluctuation, the link fails. Just rerun the test program + +![](/zh/images/aws_quick_start/troubleshooting.png) diff --git a/zh/K510_Multimedia_Developer_Guides.md b/zh/K510_Multimedia_Developer_Guides.md index 0909b22..dfea13a 100644 --- a/zh/K510_Multimedia_Developer_Guides.md +++ b/zh/K510_Multimedia_Developer_Guides.md @@ -68,6 +68,37 @@ EncoderHandle* VIdeoEncoder_Create(EncSettings *pCfg) pCfg:输入编码配置参数 +| 参数名 | 参数解释 | 取值范围 | 适用编码模块 | +| :---------------------------: | :----------------------------------------------------------- | :----------------------------------------------------------: | ------------ | +| channel | 通道号,最多支持8个编码通道 | [0,7] | jpeg、avc | +| width | 编码图像宽度 | avc: [128,2048], multiple of 8
jpeg: up to 8192, multiple of 16 | jpeg、avc | +| height | 编码图像高度 | avc: [64,2048], multiple of 8
jpeg: up to 8192, multiple of 2 | jpeg、avc | +| FrameRate | 帧率,只能配置为固定几个值 | (25,30,50,60,75) | jpeg、avc | +| rcMode | 码率控制模式 0:CONST_QP 1:CBR 2:VBR
jpeg固定为CONST_QP | 参见RateCtrlMode | jpeg,avc | +| BitRate | CBR 模式下的目标码率或VBR模式下的最低码率 | [10,20000000] | avc | +| MaxBitRate | VBR模式下的最高码率 | [10,20000000] | avc | +| SliceQP | 初始 QP 值,-1表示auto | avc:-1,[0,51]
jpeg:[1,100] | jpeg,avc | +| MinQP | 最小qp值 | [0,sliceqp] | avc | +| MaxQP | 最大qp值 | [sliceqp,54] | avc | +| profile | SPS 中的 profile_idc 参数:0: base 1:main 2:high 3:jpeg | [0,3] | jpeg,avc | +| level | PS 中的 level_idc 参数 | [10,42] | avc | +| AspectRatio | 显示比例 | 参见AVC_AspectRatio | jpeg,avc | +| FreqIDR | 两个idr帧的间隔 | [1,1000] | avc | +| gopLen | Group Of Picture,即两个 I 帧之间的间隔 | [1,1000] | avc | +| bEnableGDR | 是否启用帧内刷新 | [true,false] | avc | +| gdrMode | gdr 刷新模式:0,垂直刷新 1,水平刷新 | 参见GDRCtrlMode | avc | +| bEnableLTR | 是否启用长期参考帧 | [true,false] | avc | +| roiCtrlMode | roi控制模式:0:不使用roi 1:相对qp 2:绝对qp | 参见ROICtrlMode | avc | +| EncSliceSplitCfg | slice 分割配置 | | avc | +| bSplitEnable | Slice 分割是否使能 | [true,false] | avc | +| u32SplitMode | Slice 分割模式:0:按 bit 数分割。
1:按宏块行分割 | [0,1] | avc | +| u32SliceSize | u32SplitMode=0,表示每个 slice 的 byte 数
u32SplitMode=1,表示每个 slice 占的宏块行数
| u32SplitMode=0,[100,65535]
u32SplitMode=1,[1,(图像高+15)/16] | avc | +| entropyMode | 熵编码,0:CABAC 1:CAVLC | 参见EncEntropyMode | avc | +| encDblkCfg | 区块滤波配置 | | avc | +| disable_deblocking_filter_idc | 默认值0,具体含义请参见 H.264 协 议 | [0,2] | avc | +| slice_alpha_c0_offset_div2 | 默认值0,具体含义请参见 H.264 协 议 | [-6,6] | avc | +| slice_beta_offset_div2 | 默认值0,具体含义请参见 H.264 协 议 | [-6, 6] | avc | + ```c typedef struct { @@ -89,8 +120,12 @@ typedef struct bool bEnableGDR;//gdr GDRCtrlMode gdrMode; bool bEnableLTR;//Long Term reference + ROICtrlMode roiCtrlMode; -} EncSettings; + EncSliceSplitCfg sliceSplitCfg; + EncEntropyMode entropyMode;//Profile is set to AVC_MAIN or AVC_HIGH is valid + EncDblkCfg encDblkCfg; +}EncSettings; typedef enum { CONST_QP, @@ -137,6 +172,25 @@ typedef enum GDR_HORIZONTAL, GDR_CTRLMAX, } GDRCtrlMode; +typedef struct +{ + bool bSplitEnable; + unsigned int u32SplitMode; // 0:splite by byte; 1:splite by slice count + unsigned int u32SliceSize; +}EncSliceSplitCfg; + +typedef enum +{ + ENTROPY_MODE_CABAC = 0, + ENTROPY_MODE_CAVLC, +}EncEntropyMode; + +typedef struct +{ + unsigned int disable_deblocking_filter_idc;//[0,2] + int slice_alpha_c0_offset_div2;//[-6,6] + int slice_beta_offset_div2;//[-6,6] +}EncDblkCfg; ``` 【返回值】 @@ -188,7 +242,7 @@ typedef struct ```text uIndex - 指定该roi区域索引号,范围0-7最多支持8个区域 bEnable - 指定该区域是否使能,只有使能的区域才有效 -uQpValue - qp值,可以是相对qp或绝对qp,qp模式由EncSettings中roiCtrlMode属性决定。绝对qp范围 [0,51],相对qp范围[-32,31] +uQpValue - qp值,可以是相对qp或绝对qp,qp模式由EncSettings中roiCtrlMode属性决定。绝对qp范围 [0,51],相对qp范围[-31,31] stRect - roi矩形区域,s32X矩形左上角x值,s32Y矩形左上角y值,u32Width矩形宽度,u32Height矩形高度 ``` @@ -254,7 +308,39 @@ typedef enum }EncStatus; ``` -### 1.2.5 VideoEncoder_Destory +### 1.2.5 VideoEncoder_InsertUserData + +【描述】 + +插入用户数据。 + +在编码器创建后到销毁前均可使用,编码过程中可以实时修改用户数据内容。用户数据将被插入到IDR帧的SEI数据区域。 + +【语法】 + +```c +EncStatus VideoEncoder_InsertUserData(EncoderHandle *hEnc,char*pUserData,unsigned int nlen); +``` + +【参数】 + +hEnc: 创建时返回的句柄 + +pUserData:用户数据指针 + +nlen:用户数据长度(0, 1024] + +【返回值】 + +```c +typedef enum +{ + Enc_SUCCESS = 0, + Enc_ERR = 1, +}EncStatus; +``` + +### 1.2.6 VideoEncoder_Destory 【描述】 @@ -280,7 +366,7 @@ typedef enum }EncStatus; ``` -### 1.2.6 VideoEncoder_EncodeOneFrame +### 1.2.7 VideoEncoder_EncodeOneFrame 【描述】 @@ -315,11 +401,11 @@ Enc_SUCCESS = 0, Enc_ERR = 1 ``` -### 1.2.7 VideoEncoder_GetStream +### 1.2.8 VideoEncoder_GetStream 【描述】 -获取视频编码流的buffer +获取视频编码流的buffer,注:该buffer空间由编码器内部分配。 【语法】 @@ -348,7 +434,40 @@ Enc_SUCCESS = 0, Enc_ERR = 1 ``` -### 1.2.8 VideoEncoder_ReleaseStream +### 1.2.9 VideoEncoder_GetStream_ByExtBuf + +【描述】 + +获取视频编码流的buffer,注:该buffer空间需由使用者调用此函数前分配。 + +【语法】 + +```c +EncStatus VideoEncoder_GetStream(EncoderHandle *hEnc, EncOutputStream *output) +``` + +【参数】 + +hEnc: 创建时返回的句柄 + +output:输出编码后的流数据buffer,bufSize大于0才有输出 + +```c +typedef struct +{ + unsigned char *bufAddr; + unsigned int bufSize; +}EncOutputStream; +``` + +【返回值】 + +```c +Enc_SUCCESS = 0, +Enc_ERR = 1 +``` + +### 1.3.0 VideoEncoder_ReleaseStream 【描述】 @@ -405,32 +524,33 @@ K510的硬件框图如下: 运行`encode_app` -| 参数名 | 参数解释 | 默认值 | 取值范围 | -|:-|:-|:-|:-| -| help | 帮助信息| | | -| split | 通道个数 | NULL | | -| ch | 通道号(从0开始) | NULL | | -| i | 输入yuv文件,只支持**nv12**格式 | NULL | v4l2
xxx.yuv | -| dev | v4l2 device name | NULL | | -| o | 输出| NULL | rtsp
xxx.264
xxx.MJPEG
xxx.JPEG | -| w | 输出图像宽度 | 1920 | | -| h | 输出图像高度 | 1080 | | -| fps | 摄像头采集帧率,目前只支持30pfs | 30 | 30 | -| r | 编码输出帧率 | 30 | | -| inframes | 输入yuv帧数 | NULL | | -| outframes | 输出yuv帧数,如果比参数-inframes大,将会重复编码 | NULL | | -| gop | Group Of Picture,即两个 I 帧之间的间隔 | 25 | | -| rcmode | 表示码率控制模式 0:CONST_QP 1:CBR 2:VBR | CBR | [0,2] | -| bitrate | CBR 模式下的目标码率或VBR模式下的最低码率,单位Kb | 4000 | | -| maxbitrate | VBR模式下的最高码率,单位Kb | 4000 | | -| profile | SPS 中的 profile_idc 参数:0: base 1:main 2:high 3:jpeg | AVC_HIGH | [0,3] | -| level | SPS 中的 level_idc 参数 | 42 | [10,42] | -| sliceqp | 初始 QP 值,-1表示auto | 25 | avc:-1,[0,51]
jpeg:[1,100] | -| minqp | 最小QP 值 | 0 | [0,sliceqp] | -| maxqp | 最大QP值 | 54 | [sliceqp,54] | -| enableLTR | 使能长期参考帧,参数指定刷新周期。0:不启用刷新周期。正数:周期性设置参考帧并且下一帧设置为使用长期参考帧 | 0 | [0,65535] | -| roi | roi配置文件,指定多个roi区域 | NULL | | -| conf | vl42配置文件,会指定的配置文件的基础上,根据命令行输入参数修改v4l2配置参数 | NULL | | +| 参数名 | 参数解释 | 默认值 | 取值范围 | 适用编码模块 | +|:-|:-|:-|:-|:-| +| help | 帮助信息| | || +| split | 通道个数 | NULL | [1,4] | jpeg、avc | +| ch | 通道号(从0开始) | NULL | [0,3] | jpeg、avc | +| i | 输入yuv文件,只支持**nv12**格式 | NULL | v4l2
xxx.yuv | jpeg、avc | +| dev | v4l2 device name | NULL | **sensor0:**
/dev/video3
/dev/video4
**sensor1:**
/dev/video7
/dev/video8 | avc | +| o | 输出| NULL | rtsp
xxx.264
xxx.MJPEG
xxx.JPEG | jpeg、avc | +| w | 输出图像宽度 | 1920 | avc: [128,2048], multiple of 8
jpeg: up to 8192, multiple of 16 | jpeg、avc | +| h | 输出图像高度 | 1080 | avc: [64,2048], multiple of 8
jpeg: up to 8192, multiple of 2 | jpeg、avc | +| fps | 摄像头采集帧率,目前只支持30pfs | 30 | 30 | avc | +| r | 编码输出帧率 | 30 | 能整除fps或者被fps整除的数 | avc | +| inframes | 输入yuv帧数 | 0 | [0,32767] | jpeg、avc | +| outframes | 输出yuv帧数,如果比参数-inframes大,将会重复编码 | 0 | [0,32767] | jpeg、avc | +| gop | Group Of Picture,即两个 I 帧之间的间隔 | 25 | [1,1000] | avc | +| rcmode | 表示码率控制模式 0:CONST_QP 1:CBR 2:VBR | CBR | [0,2] | avc | +| bitrate | CBR 模式下的目标码率或VBR模式下的最低码率,单位Kb | 4000 | [1,20000] | avc | +| maxbitrate | VBR模式下的最高码率,单位Kb | 4000 | [1,20000] | avc | +| profile | SPS 中的 profile_idc 参数:0: base 1:main 2:high 3:jpeg | AVC_HIGH | [0,3] | jpeg、avc | +| level | SPS 中的 level_idc 参数 | 42 | [10,42] | avc | +| sliceqp | 初始 QP 值,-1表示auto | 25 | avc:-1,[0,51]
jpeg:[1,100] | jpeg、avc | +| minqp | 最小QP 值 | 0 | [0,sliceqp] | avc | +| maxqp | 最大QP值 | 54 | [sliceqp,54] | avc | +| enableLTR | 使能长期参考帧,参数指定刷新周期。0:不启用刷新周期。正数:周期性设置参考帧并且下一帧设置为使用长期参考帧 | 0 | [0,65535] | avc | +| roi | roi配置文件,指定多个roi区域 | NULL | xxx.conf | avc | +| ae | 使能AE | 0 | 0-不使能AE
1-使能AE | +| conf | vl42配置文件,会指定的配置文件的基础上,根据命令行输入参数修改v4l2配置参数 | NULL | xxx.conf | avc | ### 3.1.1 输入yuv文件,输出文件 @@ -447,18 +567,30 @@ K510的硬件框图如下: ./encode_app -split 1 -ch 0 -i v4l2 -dev /dev/video3 -o rtsp -w 1920 -h 1080 -conf video_sample.conf ``` +ffplay拉流命令示例: + +```shell + ffplay -rtsp_transport tcp rtsp://192.168.137.11:8554/testStream +``` + +- `rtsp://192.168.137.11:8554/testStream`为rtsp流url地址 ,-rtsp_transport tcp表示使用tcp传输音视频数据(默认使用udp),可增加-fflags nobuffer选项来避免因播放器缓存而增加的延迟。 + #### 3.1.2.2 单摄像头双通道 ```shell ./encode_app -split 2 -ch 0 -i v4l2 -dev /dev/video3 -o rtsp -w 1920 -h 1080 -ch 1 -i v4l2 -dev /dev/video4 -o rtsp -w 1280 -h 720 -conf video_sample.conf ``` +ffplay拉流命令同上。 + #### 3.1.2.3 双摄像头 ```shell ./encode_app -split 2 -ch 0 -i v4l2 -dev /dev/video3 -o rtsp -w 1920 -h 1080 -ch 1 -i v4l2 -dev /dev/video7 -o rtsp -w 1920 -h 1080 -conf video_sample.conf ``` +ffplay拉流命令同上。 + #### 3.1.2.4 roi测试 ```shell @@ -476,8 +608,8 @@ roi文件格式 "qpRegion": { "left": 0, "top": 0, - "width": 640, - "heigth": 1080 + "width": 500, + "heigth": 500 } } ] @@ -489,7 +621,7 @@ roi文件格式 ```text roiCtrMode - 1:相对qp 2:绝对qp roiRegion - roi区域,为多个区域数组,最多支持8个区域。 -qpValue - 指定该区域使用的qp值,相对qp范围:[-32,31] 绝对qp范围:[0,51] +qpValue - 指定该区域使用的qp值,相对qp范围:[-31,31] 绝对qp范围:[0,51] qpRegion - roi矩形区域 left - 矩形区域的左上角X坐标 top - 矩形区域的左上角Y坐标 @@ -497,10 +629,7 @@ width - 矩形区域的宽度 heigth - 矩形区域的高度 ``` -- 运行环境:核心板sensor:IMX219_SENSOR -- rtsp运行准备参见live555_canaan章节 -- live555拉流的端口号为(8554 + <通道号>*2) -- rtsp运行准备参见live555_canaan章节 +ffplay拉流命令同上。 ### 3.1.3 帧率变换 @@ -508,6 +637,8 @@ heigth - 矩形区域的高度 ./encode_app -split 1 -ch 0 -i v4l2 -dev /dev/video3 -r 60 -o rtsp -w 1920 -h 1080 -conf video_sample.conf ``` +ffplay拉流命令同上。 + ### 3.1.4 多种输入帧率 目前支持VGA@75fps和720p60 @@ -517,33 +648,31 @@ heigth - 矩形区域的高度 ./encode_app -split 1 -ch 0 -i v4l2 -dev /dev/video3 -o rtsp -w 1280 -h 720 -fps 60 -r 60 -conf video_sample_720p60.conf ``` -## 3.2 live555_canaan +ffplay拉流命令同上。 -live555 demo程序放在`/app/live555_canaan`目录下: +### 3.1.5 rtsp推送音视频流 -- `VideoStreamerFile` :rtsp推流程序 +```c +./encode_app -split 1 -ch 0 -i v4l2 -dev /dev/video3 -o rtsp -w 1920 -h 1080 -alsa 1 -ac 2 -ar 44100 -af 2 -ad hw:0 -conf video_sample.conf +``` -运行准备: -(1)开发板需要与接收端pc连接到同一个局域网内,ip地址通过DHCP自动分配。 -(2)接收端PC VLC配置 +ffplay拉流命令同上。 -媒体->打开网络流串->网络,配置网络URL,如下图所示(rtsp://10.100.226.130:8554/testStream),其中10.100.226.21为开发板的ip地址,根据实际情况修改。点击下图红框按钮,打开循环单曲。 +### 3.1.6 注意事项 -![LIVE555 Demo](images/sdk_application/demo_rtsp.png) +- 运行环境:核心板sensor:IMX219_SENSOR -运行live555 demo: +- live555拉流的端口号为(8554 + <通道号>*2) -```shell -./VideoStreamerFile old_town_cross_1080p50.264 -``` +- 播放rtsp流方式:可通过vlc或ffplay来播放对应的rtsp流,数据流可以通过udp或tcp协议传输。 -其中, + 1)rtp over udp播放:ffplay -rtsp_transport udp rtsp://192.168.137.11:8556/testStream -- `old_town_cross_1080p50.264` :用于测试的264文件 + 2)rtp over tcp 播放: ffplay -rtsp_transport tcp rtsp://192.168.137.11:8556/testStream -运行结果: VLC上循环播放测试视频。 + 建议使用rtp over tcp方式播放,避免因udp丢包导致画面花屏。 -## 3.3 ffmpeg +## 3.2 ffmpeg ffmpeg放在/usr/local/bin目录下。 @@ -551,22 +680,38 @@ ffmpeg放在/usr/local/bin目录下。 运行`ffmpeg` -(1) encoder参数 +(1) encoder libk510_h264参数 | 参数名 | 参数解释 | 默认值 | 取值范围 | |:-|:-|:-|:-| -| g | gop size | 25 | 0~1000 | -| b | bitrate | 4000000 | 0~100000000 | +| g | gop size | 25 | 1~1000 | +| b | bitrate | 4000000 | 0~20000000 | | r | 帧率,由于isp目前只支持30fps,故解码器应设置为30 | 30 | 30 | | idr_freq | IDR频率 | -1(没有IDR) | -1~256 | -| qp | 用cqp编码时,配置qp值 | -1 | -1~100 | -| maxrate | bitrate的最大值 | 0 | 100000000 | +| qp | 用cqp编码时,配置qp值 | -1(auto) | -1~100 | +| maxrate | bitrate的最大值 | 0 | 20000000 | | profile | 支持的profile | 2(high) | 0 - baseline
1 - main
2 - high | | level | 编码level | 42 | 10~42 | | ar | 屏幕宽高比 | 0(auto) | 0 - auto
1 - 4:3
2 - 16:9
3 - none | | ch | channel number | 0 | 0-7 | | framesToEncode | 编码帧数 | -1(所有帧) | -1~16383 | -(2) audio3a参数 +(2) encoder libk510_jpeg参数 +| 参数名 | 参数解释 | 默认值 | 取值范围 | +|:-|:-|:-|:-| +| qp | 用cqp编码时,配置qp值 | 25 | -1~100 | +| r | framerate | 30 | 25~60 | +| ch | encode channel | 0 | 0~7 | +| maxrate | Maximum bitrate. (0=ignore) | 4000000 | 0~20000000 | +| ar | aspect ratio | 0(auto) | 0 - auto
1 - 4:3
2 - 16:9
3 - none | + +(3) device libk510_video参数 +| 参数名 | 参数解释 | 默认值 | 取值范围 | +|:-|:-|:-|:-| +| wh | frame size | NULL | **for encoder libk510_h264:**:
up to 2048x2048
width multiple of 8
height multiple of 8
min. width: 128
min. height: 64
**for encoder libk510_jpeg:**
up to 8192x8192
width multiple of 16
height multiple of 2 | +| exp | exposure parameter | 0 | 0~128 | +| agc | analog gain | 0 | 0~232 | + +(4) audio3a参数 | 参数名 | 参数解释 | 默认值 | 取值范围 | |:-|:-|:-|:-| | sample_rate | 音频采样率 | 16000 | 1~65535 | @@ -590,11 +735,11 @@ audio3a用于将接收到的音频进行3a运算并输出,其逻辑框图如 ![ffmpeg_canaan_audio3a](images/multimedia_guides/ffmpeg_canaan_audio3a.png) -### 3.3.1 程序运行说明 +### 3.2.1 程序运行说明 -#### 3.3.1.1 rtp推流 +#### 3.2.1.1 rtp推流 -##### 3.3.1.1.1. rtp推送视频流 +##### 3.2.1.1.1. rtp推送视频流 ffmpeg运行命令示例: @@ -632,7 +777,7 @@ a=fmtp:96 packetization-mode=1 - m=是媒体级会话的开始处,video:媒体类型;1234:端口号;RTP/AVP:传输协议;96:rtp头中的payload格式 按照实际情况修改接收端IP地址和端口号,注意rtp的端口号需为偶数。 -##### 3.3.1.1.2. rtp推送音频流 +##### 3.2.1.1.2. rtp推送音频流 ffmpeg运行命令示例: @@ -661,7 +806,7 @@ a=rtpmap:97 MPEG4-GENERIC/32000/2 a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=129056E500 ``` -##### 3.3.1.1.3 rtp推送音视频流 +##### 3.2.1.1.3 rtp推送音视频流 ffmpeg运行命令示例: @@ -689,11 +834,11 @@ a=rtpmap:97 MPEG4-GENERIC/32000/2 a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=129056E500 ``` -#### 3.3.1.2 rtsp推流 +#### 3.2.1.2 rtsp推流 rtsp推流前需要部署rtsp服务器,将数据流推送到服务器上。 -##### 3.3.1.2.1 rtsp推视频流 +##### 3.2.1.2.1 rtsp推视频流 ffmpeg运行命令示例: @@ -710,7 +855,7 @@ ffplay拉流命令示例: ffplay.exe -protocol_whitelist "file,udp,rtp,tcp" -i rtsp://10.100.232.11:5544/live/test110 ``` -##### 3.3.1.2.2 rtsp推音频流 +##### 3.2.1.2.2 rtsp推音频流 ffmpeg运行命令示例: @@ -720,7 +865,7 @@ ffmpeg -f alsa -ac 2 -ar 32000 -i hw:0 -acodec aac -f rtsp rtsp://10.100.232.11: ffplay拉流命令与rtsp拉视频流的命令相同。 -##### 3.3.1.2.3 rtsp推音视频流 +##### 3.2.1.2.3 rtsp推音视频流 ffmpeg运行命令示例: @@ -730,11 +875,11 @@ ffmpeg -f v4l2 -s 1920x1080 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 - ffplay拉流命令与rtsp拉视频流的命令相同。 -#### 3.3.1.3 rtmp推流 +#### 3.2.1.3 rtmp推流 rtmp推流前需要部署rtmp服务器,将数据流推送到服务器上。支持rtmp协议的服务器包括fms,nginx,srs等。 -##### 3.3.1.3.1 rtmp推视频流 +##### 3.2.1.3.1 rtmp推视频流 ffmpeg运行命令示例: @@ -747,12 +892,12 @@ ffmpeg -f v4l2 -s 1920x1080 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 - ffplay拉流命令示例: ```shell -ffplay rtmp://10.100.232.11/live/1 +ffplay -fflags nobuffer rtmp://10.100.232.11/live/1 ``` -- `rtmp://10.100.232.11/live/1`为从rtmp服务器拉流的url地址 (推流和拉流的地址一样) +- `rtmp://10.100.232.11/live/1`为从rtmp服务器拉流的url地址 (推流和拉流的地址一样),-fflags nobuffer选项来避免因播放器缓存而增加的延迟。 -##### 3.3.1.3.2 rtmp推视音频流 +##### 3.2.1.3.2 rtmp推视音频流 ffmpeg运行命令示例: @@ -764,7 +909,7 @@ ffmpeg -f alsa -ac 2 -ar 32000 -i hw:0 -acodec aac -f flv rtmp://10.100.232.11/l ffplay拉流命令与rtmp拉视频流的命令相同。 -##### 3.3.1.3.3 rtmp推视音视频流 +##### 3.2.1.3.3 rtmp推视音视频流 ffmpeg运行命令示例: @@ -776,9 +921,9 @@ ffmpeg -f v4l2 -s 1920x1080 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 - ffplay拉流命令与rtmp拉视频流的命令相同。 -#### 3.3.1.4 audio3a +#### 3.2.1.4 audio3a -##### 3.3.1.4.1 单独运行audio +##### 3.2.1.4.1 单独运行audio (1) 在cpu上运行audio3a ffmpeg运行命令示例: @@ -802,7 +947,7 @@ ffmpeg运行命令实例: ffmpeg -f alsa -ac 2 -ar 16000 -i hw:0 -af audio3a=sample_rate=16000 -f rtp rtp://10.100.232.11:1234 ``` -##### 3.3.1.4.2 同时运行audio3a和video +##### 3.2.1.4.2 同时运行audio3a和video (1) 在cpu上运行audio3a 运行两个telnet窗口,在两个窗口中分别运行audio3a和video。 @@ -838,7 +983,7 @@ ffmpeg -f v4l2 -s 1920x1080 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 - - 10.100.232.11为rtp接收端的ip地址。 - 接收端ffplay的SDP文件内容,可以在运行上述ffmpeg命令后,从打印出来的log得到。 -#### 3.3.1.5 v4l2 +#### 3.2.1.5 v4l2 可以通过help命令查看可配置参数 @@ -864,9 +1009,12 @@ ffmpeg -f v4l2 -s 1920x1080 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 - ffmpeg -f v4l2 -s 1920x1080 -conf "video_sample.conf" -isp 1 -i /dev/video3 -vcodec copy -y out.yuv ``` -说明:运行时需要在运行目录中查找`video_sampe.conf`、`imx219_0.conf`和`imx219_1.conf`文件进行配置,这三个文件在`/encode_app/`目录下。 +说明: + +1. 运行时需要在运行目录中查找`video_sampe.conf`、`imx219_0.conf`和`imx219_1.conf`文件进行配置,这三个文件在`/encode_app/`目录下。 +2. 摄像头实时进来的视频写成yuv文件,由于yuv文件很大,本地ddr或者nfs的写速度跟不上,可能导致丢帧。 -#### 3.3.1.6 JPEG编码 +#### 3.2.1.6 JPEG编码 文件输出: @@ -890,7 +1038,7 @@ ffmpeg -f v4l2 -s 1920x1080 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 - 可用ffplay拉流 -#### 3.3.1.7 多路编码 +#### 3.2.1.7 多路编码 最多支持8路同时编码,可用每路的帧大小乘以帧率再相加,不要超过1080p60的数据量,-vcodec可选h264或者jpeg. @@ -904,7 +1052,7 @@ ffmpeg -f v4l2 -s 480x360 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 -i 用ffplay拉流时,注意只能拉一路视频,通过改变SDP文件里的端口号切换其他路的视频,或者启动多个ffplay拉流。 -### 3.3.2 程序移植说明 +### 3.2.2 程序移植说明 `ffmpeg`在`ffmpeg`开源代码4.4的版本上进行移植,`xxx.patch`为补丁包,增加了 @@ -912,7 +1060,7 @@ ffmpeg -f v4l2 -s 480x360 -conf "video_sample.conf" -isp 1 -buf_type 2 -r 30 -i - `ff_libk510_jpeg_encoder`:控制jpeg硬件编码,引用了`libvenc.so` - v4l2:在v4l2.c里,加入了k510硬件相关代码,实现了v4l2 buffer类型V4L2_MEMORY_USERPTR,引用了`libmediactl.so`。 -#### 3.3.2.1 patch生成命令 +#### 3.2.2.1 patch生成命令 (1) @@ -932,7 +1080,7 @@ rm ../../patches/series sed -i "s/\/dl\/ffmpeg_canaan\/ffmpeg-4.4//g" ../../package/ffmpeg_canaan/xxx.patch ``` -#### 3.3.2.2 ffmpeg配置 +#### 3.2.2.2 ffmpeg配置 在`package/ffmpeg_canaan/ffmpeg.mk`文件中,可以通过configure选项修改CPU核、编译工具链,使能`ff_k510_video_demuxer` `ff_libk510_jpeg_encoder`和`ff_libk510_h264_encoder`。 diff --git a/zh/K510_SDK_Application_Guides.md b/zh/K510_SDK_Application_Guides.md index 564b026..2a05118 100644 --- a/zh/K510_SDK_Application_Guides.md +++ b/zh/K510_SDK_Application_Guides.md @@ -68,50 +68,53 @@ nncase 的demo程序源码位于SDK目录下的`package/ai`目录,目录结构 ```shell $ tree -L 2 ai ai -├── Config.in ├── ai.hash ├── ai.mk -└── code - ├── CMakeLists.txt - ├── build.sh - ├── cmake - ├── face_alignment - ├── face_detect - ├── face_expression - ├── face_landmarks - ├── face_recog - ├── hand_image_classify - ├── head_pose_estimation - ├── imx219_0.conf - ├── imx219_1.conf - ├── license_plate_recog - ├── object_detect - ├── object_detect_opencv - ├── object_detect_v4l2 - ├── openpose - ├── person_detect - ├── retinaface_mb_320_opencv - ├── retinaface_mb_320_v4l2 - ├── self_learning - ├── shell - ├── simple_pose - ├── video_object_detect_320.conf - ├── video_object_detect_320x320.conf - ├── video_object_detect_432x368.conf - ├── video_object_detect_512.conf - ├── video_object_detect_640.conf - └── video_object_detect_640x480.conf +├── code +│   ├── build.sh +│   ├── cmake +│   ├── CMakeLists.txt +│   ├── common +│   ├── face_alignment +│   ├── face_detect +│   ├── face_expression +│   ├── face_landmarks +│   ├── face_recog +│   ├── hand_image_classify +│   ├── head_pose_estimation +│   ├── imx219_0.conf +│   ├── imx219_1.conf +│   ├── license_plate_recog +│   ├── object_detect +│   ├── object_detect_demo +│   ├── openpose +│   ├── person_detect +│   ├── retinaface_mb_320 +│   ├── self_learning +│   ├── shell +│   ├── simple_pose +│   ├── video_192x320.conf +│   ├── video_object_detect_320.conf +│   ├── video_object_detect_320x320.conf +│   ├── video_object_detect_432x368.conf +│   ├── video_object_detect_512.conf +│   ├── video_object_detect_640.conf +│   └── video_object_detect_640x480.conf +└── Config.in ``` -可以参考retinaface_mb_320_v4l2的源码和`CMakeLists.txt`添加新的nncase 的demo程序。 +可以参考retinaface_mb_320的源码和`CMakeLists.txt`添加新的nncase 的demo程序。 模型的编译参见`nncase_demo.mk`里面定义的*POST_INSTALL_TARGET_HOOKS*: ```text NNCASE_DEMO_DEPENDENCIES += mediactl_lib nncase_linux_runtime opencv4 libdrm define NNCASE_DEMO_COMPILE_MODEL -cd $(@D) && /usr/bin/python3 retinaface_mb_320_opencv/data/rf_onnx.py --quant_type uint8 --model retinaface_mb_320_opencv/data/retinaface_mobile0.25_320.onnx -cp $(@D)/rf.kmodel $(TARGET_DIR)/app/nncase_demo/retinaface_mb_320_opencv/rf_uint8.kmodel + mkdir -p $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320 + cd $(@D) && /usr/bin/python3 retinaface_mb_320/rf_onnx.py --quant_type uint8 --model ai_kmodel_data/model_file/retinaface/retinaface_mobile0.25_320.onnx + cp $(@D)/rf.kmodel $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320/rf_uint8.kmodel + cd $(@D) && /usr/bin/python3 retinaface_mb_320/rf_onnx.py --quant_type bf16 --model ai_kmodel_data/model_file/retinaface/retinaface_mobile0.25_320.onnx + cp $(@D)/rf.kmodel $(TARGET_DIR)/app/ai/kmodel/kmodel_compile/retinaface_mb_320/rf_bf16.kmodel NNCASE_DEMO_POST_INSTALL_TARGET_HOOKS += NNCASE_DEMO_COMPILE_MODEL ``` @@ -123,14 +126,10 @@ NNCASE_DEMO_POST_INSTALL_TARGET_HOOKS += NNCASE_DEMO_COMPILE_MODEL 功能:人脸检测,人脸特征点检测 程序路径: -`/app/ai/retinaface_mb_320_v4l2` -`/app/ai/retinaface_mb_320_opencv` -分别是基于v4l2接口编程和基于opencv接口编程。 -基于v4l2接口编程,由用户自行管理内存,可以减少图像的拷贝操作,提升效率。 -基于opencv接口编程,opencv内部也是调用v4l2接口,并且增加了内存管理操作,所以用户不能管理内存,无法避免图像的拷贝。 +`/app/ai/shell` 运行: -执行非量化模型,`./bf16.sh` -执行uint8量化模型,`./uint8.sh` +执行非量化模型,`./retinaface_mb_320_bf16.sh` +执行uint8量化模型,`./retinaface_mb_320_uint8.sh` 脚本里面有关于QOS的设置,下面的两个demo的设置一样。 @@ -167,24 +166,23 @@ QOS 控制寄存器3(QOS_CTRL3) offset[0x0100] 模型的编译安装详见文件package/ai/ai.mk: 编译脚本路径: -package/ai/code/retinaface_mb_320_opencv/data/rf_onnx.py +package/ai/code/retinaface_mb_320/rf_onnx.py ### 1.1.3 object_detect 功能:物体分类检测,80分类 程序路径: -`/app/ai/object_detect_v4l2` -`/app/ai/object_detect_opencv` +`/app/ai/shell` 运行: -执行非量化模型,`./bf16.sh` -执行uint8量化模型,`./uint8.sh` +执行非量化模型,`./object_detect_demo_bf16.sh` +执行uint8量化模型,`./object_detect_demo_uint8.sh` 模型的编译安装详见文件package/ai/ai.mk 编译脚本路径: -package/ai/code/object_detect_opencv/data/od_onnx.py +package/ai/code/object_detect_demo/od_onnx.py ## 1.2 ffmpeg @@ -226,7 +224,7 @@ cd /app/twod_app ./twod-rotation-app ``` -将ouput.yuv 拷到yuv显示器上设置尺寸1080 x 1920,结果如下 +将ouput.yuv 拷到yuv显示器上设置尺寸1080 x 1920,显示格式nv12,结果如下 ![output.yuv](images/sdk_application/driver-twod-output-1080x1920.jpg) scaler 使用方法 @@ -236,9 +234,39 @@ cd /app/twod_app ./twod-scaler-app ``` -将ouput.yuv 拷到yuv显示器上设置尺寸640x480,结果如下 +将ouput.yuv 拷到yuv显示器上设置尺寸640x480,显示格式nv12,结果如下 ![ouput.yuv](images/sdk_application/driver-twod-output-640x480.jpg) +运行 rgb2yuv 使用方法: + +```shell +cd /app/twod_app +./twod-osd2yuv-app +``` + +将ouput.yuv 拷到yuv 显示器上设置尺寸320x240,显示格式nv12,结果如下 +![ouput.yuv](images/sdk_application/twod-osd2yuv-app.jpg) + +运行 yuv2rgb 使用方法: + +```shell +cd /app/twod_app +./twod-scaler-output-rgb888-app +``` + +将ouput.yuv 拷到rgb888显示器上设置尺寸640x480,显示格式rgb24,结果如下 +![ouput.yuv](images/sdk_application/driver-twod-output-640x480.jpg) + +运行 输出yuv上叠加osd 使用方法: + +```shell +cd /app/twod_app +./twod-scaler-overlay-osd-app +``` + +将ouput.yuv 拷到显示器上设置尺寸640x480,显示格式nv12,结果如下 +![ouput.yuv](images/sdk_application/twod-scaler-overlay-osd-app.jpg) + API: ```c @@ -521,26 +549,7 @@ cd /app/drm_demo ![](images/sdk_application/image_drm_demo.png) -## 1.13 V4L2 demo - -v4l2 demo展示了摄像头输入的功能。 - -VI支持3路摄像头同时输入,2路2lane-MIPI和一路DVP。 - -ISP支持3路处理,F2K、R2K、TOF。每个处理核心又支持4路输出,1路原始大小输出和3路downsize输出,ds0-ds1输出支持YUV422和YUV420,ds2输出支持RGB和sRGB。 - -开发板启动后进入/app/mediactl_lib目录,输入命令: - -```shell -cd /app/mediactl_lib -./v4l2-demo -f video_drm_1080x1920.conf -或者 -./v4l2-demo -f video_drm_1920x1080.conf -``` - -启动v4l2_demo应用程序。 - -## 1.14 V4L2_DRM demo +## 1.13 V4L2_DRM demo v4l2_drm demo展示了摄像头输入和显示的功能。 @@ -557,7 +566,7 @@ cd /app/mediactl_lib ![](images/sdk_application/image_v4l2_drm_demo.png) -## 1.15 LVGL demo +## 1.14 LVGL demo 进入/app/lvgl,运行以下命令: @@ -569,7 +578,7 @@ cd /app/lvgl 显示效果如下: ![](images/sdk_application/image_lvgl.png) -## 1.16 PWM demo +## 1.15 PWM demo PWM驱动会注册生成/sys/class/pwm/pwmchip0和/sys/class/pwm/pwmchip3设备节点。 @@ -586,7 +595,7 @@ cd /app/pwm 通过示波器连接K510 CRB1.2开发板J15的28号引脚,可以示波器上观察到一个周期为1秒,占空比为50%的波形图。 -## 1.17 WIFI demo +## 1.16 WIFI demo WiFi模块驱动加载后会生成无线网卡wlan0,遵循标准网口驱动,正常参考TCP/IP socket编程。 @@ -605,7 +614,7 @@ WiFi模块驱动加载后会生成无线网卡wlan0,遵循标准网口驱动 ![](images/sdk_application/image_wifi_2.png) -## 1.18 GPIO_KEYS demo +## 1.17 GPIO_KEYS demo 按键驱动使用linux kernel自身集成的基于input子系统的通用gpio-keys驱动,驱动加载后在/dev/input目录下生成事件监控节点eventX,X为事件节点序号,可以通过cat /proc/bus/input/devices查看 diff --git a/zh/K510_SDK_Build_and_Burn_Guide.md b/zh/K510_SDK_Build_and_Burn_Guide.md index fa87f39..45be4d2 100644 --- a/zh/K510_SDK_Build_and_Burn_Guide.md +++ b/zh/K510_SDK_Build_and_Burn_Guide.md @@ -549,12 +549,14 @@ K510 支持sdcard和eMMC启动方式,每次编译时在k510_buildroot/k510_crb K510 通过 BOOT0 和 BOOT1 两个硬件管脚的状态决定芯片启动方式,具体设置请参考开发板的启动说明章节。 -| BOOT1 | BOOT0 | 启动方式 | -| ----- | ----- | ------------- | -| 0 | 0 | 串口启动 | -| 0 | 1 | SD卡启动 | -| 1 | 0 | NANDFLASH启动 | -| 1 | 1 | EMMC启动 | +| BOOT1 | BOOT0 | 启动方式 | +| ------- | ------- | ------------ | +| 0(ON) | 0(ON) | 串口启动 | +| 0(ON) | 1(OFF) | SD卡启动 | +| 1(OFF) | 0(ON) | NANDFLASH启动 | +| 1(OFF) | 1(OFF) | EMMC启动 | + +![](images/hw_crb_v1_2/clip_hw_3_9.jpg) ## 6.1 烧录镜像到sd卡 diff --git a/zh/K510_V4l2_Developer_Guides.md b/zh/K510_V4l2_Developer_Guides.md index 6a4f1ab..8dfcafb 100644 --- a/zh/K510_V4l2_Developer_Guides.md +++ b/zh/K510_V4l2_Developer_Guides.md @@ -1,294 +1,277 @@ -![](images/canaan-cover.png) - -**K510 V4L2 Developer's Guide** - -文档版本:V1.0.0 - -发布日期:2022-03-09 - -
- -**免责声明** -您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的准确性、可靠性、完整性、营销型、特定目的性和非侵略性提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导的参考。 -由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。 - -**商标声明** - -“”、“Canaan”图标、嘉楠和嘉楠其他商标均为北京嘉楠捷思信息技术有限公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 - -**版权所有©2022北京嘉楠捷思信息技术有限公司** -本文档仅适用K510平台开发设计,非经本公司书面许可,任何单位和个人不得以任何形式对本文档的部分或全部内容传播。 - -**北京嘉楠捷思信息技术有限公司** -网址:canaan-creative.com -商务垂询:salesAI@canaan-creative.com - -
-# 前言 -**文档目的** -本文档为K510 V4L2 应用实例的说明文档。 - -**读者对象** - -本文档(本指南)主要适用的人员: - -- 软件开发人员 -- 技术支持人员 - -**修订记录** -修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有版本的更新内容。 - -| 版本号 | 修改者 | 修订日期 | 修订说明 | -| :----- |------- | ------ | ------ | -| V1.0.0 | 系统软件组 | 2022-03-09 | SDK V1.5发布 | -| v1.0.1 | 朱大雷 | 2022-03-11 | SDK V1.5发布 | -| | | | | -| | | | | -| | | | | -| | | | | - -
-**目 录** - -[TOC] - -
- -# 1 V4L2 mediactl库 - -## 1.1 头文件说明 - -\#include “media_ctl.h” - -## 1.2 API 函数说明 - -### ◆ mediactl_init - -```c -struct video_info { - unsigned int video_used; - char *video_name[4]; - unsigned int enable[4]; - unsigned int video_width[4]; - unsigned int video_height[4]; - unsigned int video_out_format[4]; -}; - -int mediactl_init(char *video_cfg_file,struct video_info *dev_info); -``` - -初始化media。 - -#### 参数 - -```text -参数: -[in] video_cfg_file: video的配置文件,这个文件的内容只需关心下面解释的内容,具体解释如下。 -sensor0_name:只在V4L2驱动中设置的sensor驱动名字。 -sensor0_cfg_file:sensor对应的isp参数配置文件名字,如imx219_0.conf。 -sensor0_total_width:sensor输出的水平方向的总像素,用来产生VSYNC信号,如3476 -sensor0_total_height:sensor输出的总行数,用来产生HSYNC信号,如1166 -sensor0_active_width:sensor输出的水平方向的有效像素,如1920, -sensor0_active_height:sensor输出的有效行数,如1080 -video2_used:1 -- 使能,0 -- 没有使用。 -video2_width:video输出的宽度,如1920。 -video2_height:video输出的高度,如1080。 -video2_out_format:1--指YUV420,NV21。 -video3_used:1 -- 使能,0 -- 没有使用。 -video3_width:video输出的宽度,如1080。 -video3_height:video输出的高度,如720。 -video3_out_format:1--指YUV420,NV21。 -video4_used:1 -- 使能,0 -- 没有使用。 -video4_width:video输出的宽度,如640。 -video4_height:video输出的高度,如480。 -video4_out_format:1--指YUV420,NV21。 -video5_used:1 -- 使能,0 -- 没有使用。 -video5_width:video输出的宽度,如320。 -video5_height":video存储的高度,如320。 -video5_height_r:video输出的高度,如240。 -video5_out_format:0--指分离RGB,1--指ARGB。 -sensor1_name:只在V4L2驱动中设置的sensor驱动名字。 -sensor1_cfg_file:sensor对应的isp参数配置文件名字,如imx219_0.conf。 -sensor1_total_width:sensor输出的水平方向的总像素,用来产生VSYNC信号,如3476 -sensor1_total_height:sensor输出的总行数,用来产生HSYNC信号,如1166 -sensor1_active_width:sensor输出的水平方向的有效像素,如1920, -sensor1_active_height:sensor输出的有效行数,如1080 -video6_used:1 -- 使能,0 -- 没有使用。 -video6_width:video输出的宽度,如1920。 -video6_height:video输出的高度,如1080。 -video6_out_format:1--指YUV420,NV21。 -video7_used:1 -- 使能,0 -- 没有使用。 -video7_width:video输出的宽度,如1080。 -video7_height:video输出的高度,如720. -video7_out_format:1--指YUV420,NV21。 -video8_used:1 -- 使能,0 -- 没有使用。 -video8_width:video输出的宽度,如640。 -video8_height:video输出的高度,如480。 -video8_out_format:1--指YUV420,NV21。 -video9_used:1 -- 使能,0 -- 没有使用。 -video9_width:video输出的宽度,如320。 -video9_height:video存储的宽度,如320。 -video9_height_r:video输出的高度,如240。 -video9_out_format:0--指分离RGB,1--指ARGB。 -[out] dev_info: mediactl_lib返回从video的配置文件得到的video信息,具体的解释如下。 -video_used:这里是指ISP的pipeline,如果使用就会返回1,否则0。K510支持ISP_F2K/ISP_R2K这两个pipeline,每个pipeline最多支持4个video输出。 -video_name[4]:返回的video的名字。f2k的四个video是video2/video3/video4/video5;r2k的四个video是 video6/video7/video8/video9 -enable[4]:返回的每个video是否使能,1 -- 使能,0 -- 没有使用。 -video_width[4]:返回的每个video的宽度。 -video_height[4]:返回的每个video的高度。 -video_out_format[4]:返回的每个video的输出图像格式,具体见《video的配置文件》的解释。 -具体使用方法如下: -char *video_cfg_file = "video_cfg"; -struct video_info dev_info[2] -mediactl_init(video_cfg_file,&dev_info) -``` - -#### 返回值 - -```text -0 成功, -1 失败. -``` - -### ◆ mediactl_exit - -关闭media设备及释放申请的share memory内存。 - -#### 参数 - -```text -参数: -无 -``` - -### ◆ mediactl_set_ae - -```c -enum isp_pipeline_e { - ISP_F2K_PIPELINE, - ISP_R2K_PIPELINE, - ISP_TOF_PIPELINE -}; -int mediactl_set_ae(enum isp_pipeline_e pipeline); -``` - -配置sensor的AE值 - -#### 参数 - -```text -参数: -ISP_F2K_PIPELINE:配置f2k pipeline的AE。 -ISP_R2K_PIPELINE:配置r2k pipeline的AE。 -ISP_TOF_PIPELINE:没有使用。 -``` - -### ◆ mediactl_get_isp_modules - -```c -enum isp_modules { - ISP_TPG, - ISP_BLC, - ISP_LSC, - ISP_AE, - ISP_AWB, - ISP_AWB_D65, - ISP_AWB_CCM, - ISP_WDR, - ISP_RGB_GAMMA, - ISP_YUV_GAMMA, - ISP_ADA, - ISP_ADA_SBZ, - ISP_ADA_CCR, - ISP_RGBIR, - ISP_RAW_2DNR, - ISP_YUV_Y_2DNR, - ISP_YUV_UV_2DNR, - ISP_3DNR, - ISP_LTM, - ISP_SHARP, - ISP_CC, - ISP_CTRST, - ISP_LUMA, - ISP_SATURATION, - ISP_LDC, - ISP_AF, -}; - -unsigned int mediactl_get_isp_modules(enum isp_pipeline_e pipeline,enum isp_modules module); -``` - -获取ISP的各模块的使能状态。 - -#### 参数 - -```text -参数: -isp_pipeline_e:具体见mediactl_set_ae中的解释。 -isp_modules: - ISP_TPG -- Test Pattern Control模块 - ISP_BLC -- Black Level Correction模块 - ISP_LSC -- Lens Shading Correction模块 - ISP_AE -- AUTO Exposure Gain模块 - ISP_AWB -- AUTO white balance模块 - ISP_AWB_D65 -- AUTO white balance d65模块 - ISP_AWB_CCM -- AUTO white balance ccm模块 - ISP_WDR -- wide dynamic range模块 - ISP_RGB_GAMMA -- rgb gamma模块 - ISP_YUV_GAMMA -- yuv gamma模块 - ISP_ADA -- Adaptive dynamic range adjust模块 - ISP_ADA_SBZ -- Image stabilization模块 - ISP_ADA_CCR -- Color correction模块 - ISP_RGBIR -- rgbir rectify模块 - ISP_RAW_2DNR -- raw域2D降噪模块 - ISP_YUV_Y_2DNR -- yuv域2D Y方向降噪模块 - ISP_YUV_UV_2DNR -- yuv域2D uv方向降噪模块 - ISP_3DNR -- yuv域3D降噪模块 - ISP_LTM -- local tone mapping模块 - ISP_SHARP -- sharpness模块 - ISP_CC -- color correction模块 - ISP_CTRST -- contrast adjust模块 - ISP_LUMA -- luma adjust模块 - ISP_SATURATION -- saturation adjust 模块 - ISP_LDC -- lens Distortion Correction模块 - ISP_AF -- ATUO FOCUS模块 -``` - -#### 返回值 - -```text -0 -- 模块没有使能 1 -- 模块使能 -``` - -# 2 Demo应用 - -## 2.1 v4l2_test - -程序放在`/app/mediactl_lib`目录下: - -- `v4l2_test.out`:自动保存50张图片至/root/data/video.yuv文件。 添加了-O选项修改保存文件的路径和名字,-d 修改输入配置文件的名字。可以使用-h 查看帮助。 -- 该demo是在v4l2通用demo的基础上仅添加了media初始化代码。 -- 该demo 需要video配置文件及对应的sensor配置文件在当前目录下。 -- 该demo运行命令:v4l2_test.out -d video_test.conf -- 该demo必须保证video_test.conf,imx219_0.conf及imx219_1.conf三个配置文件存在 - -运行v4l2_test.out - -- -h 帮助信息,除下面三个其它的不要修改。 -- -c 保存图片的数量,默认为 50。 -- -v 打印调试信息。 -- -O 配置输出文件的全路径,默认为/root/data/video.yuv。 - -## 2.2 v4l2_drm - -程序放在`/app/mediactl_lib`目录下: - -- `v4l2_drm.out`:v4l2和drm联动case,添加了-f 修改输入配置文件的名字, -e 打开isp ae 功能。可以使用-h 查看帮助。 - -运行v4l2_drm.out - -- -e:0 关闭所有ae,1打开 f-2k ae,2打开r-2k ae,3打开所有ae。默认情况下可以不指定-e 就是关闭所有ae。 -- 该demo 需要video配置文件及对应的sensor配置文件在当前目录下。 -- 该demo通过更改配置文件,可以演示单双摄。 -- 该demo演示单摄全屏:./v4l2_drm.out -e 1 -f video_drm_1080x1920.conf -- 该demo演示双摄:./v4l2_drm.out -f video_drm_1920x1080.conf -- 该demo必须保证video_drm_1920x1080.conf,imx219_0.conf及imx219_1.conf三个配置文件存在 +![](images/canaan-cover.png) + +**K510 V4L2 Developer's Guide** + +文档版本:V1.0.0 + +发布日期:2022-03-09 + +
+ +**免责声明** +您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的准确性、可靠性、完整性、营销型、特定目的性和非侵略性提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导的参考。 +由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。 + +**商标声明** + +“”、“Canaan”图标、嘉楠和嘉楠其他商标均为北京嘉楠捷思信息技术有限公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。 + +**版权所有©2022北京嘉楠捷思信息技术有限公司** +本文档仅适用K510平台开发设计,非经本公司书面许可,任何单位和个人不得以任何形式对本文档的部分或全部内容传播。 + +**北京嘉楠捷思信息技术有限公司** +网址:canaan-creative.com +商务垂询:salesAI@canaan-creative.com + +
+# 前言 +**文档目的** +本文档为K510 V4L2 应用实例的说明文档。 + +**读者对象** + +本文档(本指南)主要适用的人员: + +- 软件开发人员 +- 技术支持人员 + +**修订记录** +修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有版本的更新内容。 + +| 版本号 | 修改者 | 修订日期 | 修订说明 | +| :----- |------- | ------ | ------ | +| V1.0.0 | 系统软件组 | 2022-03-09 | SDK V1.5发布 | +| v1.0.1 | 朱大雷 | 2022-03-11 | SDK V1.5发布 | +| | | | | +| | | | | +| | | | | +| | | | | + +
+**目 录** + +[TOC] + +
+ +# 1 V4L2 mediactl库 + +## 1.1 头文件说明 + +\#include “media_ctl.h” + +## 1.2 API 函数说明 + +### ◆ mediactl_init + +```c +struct video_info { + unsigned int video_used; + char *video_name[4]; + unsigned int enable[4]; + unsigned int video_width[4]; + unsigned int video_height[4]; + unsigned int video_out_format[4]; +}; + +int mediactl_init(char *video_cfg_file,struct video_info *dev_info); +``` + +初始化media。 + +#### 参数 + +```text +参数: +[in] video_cfg_file: video的配置文件,这个文件的内容只需关心下面解释的内容,具体解释如下。 +sensor0_name:只在V4L2驱动中设置的sensor驱动名字。 +sensor0_cfg_file:sensor对应的isp参数配置文件名字,如imx219_0.conf。 +sensor0_total_width:sensor输出的水平方向的总像素,用来产生VSYNC信号,如3476 +sensor0_total_height:sensor输出的总行数,用来产生HSYNC信号,如1166 +sensor0_active_width:sensor输出的水平方向的有效像素,如1920, +sensor0_active_height:sensor输出的有效行数,如1080 +video2_used:1 -- 使能,0 -- 没有使用。 +video2_width:video输出的宽度,如1920。 +video2_height:video输出的高度,如1080。 +video2_out_format:1--指YUV420,NV21。 +video3_used:1 -- 使能,0 -- 没有使用。 +video3_width:video输出的宽度,如1080。 +video3_height:video输出的高度,如720。 +video3_out_format:1--指YUV420,NV21。 +video4_used:1 -- 使能,0 -- 没有使用。 +video4_width:video输出的宽度,如640。 +video4_height:video输出的高度,如480。 +video4_out_format:1--指YUV420,NV21。 +video5_used:1 -- 使能,0 -- 没有使用。 +video5_width:video输出的宽度,如320。 +video5_height":video存储的高度,如320。 +video5_height_r:video输出的高度,如240。 +video5_out_format:0--指分离RGB,1--指ARGB。 +sensor1_name:只在V4L2驱动中设置的sensor驱动名字。 +sensor1_cfg_file:sensor对应的isp参数配置文件名字,如imx219_0.conf。 +sensor1_total_width:sensor输出的水平方向的总像素,用来产生VSYNC信号,如3476 +sensor1_total_height:sensor输出的总行数,用来产生HSYNC信号,如1166 +sensor1_active_width:sensor输出的水平方向的有效像素,如1920, +sensor1_active_height:sensor输出的有效行数,如1080 +video6_used:1 -- 使能,0 -- 没有使用。 +video6_width:video输出的宽度,如1920。 +video6_height:video输出的高度,如1080。 +video6_out_format:1--指YUV420,NV21。 +video7_used:1 -- 使能,0 -- 没有使用。 +video7_width:video输出的宽度,如1080。 +video7_height:video输出的高度,如720. +video7_out_format:1--指YUV420,NV21。 +video8_used:1 -- 使能,0 -- 没有使用。 +video8_width:video输出的宽度,如640。 +video8_height:video输出的高度,如480。 +video8_out_format:1--指YUV420,NV21。 +video9_used:1 -- 使能,0 -- 没有使用。 +video9_width:video输出的宽度,如320。 +video9_height:video存储的宽度,如320。 +video9_height_r:video输出的高度,如240。 +video9_out_format:0--指分离RGB,1--指ARGB。 +[out] dev_info: mediactl_lib返回从video的配置文件得到的video信息,具体的解释如下。 +video_used:这里是指ISP的pipeline,如果使用就会返回1,否则0。K510支持ISP_F2K/ISP_R2K这两个pipeline,每个pipeline最多支持4个video输出。 +video_name[4]:返回的video的名字。f2k的四个video是video2/video3/video4/video5;r2k的四个video是 video6/video7/video8/video9 +enable[4]:返回的每个video是否使能,1 -- 使能,0 -- 没有使用。 +video_width[4]:返回的每个video的宽度。 +video_height[4]:返回的每个video的高度。 +video_out_format[4]:返回的每个video的输出图像格式,具体见《video的配置文件》的解释。 +具体使用方法如下: +char *video_cfg_file = "video_cfg"; +struct video_info dev_info[2] +mediactl_init(video_cfg_file,&dev_info) +``` + +#### 返回值 + +```text +0 成功, -1 失败. +``` + +### ◆ mediactl_exit + +关闭media设备及释放申请的share memory内存。 + +#### 参数 + +```text +参数: +无 +``` + +### ◆ mediactl_set_ae + +```c +enum isp_pipeline_e { + ISP_F2K_PIPELINE, + ISP_R2K_PIPELINE, + ISP_TOF_PIPELINE +}; +int mediactl_set_ae(enum isp_pipeline_e pipeline); +``` + +配置sensor的AE值 + +#### 参数 + +```text +参数: +ISP_F2K_PIPELINE:配置f2k pipeline的AE。 +ISP_R2K_PIPELINE:配置r2k pipeline的AE。 +ISP_TOF_PIPELINE:没有使用。 +``` + +### ◆ mediactl_get_isp_modules + +```c +enum isp_modules { + ISP_TPG, + ISP_BLC, + ISP_LSC, + ISP_AE, + ISP_AWB, + ISP_AWB_D65, + ISP_AWB_CCM, + ISP_WDR, + ISP_RGB_GAMMA, + ISP_YUV_GAMMA, + ISP_ADA, + ISP_ADA_SBZ, + ISP_ADA_CCR, + ISP_RGBIR, + ISP_RAW_2DNR, + ISP_YUV_Y_2DNR, + ISP_YUV_UV_2DNR, + ISP_3DNR, + ISP_LTM, + ISP_SHARP, + ISP_CC, + ISP_CTRST, + ISP_LUMA, + ISP_SATURATION, + ISP_LDC, + ISP_AF, +}; + +unsigned int mediactl_get_isp_modules(enum isp_pipeline_e pipeline,enum isp_modules module); +``` + +获取ISP的各模块的使能状态。 + +#### 参数 + +```text +参数: +isp_pipeline_e:具体见mediactl_set_ae中的解释。 +isp_modules: + ISP_TPG -- Test Pattern Control模块 + ISP_BLC -- Black Level Correction模块 + ISP_LSC -- Lens Shading Correction模块 + ISP_AE -- AUTO Exposure Gain模块 + ISP_AWB -- AUTO white balance模块 + ISP_AWB_D65 -- AUTO white balance d65模块 + ISP_AWB_CCM -- AUTO white balance ccm模块 + ISP_WDR -- wide dynamic range模块 + ISP_RGB_GAMMA -- rgb gamma模块 + ISP_YUV_GAMMA -- yuv gamma模块 + ISP_ADA -- Adaptive dynamic range adjust模块 + ISP_ADA_SBZ -- Image stabilization模块 + ISP_ADA_CCR -- Color correction模块 + ISP_RGBIR -- rgbir rectify模块 + ISP_RAW_2DNR -- raw域2D降噪模块 + ISP_YUV_Y_2DNR -- yuv域2D Y方向降噪模块 + ISP_YUV_UV_2DNR -- yuv域2D uv方向降噪模块 + ISP_3DNR -- yuv域3D降噪模块 + ISP_LTM -- local tone mapping模块 + ISP_SHARP -- sharpness模块 + ISP_CC -- color correction模块 + ISP_CTRST -- contrast adjust模块 + ISP_LUMA -- luma adjust模块 + ISP_SATURATION -- saturation adjust 模块 + ISP_LDC -- lens Distortion Correction模块 + ISP_AF -- ATUO FOCUS模块 +``` + +#### 返回值 + +```text +0 -- 模块没有使能 1 -- 模块使能 +``` + +# 2 Demo应用 + +## 2.1 v4l2_drm + +程序放在`/app/mediactl_lib`目录下: + +- `v4l2_drm.out`:v4l2和drm联动case,添加了-f 修改输入配置文件的名字, -e 打开isp ae 功能。可以使用-h 查看帮助。 + +运行v4l2_drm.out + +- -e:0 关闭所有ae,1打开 f-2k ae,2打开r-2k ae,3打开所有ae。默认情况下可以不指定-e 就是关闭所有ae。 +- 该demo 需要video配置文件及对应的sensor配置文件在当前目录下。 +- 该demo通过更改配置文件,可以演示单双摄。 +- 该demo演示单摄全屏:./v4l2_drm.out -e 1 -f video_drm_1080x1920.conf +- 该demo演示双摄:./v4l2_drm.out -f video_drm_1920x1080.conf +- 该demo必须保证video_drm_1920x1080.conf,imx219_0.conf及imx219_1.conf三个配置文件存在 diff --git a/zh/images/aws_quick_start/activity_log.png b/zh/images/aws_quick_start/activity_log.png new file mode 100644 index 0000000..edf500c Binary files /dev/null and b/zh/images/aws_quick_start/activity_log.png differ diff --git a/zh/images/aws_quick_start/attach_policies.png b/zh/images/aws_quick_start/attach_policies.png new file mode 100644 index 0000000..49a869c Binary files /dev/null and b/zh/images/aws_quick_start/attach_policies.png differ diff --git a/zh/images/aws_quick_start/aws_iot_config.png b/zh/images/aws_quick_start/aws_iot_config.png new file mode 100644 index 0000000..f469853 Binary files /dev/null and b/zh/images/aws_quick_start/aws_iot_config.png differ diff --git a/zh/images/aws_quick_start/aws_iot_test.png b/zh/images/aws_quick_start/aws_iot_test.png new file mode 100644 index 0000000..909fca5 Binary files /dev/null and b/zh/images/aws_quick_start/aws_iot_test.png differ diff --git a/zh/images/aws_quick_start/aws_iot_test_log.png b/zh/images/aws_quick_start/aws_iot_test_log.png new file mode 100644 index 0000000..e336078 Binary files /dev/null and b/zh/images/aws_quick_start/aws_iot_test_log.png differ diff --git a/zh/images/aws_quick_start/board_back.png b/zh/images/aws_quick_start/board_back.png new file mode 100644 index 0000000..27f26fc Binary files /dev/null and b/zh/images/aws_quick_start/board_back.png differ diff --git a/zh/images/aws_quick_start/board_front.png b/zh/images/aws_quick_start/board_front.png new file mode 100644 index 0000000..3e6fa7c Binary files /dev/null and b/zh/images/aws_quick_start/board_front.png differ diff --git a/zh/images/aws_quick_start/boot_mode.png b/zh/images/aws_quick_start/boot_mode.png new file mode 100644 index 0000000..19d98d5 Binary files /dev/null and b/zh/images/aws_quick_start/boot_mode.png differ diff --git a/zh/images/aws_quick_start/certification_display.png b/zh/images/aws_quick_start/certification_display.png new file mode 100644 index 0000000..c9eec55 Binary files /dev/null and b/zh/images/aws_quick_start/certification_display.png differ diff --git a/zh/images/aws_quick_start/certs_folder.png b/zh/images/aws_quick_start/certs_folder.png new file mode 100644 index 0000000..822b43f Binary files /dev/null and b/zh/images/aws_quick_start/certs_folder.png differ diff --git a/zh/images/aws_quick_start/create_policy.png b/zh/images/aws_quick_start/create_policy.png new file mode 100644 index 0000000..b592508 Binary files /dev/null and b/zh/images/aws_quick_start/create_policy.png differ diff --git a/zh/images/aws_quick_start/create_single_thing.png b/zh/images/aws_quick_start/create_single_thing.png new file mode 100644 index 0000000..67cbeb9 Binary files /dev/null and b/zh/images/aws_quick_start/create_single_thing.png differ diff --git a/zh/images/aws_quick_start/create_things.png b/zh/images/aws_quick_start/create_things.png new file mode 100644 index 0000000..42c99a9 Binary files /dev/null and b/zh/images/aws_quick_start/create_things.png differ diff --git a/zh/images/aws_quick_start/device_certificate.png b/zh/images/aws_quick_start/device_certificate.png new file mode 100644 index 0000000..815ec9c Binary files /dev/null and b/zh/images/aws_quick_start/device_certificate.png differ diff --git a/zh/images/aws_quick_start/download_crts_keys.png b/zh/images/aws_quick_start/download_crts_keys.png new file mode 100644 index 0000000..072fab5 Binary files /dev/null and b/zh/images/aws_quick_start/download_crts_keys.png differ diff --git a/zh/images/aws_quick_start/thing_properties.png b/zh/images/aws_quick_start/thing_properties.png new file mode 100644 index 0000000..09b690c Binary files /dev/null and b/zh/images/aws_quick_start/thing_properties.png differ diff --git a/zh/images/aws_quick_start/troubleshooting.png b/zh/images/aws_quick_start/troubleshooting.png new file mode 100644 index 0000000..255ca10 Binary files /dev/null and b/zh/images/aws_quick_start/troubleshooting.png differ diff --git a/zh/images/sdk_application/twod-osd2yuv-app.jpg b/zh/images/sdk_application/twod-osd2yuv-app.jpg new file mode 100755 index 0000000..8010e46 Binary files /dev/null and b/zh/images/sdk_application/twod-osd2yuv-app.jpg differ diff --git a/zh/images/sdk_application/twod-scaler-overlay-osd-app.jpg b/zh/images/sdk_application/twod-scaler-overlay-osd-app.jpg new file mode 100755 index 0000000..d93d5d1 Binary files /dev/null and b/zh/images/sdk_application/twod-scaler-overlay-osd-app.jpg differ