\\\
+
+\ \
+
+...
+
+数组中的路径数据应该总是1,2,或4字节对齐,这取决于格式。例如,对于32位(4字节)的数据类型。
+
+...
+
+\\?
+
+\(4个字节)。
+
+\ \
+
+\
+
+\
+
+...
+
+对于float类型,使用IEEE754编码规范,此时操作码仍然为8位有符号整数,可能需要软件进行特殊处理。
+
+#### 3.5.3 函数
+
+##### 3.5.3.1 vg_lite_path_calc_length
+
+- 描述
+
+ 这个函数计算路径命令的缓冲区长度(以字节为单位)。应用程序可以根据这个函数计算的缓冲区长度分配一个缓冲区作为命令缓冲区使用。
+
+- 参数
+
+ uint8_t \*cmd: 指向用于构建路径的操作码数组的指针。
+
+ uint32_t count: 操作码数量。
+
+ vg_lite_format_t format: 坐标数据格式,所有可用于vg_lite_format_t的格式都是该函数的有效格式。
+
+##### 3.5.3.2 vg_lite_path_append
+
+- 描述
+
+ 这个函数为路径组装命令缓冲区,这个函数根据输入的操作码(cmd)和坐标(data)为路径制作最终的GPU命令。
+
+- 参数
+
+ vg_lite_path_t \*path: 指向带有路径定义的vg_lite_path_t结构体的指针。
+
+ uint8_t \*cmd: 指向用于构建路径的操作码数组的指针。
+
+ void \*data: 指向用于构建路径的坐标数据数组的指针。
+
+ uint32_t seg_count: 操作码数量。
+
+##### 3.5.3.3 vg_lite_init_path
+
+- 描述
+
+ 这个函数用指定的值初始化一个路径定义。
+
+- 参数
+
+ vg_lite_path_t \*path: 指向路径对象的vg_lite_path_t结构的指针,要用指定的成员值进行初始化。
+
+ vg_lite_format_t data_format: 坐标数据格式。vg_lite_format_t枚举中的所有格式都是该函数的有效格式。
+
+ vg_lite_quality_t quality: 路径对象的质量。vg_lite_quality_t枚举中的所有格式都是这个函数的有效格式。
+
+ uint32_t path_length: 路径数据的长度(以字节为单位)。
+
+ void \*path_data: 路径数据的指针。
+
+ vg_lite_float_t min_x, vg_lite_float_t min_y, vg_lite_float_t max_x, vg_lite_float_t max_y: 最小和最大的x和y值,指定路径的包围盒。
+
+##### 3.5.3.4 vg_lite_init_arc_path
+
+- 描述
+
+ 这个函数用指定的值初始化一个弧形路径定义。
+
+- 参数
+
+ vg_lite_path_t \*path: 参考vg_lite_init_path。
+
+ vg_lite_format_t data_format: 参考vg_lite_init_path。
+
+ vg_lite_quality_t quality: 参考vg_lite_init_path。
+
+ uint32_t path_length: 参考vg_lite_init_path。
+
+ void \*path_data: 参考vg_lite_init_path。
+
+ vg_lite_float_t min_x, vg_lite_float_t min_y, vg_lite_float_t max_x, vg_lite_float_t max_y: 参考vg_lite_init_path。
+
+##### 3.5.3.5 vg_lite_upload_path
+
+- 描述
+
+ 该函数用于上传路径到GPU内存。
+
+ 在正常情况下,GPU驱动程序会在运行期间将任何路径数据复制到一个命令缓冲区结构中。如果有很多路径需要渲染,这确实需要一些时间。另外,在嵌入式系统中,路径数据通常不会发生变化,所以将路径数据以GPU可以直接访问的形式上传到GPU内存是有意义的。这个函数将提示驱动程序分配一个缓冲区,该缓冲区将包含路径数据和所需的命令缓冲区的头和脚的数据,以便GPU直接访问这些数据。在路径使用完毕后,调用vg_lite_clear_path来释放这个缓冲区。
+
+- 参数
+
+ vg_lite_path_t \*path: 指向vg_lite_path_t结构体的指针,该结构体包含要上传的路径。
+
+##### 3.5.3.6 vg_lite_clear_path
+
+- 描述
+
+ 这个函数将清除和重置路径成员值。如果路径已经被上传,它将释放上传路径时分配的GPU内存。
+
+- 参数
+
+ vg_lite_path_t \*path: 指向要清除的vg_lite_path_t路径定义的指针。
+
+#### 3.5.4 矢量路径操作码
+
+以下操作码是可用于矢量路径数据的路径绘制命令。
+
+一个路径操作是以\[操作码\|坐标\]的形式提交给GPU的。操作代码以VG_LITE_S8的形式存储,而坐标则通过vg_lite_format_t指定。
+
+| 操作码 | 参数 | 描述 |
+|--------|------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| 0x00 | None | END. 完成,闭合所有开放的路径。 |
+| 0x02 | (x,y) | MOVE. 移动到给定的顶点。闭合所有开放的路径。 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x03 | (Δx,Δy) | MOVE_REL. 移动到给定的相对点。闭合所有开放的路径。 𝑠𝑡𝑎𝑟𝑡𝑥=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 |
+| 0x04 | (x,y) | LINE. 画一条直线到给定的顶点。 𝐿𝑖𝑛𝑒(𝑠𝑡𝑎𝑟𝑡𝑥,𝑠𝑡𝑎𝑟𝑡𝑦,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x05 | (Δx,Δy) | LINE_REL. 画一条直线到相对位置的顶点。 𝑥=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 𝐿𝑖𝑛𝑒(𝑠𝑡𝑎𝑟𝑡𝑥,𝑠𝑡𝑎𝑟𝑡𝑦,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x06 | (cx,cy) (x,y) | QUAD. 使用指定的控制点绘制一条通往给定端点的二次曲线。 𝑄𝑢𝑎𝑑(𝑠𝑡𝑎𝑟𝑡𝑥,𝑠𝑡𝑎𝑟𝑡𝑦,𝑐𝑥,𝑐𝑦,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x07 | (Δcx,Δcy) (Δx,Δy) | QUAD_REL. 使用指定的相对控制点绘制一条通往给定的相对位置端点的二次曲线。 𝑐𝑥= 𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑐𝑥 𝑐𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑐𝑦 𝑥= 𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 𝑄𝑢𝑎𝑑(𝑠𝑡𝑎𝑟𝑡𝑥,𝑠𝑡𝑎𝑟𝑡𝑦,𝑐𝑥,𝑐𝑦,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x08 | (cx1,cy1) (cx2,cy2) (x,y) | CUBIC. 使用指定的控制点绘制一条到给定端点的三次曲线。 𝐶𝑢𝑏𝑖𝑐(𝑠𝑡𝑎𝑟𝑡𝑥,𝑠𝑡𝑎𝑟𝑡𝑦,𝑐𝑥1,𝑐𝑦1,𝑐𝑥2,𝑐𝑦2,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x09 | (Δcx1,Δcy1) (Δcx2,Δcy2) (Δx,Δy) | CUBIC_REL. 使用指定的控制点绘制一条到给定相对位置端点的三次曲线。 𝑐𝑥1= 𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑐𝑥1 𝑐𝑦1=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑐𝑦1 𝑐𝑥2=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑐𝑥2 𝑐𝑦2=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑐𝑦2 𝑥=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 𝐶𝑢𝑏𝑖𝑐(𝑠𝑡𝑎𝑟𝑡𝑥,𝑠𝑡𝑎𝑟𝑡𝑦,𝑐𝑥1,𝑐𝑦1,𝑐𝑥2,𝑐𝑦2,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x0A | (rh,rv,rot,x,y) | SCCWARC. 使用指定的半径和旋转角度绘制一个小的CCW弧线到给定的端点。 𝑺𝑪𝑪𝑾𝑨𝑹𝑪(𝒓𝒉,𝒓𝒗,𝒓𝒐𝒕,𝒙,𝒚) 𝒔𝒕𝒂𝒓𝒕𝒙=𝒙 𝒔𝒕𝒂𝒓𝒕𝒚=𝒚 |
+| 0x0B | (rh,rv,rot,x,y) | SCCWARC_REL. 使用指定的半径和旋转角度向给定的相对端点绘制一个小的CCW弧线。 𝑥=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 𝑆𝐶𝐶𝑊𝐴𝑅𝐶(𝑟ℎ,𝑟𝑣,𝑟𝑜𝑡,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x0C | (rh,rv,rot,x,y) | SCWARC. 使用指定的半径和旋转角度绘制一个小的CW弧线到给定的端点。 𝑆𝐶𝑊𝐴𝑅𝐶(𝑟ℎ,𝑟𝑣,𝑟𝑜𝑡,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x0D | (rh,rv,rot,x,y) | SCWARC_REL. 使用指定的半径和旋转角度绘制一个小的CW弧线到给定的相对端点。 𝑥=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 𝑆𝐶𝑊𝐴𝑅𝐶(𝑟ℎ,𝑟𝑣,𝑟𝑜𝑡,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x0E | (rh,rv,rot,x,y) | LCCWARC. 使用指定的半径和旋转角度向给定的端点绘制一个大的CCW弧线。 𝐿𝐶𝐶𝑊𝐴𝑅𝐶(𝑟ℎ,𝑟𝑣,𝑟𝑜𝑡,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x0F | (rh,rv,rot,x,y) | LCCWARC_REL. 使用指定的半径和旋转角度向给定的相对端点绘制一个大的CCW弧线。 𝑥=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 𝐿𝐶𝐶𝑊𝐴𝑅𝐶(𝑟ℎ,𝑟𝑣,𝑟𝑜𝑡,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x10 | (rh,rv,rot,x,y) | LCWARC. 使用指定的半径和旋转角度绘制一个大的CW弧线到给定的端点。 𝐿𝐶𝑊𝐴𝑅𝐶(𝑟ℎ,𝑟𝑣,𝑟𝑜𝑡,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+| 0x11 | (rh,rv,rot,x,y) | LCWARC_REL. 使用指定的半径和旋转角度绘制一个大的CW弧线到给定的相对端点。 𝑥=𝑠𝑡𝑎𝑟𝑡𝑥+Δ𝑥 𝑦=𝑠𝑡𝑎𝑟𝑡𝑦+Δ𝑦 𝐿𝐶𝑊𝐴𝑅𝐶(𝑟ℎ,𝑟𝑣,𝑟𝑜𝑡,𝑥,𝑦) 𝑠𝑡𝑎𝑟𝑡𝑥=𝑥 𝑠𝑡𝑎𝑟𝑡𝑦=𝑦 |
+
+### 3.6 基于矢量的绘制操作
+
+#### 3.6.1 枚举类型
+
+##### 3.6.1.1 vg_lite_fill_t
+
+这个枚举用于指定要使用的填充规则。对于绘制任何路径,硬件都支持非零和奇偶的填充规则。
+
+为了确定任何一个点是否包含在一个物体内,想象一下从该点向任何方向画一条线到无限远,使该线不与路径的任何顶点交叉。对于被线穿过的每条边,如果边是从左到右穿过的,则在计数器上加1,就像观察者从线上走向无限远处看到的那样;如果边是从右到左穿过的,则减去1。这样一来,平面的每个区域都会得到一个整数值。
+
+非零填充规则说,如果所得之和不等于零,那么一个点就在形状内。偶数/奇数规则说,如果结果的总和是奇数,那么一个点就在形状里面,而不考虑符号。
+
+| vg_lite_fill_t | 描述 |
+|-----------------------|------------------------------------------------------------------|
+| VG_LITE_FILL_NON_ZERO | 非零填充规则。如果一个像素至少与一个路径像素相交,就会被画出来。 |
+| VG_LITE_FILL_EVEN_ODD | 偶数填充规则。如果一个像素与奇数的路径像素相交,就会被画出来。 |
+
+##### 3.6.1.2 vg_lite_pattern_mode_t
+
+定义图像图案外的区域如何被填充到路径上。
+
+| vg_lite_pattern_mode_t | 描述 |
+|-------------------------|------------------------------------------|
+| VG_LITE_PATTERN_COLOR | 按颜色填充图案的外部。 |
+| VG_LITE_PATTERN_PAD | 图案边框的颜色被扩大以填充图案外的区域。 |
+
+#### 3.6.2 结构体
+
+##### v3.6.2.1 g_lite_color_ramp_t
+
+这个结构体定义了径向梯度的止点。五个参数提供了停止点的偏移量和颜色。每个停止点都是由一组浮点值定义的,这些浮点值指定了偏移量以及sRGBA颜色和alpha值。颜色通道的值是以非重乘(R、G、B、alpha)四边形的形式存在。所有的参数都在\[0,1\]的范围内。红、绿、蓝、α值\[0,1\]被映射到8位像素值\[0,255\]。
+
+定义径向梯度停止的最大数量是MAX_COLOR_RAMP_STOPS,即256。
+
+| 字段 | 类型 | 描述 |
+|--------|------------------|-------------------------|
+| stop | vg_lite_float_t | 颜色停止点的偏移量 |
+| red | vg_lite_float_t | 红色停止点的偏移量 |
+| green | vg_lite_float_t | 绿色停止点的偏移量 |
+| blue | vg_lite_float_t | 蓝色停止点的偏移量 |
+| alpha | vg_lite_float_t | Alpha通道停止点的偏移量 |
+
+##### 3.6.2.2 vg_lite_linear_gradient_t
+
+该结构定义了VGLite数据中的线性梯度的组织。线性渐变被应用于填充路径。它将根据设置生成一个256x1的图像。
+
+| 字段 | 类型 | 描述 |
+|-----------------------|-------------------|--------------------------------|
+| colors\[VLC_MAX_GRAD\] | uint32_t | 渐变的颜色数组 |
+| count | uint32_t | 颜色数量 |
+| stops\[VLC_MAX_GRAD\] | uint32_t | 色阶数,从0到255 |
+| matrix | vg_lite_matrix_t | 转换梯度颜色斜率的矩阵结构体 |
+| image | vg_lite_buffer_t | 表示颜色斜率的图像对象结构体。 |
+
+其中VLC_MAX_GRAD最大为16,VLC_GRADBUFFER_WIDTH最大为256.
+
+#### 3.6.3 函数
+
+##### 3.6.3.1 vg_lite_draw
+
+- 描述
+
+ 执行硬件加速的2D矢量绘制操作。
+
+ 嵌片缓冲区的大小可以在初始化时指定,该大小将被内核调整为硬件所需的最小对齐方式。如果你把嵌片缓冲区做得更小,分配的内存就会更少,但是一个路径可能会被多次下发到硬件,因为硬件会用提供的嵌片窗口大小来行走目标,所以性能可能会降低。良好的做法是将嵌片缓冲区的大小设置为最常见的路径大小。例如,如果你所做的只是渲染最高24pt的字体,你可以将嵌片缓冲区设置为24x24。
+
+- 参数
+
+ vg_lite_buffer_t \*target: 指向目标缓冲区的vg_lite_buffer_t结构体的指针。所有在vg_lite_buffer_format_t枚举中的颜色格式都是绘图函数的有效目标格式。
+
+ vg_lite_path_t \*path: 指向vg_lite_path_t结构体的指针,该结构体包含描述要绘制的路径数据。关于操作码的详细内容,请参考本文件中关于[矢量路径操作码](#354-矢量路径操作码)的部分。
+
+ vg_lite_fill_t fill_rule: 为路径的填充规则指定vg_lite_fill_t的枚举值。
+
+ vg_lite_matrix_t \*matrix: 指向vg_lite_matrix_t结构体的指针,该结构体定义了路径的仿射变换矩阵。如果矩阵为NULL,则假定是一个单位矩阵。注意:vg_lite_draw不支持非仿射变换,所以透视变换矩阵对路径没有影响。
+
+ vg_lite_blend_t blend: 在vg_lite_blend_t枚举中选择一种硬件支持的混合模式,应用于每个绘制的像素。如果不需要混合,请将此值设置为VG_LITE_BLEND_NONE,即0。
+
+ vg_lite_color_t color: 应用于路径绘制的每个像素的颜色。
+
+##### 3.6.3.2 vg_lite_draw_gradient
+
+- 描述
+
+ 该函数用于根据指定的填充规则用渐变色填充路径。指定的路径将根据选定的矩阵进行转换,并渐变填充。
+
+- 参数
+
+ vg_lite_buffer_t \*target: 参照vg_lite_draw.
+
+ vg_lite_path_t \*path: 参照vg_lite_draw.
+
+ vg_lite_fill_t fill_rule: 参照vg_lite_draw.
+
+ vg_lite_matrix_t \*matrix: 参照vg_lite_draw.
+
+ vg_lite_linear_gradient_t \*grad: 指向vg_lite_linear_gradient_t结构体的指针,该结构体包含用于填充路径的值。
+
+ vg_lite_blend_t blend: 参照vg_lite_draw.
+
+##### 3.6.3.3 vg_lite_draw_pattern
+
+- 描述
+
+ 这个函数用图像图案填充一个路径。路径将根据指定的矩阵进行转换,并以转换后的图像图案填充。
+
+- 参数
+
+ vg_lite_buffer_t \*target: 参照vg_lite_draw.
+
+ vg_lite_path_t \*path: 参照vg_lite_draw.
+
+ vg_lite_fill_t fill_rule: 参照vg_lite_draw.
+
+ vg_lite_matrix_t \*matrix0: 指向vg_lite_matrix_t结构体的指针,它定义了路径的3x3变换矩阵。如果矩阵为NULL,就会假定是一个单位矩阵。
+
+ vg_lite_buffer_t \*source: 指向描述图像模式来源的vg_lite_buffer_t结构体的指针。
+
+ vg_lite_matrix_t \*matrix1: 指向一个vg_lite_matrix_t结构体的指针,该矩阵定义了源像素到目标像素的3x3变换。如果矩阵为NULL,则假定是一个单位矩阵,这意味着源像素将被直接复制到目标像素的0,0位置。
+
+ vg_lite_blend_t blend: 参照vg_lite_draw.
+
+ vg_lite_pattern_mode_t pattern mode: 指定vg_lite_pattern_mode_t值,它定义了如何填充图像图案外的区域。
+
+ vg_lite_color_t pattern_color: 指定一个32bpp的ARGB颜色(vg_lite_color_t),当pattern_mode值为VG_LITE_PATTERN_COLOR时,应用于图像图案区域外的填充。
+
+ vg_lite_filter_t filter: 指定过滤器的类型。vg_lite_filter_t枚举中的所有格式都是这个函数的有效格式。值为零(0)表示VG_LITE_FILTER_POINT。
+
+#### 3.6.4 线性渐变初始化和控制函数
+
+##### 3.6.4.1 vg_lite_init_grad
+
+- 描述
+
+ 此函数以默认设置初始化线性梯度对象的内部缓冲区,用于渲染。
+
+- 参数
+
+ vg_lite_linear_gradient_t \*grad: 指向vg_lite_linear_gradient_t结构体的指针,该结构定义了要被初始化的渐变。使用默认值。
+
+##### 3.6.4.2 vg_lite_set_grad
+
+- 描述
+
+ 该函数用于设置vg_lite_linear_gradient_t结构成员的值。
+
+ 注意:在输入参数不完整或无效的情况下,采用以下规则设置默认梯度颜色。
+
+ 1. 如果没有指定有效的止点(例如,由于空的输入数组、超出范围或超出顺序的止点),则隐含地定义一个具有(R, G, B, α)颜色(0.0, 0\.0, 0\.0, 1\.0)(不透明的黑色)的0停止点和一个具有颜色(1\.0, 1\.0, 1\.0)(不透明的白色)的1止点。
+ 1. 如果至少指定了一个有效的停止点,但没有定义偏移量为0的停止点,那么将添加一个隐含的停止点,偏移量为0,颜色与第一个用户定义的停止点相同。
+ 1. 如果至少指定了一个有效的停止,但没有定义偏移量为1的停止,则添加一个隐式停止,其偏移量为1,颜色与最后一个用户定义的停止相同。
+
+- 参数
+
+ vg_lite_linear_gradient_t \*grad: 指向要设置的vg_lite_linear_gradient_t结构体的指针。
+
+ uint32_t count: 线性渐变中颜色的计数。最大的色块计数是由VLC_MAX_GRAD定义的,即16。
+
+ uint32_t \*colors: 指定渐变的颜色数组,ARGB8888格式,Alpha在最高位。
+
+ uint32_t \*stops: 指向渐变停止的偏移量的指针。
+
+##### 3.6.4.3 vg_lite_update_grad
+
+- 描述
+
+ 这个函数用于更新或生成一个将要被渲染的图像对象的值。vg_lite_linear_gradient_t对象有一个图像缓冲区,用于渲染渐变图案。该图像缓冲区将被创建或更新为相应的渐变参数。
+
+- 参数
+
+ vg_lite_linear_gradient_t \*grad: 指向vg_lite_linear_gradient_t结构体的指针,该结构体包含要用于渲染对象的更新值。
+
+##### 3.6.4.4 vg_lite_get_grad_matrix
+
+- 描述
+
+ 这个函数用来获取渐变对象的变换矩阵的指针,这允许应用程序操作矩阵以促进渐变色路径的正确渲染。
+
+- 参数
+
+ vg_lite_linear_gradient_t \*grad: 指向vg_lite_linear_gradient_t结构体的指针,该结构体包含要检索的矩阵。
+
+##### 3.6.4.5 vg_lite_clear_grad
+
+- 描述
+
+ 该函数用于清除线性渐变对象的值,释放图像缓冲区的内存。
+
+- 参数
+
+ vg_lite_linear_gradient_t \*grad: 指向要清除的vg_lite_linear_gradient_t结构的指针。
+
+## 4. 约束条件
+
+GPU驱动程序**只支持一个当前上下文和一个线程来向GPU发布命令**。GPU驱动程序**不支持**在多个线程/进程中同时运行的多个并发上下文,因为GPU内核驱动程序不支持上下文切换。GPU应用程序在任何时候都只能使用一个上下文来向GPU硬件发出命令。如果GPU应用程序需要切换上下文,应该调用[vg_lite_close](#3213-vg_lite_close)来关闭当前线程中的当前上下文,然后可以调用[vg_lite_init](#3212-vg_lite_init)来初始化当前线程中或其他线程/进程中的新上下文。
+
+## 5. 性能建议与最佳实践
+
+### 5.1 Cache vs Non-cache
+
+在加载vg_lite.ko模块时,通过cached参数可以配置是否关闭cache(默认启用cache),cache模式下在提交命令给GPU硬件之前会驱动会刷新CPU缓存(D-cache和L2-cache),而non-cache模式下会将command buffer及显存映射到用户态地址空间时设置为non-cache。一般情况下cache模式具有更好的性能,CPU写入command buffer以及读取显存都更快。
+
+目前刷新cache使用dcache.cipa指令,这个指令一次只能刷一个缓存行即64Bytes,对于较大的缓冲区例如1920x1080@ARGB32,大约需要循环129600次,其中大部分是未命中的,会带来一定的性能开销,而如果使用dcache.ciall指令可以刷新所有cache,但是可能会影响其他进程所以没有使用。
+
+### 5.2 内存使用
+
+vg_lite.ko模块加载后会占用大约130KB内存,除command buffer及显存外几乎不会占用更多空间,每个由vg_lite_hal_allocate_contiguous分配的内存除内存本身外还需要相应的页表资源以及一个大小为64B的节点。
+
+### 5.3 绘制流程
+
+使用VGLite API进行操作
+
+1. 调用[vg_lite_init](#3212-vg_lite_init)初始化GPU
+1. 如果需要使用GPU显存,调用[vg_lite_allocate](#3251-vg_lite_allocate)分配和映射
+1. 使用API绘制
+1. 调用[vg_lite_finish](#3214-vg_lite_finish)或[vg_lite_flush](#3215-vg_lite_flush)提交命令进行渲染,等待绘制结束
+1. 进程结束前,调用[vg_lite_close](#3213-vg_lite_close)关闭GPU
diff --git "a/zh/01_software/board/mpp/K230_SHA256_API\345\217\202\350\200\203.md" "b/zh/01_software/board/mpp/K230_SHA256_API\345\217\202\350\200\203.md"
new file mode 100755
index 0000000..aeabfbf
--- /dev/null
+++ "b/zh/01_software/board/mpp/K230_SHA256_API\345\217\202\350\200\203.md"
@@ -0,0 +1,149 @@
+# K230 SHA256 API参考
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍 K230 SHA256 软件的使用,内容主要包括 SHA256 API 的使用及测试程序介绍。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ---- |
+| SHA256 | Secure Hash Algorithm |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | -------- | ---------- | ---------- |
+| V1.0 | 初版 | 杨帆 | 2023-05-30 |
+
+## 1. 功能介绍
+
+SHA256 主要用于计算数据的 hash 值,大核 rt-smart 中实现了 SHA256 算法,用于计算数据的 hash 值,代码逻辑如下图所示:
+
+![sha256](images/sha256.png)
+
+## 2. API 参考
+
+SHA256模块主要提供了以下 API:
+
+- [kd_mpi_cipher_sha256](#21-kd_mpi_cipher_sha256)
+
+### 2.1 kd_mpi_cipher_sha256
+
+【描述】
+
+根据传入的消息计算消息的 hash 值。
+
+【语法】
+
+kd_mpi_cipher_sha256(const void \*data, k_u32 len, k_u8 \*hash);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|-----------------|-------------------------------|-----------|
+| data | 传入的消息 | 输入 |
+| len | 传入消息的长度 | 输入 |
+| hash | 计算得到的 hash 值 | 输出 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|---------|---------------------------------|
+| 0 | 成功。 |
+| 非 0 | 失败,参考错误码定义 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_cipher_api.h
+- 库文件:libcipher.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+## 3. 调试及打印信息
+
+写一个用户态应用程序 *sample_cipher.c* 来测试 SHA256 功能。
+
+测试代码已经写好,位于 *mpp/userapps/sample/sample_cipher* 目录下,具体的调试方法如下:
+
+1. 大核启动之后,进入 *bin* 目录;
+1. 运行 *sample_cipher.elf* 程序;
+1. 打印信息。
+
+具体的打印信息如下所示:
+
+```shell
+msh />cd bin/
+msh /bin>./sample_cipher.elf
+input = ''
+digest: e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855
+result: PASS
+
+input = 'abc'
+digest: ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
+result: PASS
+
+input = 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'
+digest: 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1
+result: PASS
+
+input = 'The quick brown fox jumps over the lazy dog'
+digest: d7a8fbb3 07d78094 69ca9abc b0082e4f 8d5651e4 6d3cdb76 2d02d0bf 37c9e592
+result: PASS
+
+input = 'The quick brown fox jumps over the lazy cog'
+digest: e4c4d8f3 bf76b692 de791a17 3e053211 50f7a345 b46484fe 427f6acc 7ecc81be
+result: PASS
+
+input = 'bhn5bjmoniertqea40wro2upyflkydsibsk8ylkmgbvwi420t44cq034eou1szc1k0mk46oeb7ktzmlxqkbte2sy'
+digest: 9085df2f 02e0cc45 5928d0f5 1b27b4bf 1d9cd260 a66ed1fd a11b0a3f f5756d99
+result: PASS
+```
diff --git "a/zh/01_software/board/mpp/K230_VICAP_API\345\217\202\350\200\203.md" "b/zh/01_software/board/mpp/K230_VICAP_API\345\217\202\350\200\203.md"
new file mode 100644
index 0000000..e3ac538
--- /dev/null
+++ "b/zh/01_software/board/mpp/K230_VICAP_API\345\217\202\350\200\203.md"
@@ -0,0 +1,2072 @@
+# K230 VICAP API参考
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要指导应用开发者通过如何通过VICAP模块获取图像数据,描述了各个模块API的基本功能。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|------|
+| | |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|--------------------------------------------------------------------------------------------------------------------------------------------|---------------|-----------|
+| V1.0 | 初版 | 汪成根 | 2023/4/4 |
+| V1.1 | 修改VICAP概述 2、添加API、数据类型的跳转 | 赵忠祥 | 2023/4/6 |
+| V1.2 | 移除ISP相关接口 增加API及数据类型描述 将sensor接口从libvicap库分离出来独立为libsensor库 增加ov9286红外/散斑类型 更新VICAP描述 更新文档格式 | 郭世栋 汪成根 | 2023/4/26 |
+
+## 1. 概述
+
+### 1.1 概述
+
+VICAP子系统是K230 SOC中负责视频图像输入捕获处理的子系统。通过对sensor输出的信号进行实时处理,得到经过复原、增强后的数字图像,使其更接近现实中人眼所见的图像。主要包括MIPI RxDphy、MIPI CSI、ISP和DW。MIPI用于接收sensor传来的高速差分信号,并将其转为DVP接口,供ISP处理;ISP用于图像信息的处理;DW用于鱼眼矫正和多路resize输出。
+
+本文档主要描述VICAP模块应用编程接口,它提供了应用开发者通过VICAP模块捕获视频图像数据的操作接口和配置参数。
+
+### 1.2 功能描述
+
+#### 1.2.1 VICAP
+
+VICAP模块是对整个图像采集处理单元的抽象描述。
+
+VICAP硬件由Sensor,VI,ISP,Dewarp四大模块组成(如下图1-1所示)。最多支持3路sensor同时接入,ISP内部通过的MCM模块实现多路sensor的时分复用管理,多路sensor输出数据通过MCM的Memory Interface的Write接口写入DDR,再通过Read接口读入并装载到ISP Pipeline进行处理。
+
+![图示 描述已自动生成](images/745a46d8e083d93521d0c5233bdaccdd.png)、
+
+图1-1 VICAP硬件架构图
+
+VICAP软件架构如图1-2所示,从上到下依次是:应用接口层,媒体接口层,系统框架层,驱动层和硬件层。
+
+- 应用层接口: 提供kd_mapi_vicap_xxx形式的API接口及使用说明。它是对媒体接口层各个子模块提供的功能接口的进一步封装,简化应用开发流程。
+- 媒体接口层:该层由VICAP各个子模块组成,每个子模块提供各自的媒体接口API封装。
+- 框架层:负责VICAP整个系统软件功能与业务逻辑的控制与管理。通过将各个子模块提供的接口与功能整合统一形成一套完整的VICAP系统控制逻辑和流程。
+- 驱动层:VICAP各个硬件模块的内核驱动功能的集合。
+
+硬件层:VICAP各个具体硬件模块的集合,包括sensor。
+
+![图形用户界面, 文本, 应用程序 描述已自动生成](images/250b6c36cbd4447bd8c734548fc3b890.png)
+
+#### 1.2.2 Sensor
+
+Sensor模块是VICAP捕获图像的数据源之一,负责配置图像感光单元的运行参数及工作模式。
+
+K230平台支持多种接口类型的sensor,我们以当前最常用的MIPI CSI接口Sensor为例进行说明。Sensor与主控平台的硬件连接示意图如下:
+
+![图示 描述已自动生成](images/e20100e34c268ad615e69966cb28e5a6.png)
+
+图1-3
+
+主控通过I2C接口下发配置寄存器控制sensor的工作方式,sensor通过MIPI CSI接口将图像数据发送至主控SOC。
+
+Sensor模块系统架构如下图1-4所示:
+
+![图形用户界面, 应用程序, 电子邮件 描述已自动生成](images/camera_sensor_arch.png)
+
+图1-4 sensor系统架构图
+
+从上到下依次是:媒体接口层,硬件驱动层以及硬件层
+
+- 媒体接口层:提供kd_mpi_sensor_xxx接口给外部模块操作和访问sensor设备。
+- 驱动层:该层主要包两部分,分别是:sensor_dev,sensor_drv。
+- sensor_dev:负责设备驱动文件的注册,提供文件操作接口的实现流程。通过注册设备文件节点/dev/sensorxx供用户空间的程序访问内核驱动。
+- sensor_drv:具体sensor的硬件驱动,并将针对sensor的操作封装为统一的接口。
+- 硬件层:sensor模组硬件,当前系统中最多同时支持三路硬件sensor。
+
+## 2. API 参考
+
+### 2.1 VICAP
+
+该功能模块提供以下API:
+
+- [kd_mpi_vicap_get_sensor_info](#211-kd_mpi_vicap_get_sensor_info)
+- [kd_mpi_vicap_set_dev_attr](#212-kd_mpi_vicap_set_dev_attr)
+- [kd_mpi_vicap_get_dev_attr](#213-kd_mpi_vicap_get_dev_attr)
+- [kd_mpi_vicap_set_chn_attr](#214-kd_mpi_vicap_set_chn_attr)
+- [kd_mpi_vicap_get_chn_attr](#215-kd_mpi_vicap_get_chn_attr)
+- [kd_mpi_vicap_init](#216-kd_mpi_vicap_init)
+- [kd_mpi_vicap_deinit](#217-kd_mpi_vicap_deinit)
+- [kd_mpi_vicap_start_stream](#218-kd_mpi_vicap_start_stream)
+- [kd_mpi_vicap_stop_stream](#219-kd_mpi_vicap_stop_stream)
+- [kd_mpi_vicap_dump_frame](#2110-kd_mpi_vicap_dump_frame)
+- [kd_mpi_vicap_dump_release](#2111-kd_mpi_vicap_dump_release)
+
+#### 2.1.1 kd_mpi_vicap_get_sensor_info
+
+【描述】
+
+根据指定的sensor配置类型获取sensor配置信息
+
+【语法】
+
+k_s32 kd_mpi_vicap_get_sensor_info(k_vicap_sensor_type sensor_type, k_vicap_sensor_info \*sensor_info)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------|---------------|
+| sensor_type | Sensor配置类型 | 输入 |
+| sensor_info | Sensor配置信息 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+应用开发者根据需要要使用的sensor配置类型,需要首先调用该API获取sensor配置信息,并根据配置信息调用后续接口对VICAP其他模块进行初始化。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.2 kd_mpi_vicap_set_dev_attr
+
+【描述】
+
+设置VICAP设备属性
+
+【语法】
+
+k_s32 kd_mpi_vicap_set_dev_attr(k_vicap_dev dev_num, k_vicap_dev_attr dev_attr)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|---------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+| dev_attr | VICAP设备属性 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.3 kd_mpi_vicap_get_dev_attr
+
+【描述】
+
+获取VICAP设备属性
+
+【语法】
+
+k_s23 kd_mpi_vicap_set_chn_attr(k_vicap_dev dev, k_vicap_chn_attr chn_attr)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|---------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+| dev_attr | VICAP设备属性 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.4 kd_mpi_vicap_set_chn_attr
+
+【描述】
+
+设置VICAP设备属性
+
+【语法】
+
+k_s32 kd_mpi_vicap_set_chn_attr(k_vicap_dev dev_num, k_vicap_chn chn_num, k_vicap_chn_attr chn_attr)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+| chn_num | VICAP输出通道号 | 输入 |
+| chn_attr | VICAP输出通道属性 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.5 kd_mpi_vicap_get_chn_attr
+
+【描述】
+
+获取VICAP设备属性
+
+【语法】
+
+k_s32 kd_mpi_vicap_get_chn_attr(k_vicap_dev dev_num, k_vicap_chn chn_num, k_vicap_chn_attr \*chn_attr)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+| chn_num | VICAP输出通道号 | 输入 |
+| chn_attr | VICAP输出通道属性 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.6 kd_mpi_vicap_init
+
+【描述】
+
+VICAP设备初始化
+
+【语法】
+
+k_s32 kd_mpi_vicap_init(k_vicap_dev dev_num)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+使用该接口之前需要先调用kd_mpi_vicap_set_dev_attr设置设备属性,再调用kd_mpi_vicap_set_chn_attr 设置输出通道属性。
+
+【举例】
+
+无
+
+【相关主题】
+
+#### 2.1.7 kd_mpi_vicap_deinit
+
+【描述】
+
+VICAP设备去初始化
+
+【语法】
+
+k_s32 kd_mpi_vicap_deinit(k_vicap_dev dev_num)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.8 kd_mpi_vicap_start_stream
+
+【描述】
+
+启动VICAP设备输出数据流
+
+【语法】
+
+k_s32 kd_mpi_vicap_start_stream(k_vicap_dev dev_num)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.9 kd_mpi_vicap_stop_stream
+
+【描述】
+
+停止VICAP设备数据流输出
+
+【语法】
+
+k_s32 kd_mpi_vicap_stop_stream(k_vicap_dev dev_num)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.10 kd_mpi_vicap_dump_frame
+
+【描述】
+
+根据指定的设备和输出通道dump vicap数据
+
+【语法】
+
+k_s32 kd_mpi_vicap_dump_frame(k_vicap_dev dev_num, k_vicap_chn chn_num, k_vicap_dump_format foramt,
+
+k_video_frame_info \*vf_info, k_u32 milli_sec)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-----------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+| chn_num | VICAP输出通道号 | 输入 |
+| foramt | Dump数据类型 | 输入 |
+| vf_info | Dump帧信息 | 输出 |
+| milli_sec | 超时时间 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.1.11 kd_mpi_vicap_dump_release
+
+【描述】
+
+释放dump数据帧
+
+【语法】
+
+k_s32 kd_mpi_vicap_dump_release(k_vicap_dev dev_num, k_vicap_chn chn_num, const k_video_frame_info \*vf_info)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-----------------|---------------|
+| dev_num | VICAP设备号 | 输入 |
+| chn_num | VICAP输出通道号 | 输入 |
+| vf_info | Dump帧信息 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_vicap_api.h
+- 库文件:libvicap.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+### 2.2 Sensor
+
+该功能模块提供以下API:
+
+- [kd_mpi_sensor_open](#221-kd_mpi_sensor_open)
+- [kd_mpi_sensor_close](#222-kd_mpi_sensor_close)
+- [kd_mpi_sensor_power_set](#223-kd_mpi_sensor_power_set)
+- [kd_mpi_sensor_id_get](#224-kd_mpi_sensor_id_get)
+- [kd_mpi_sensor_init](#225-kd_mpi_sensor_init)
+- [kd_mpi_sensor_reg_read](#226-kd_mpi_sensor_reg_read)
+- [kd_mpi_sensor_reg_write](#227-kd_mpi_sensor_reg_write)
+- [kd_mpi_sensor_mode_get](#228-kd_mpi_sensor_mode_get)
+- [kd_mpi_sensor_mode_set](#229-kd_mpi_sensor_mode_set)
+- [kd_mpi_sensor_stream_enable](#2210-kd_mpi_sensor_stream_enable)
+- [kd_mpi_sensor_again_set](#2211-kd_mpi_sensor_again_set)
+- [kd_mpi_sensor_again_get](#2212-kd_mpi_sensor_again_get)
+- [kd_mpi_sensor_dgain_set](#2213-kd_mpi_sensor_dgain_set)
+- [kd_mpi_sensor_dgain_get](#2214-kd_mpi_sensor_dgain_get)
+- [kd_mpi_sensor_intg_time_set](#2215-kd_mpi_sensor_intg_time_set)
+- [kd_mpi_sensor_intg_time_get](#2216-kd_mpi_sensor_intg_time_get)
+
+#### 2.2.1 kd_mpi_sensor_open
+
+【描述】
+
+根据sensor设备名称打开sensor设备
+
+【语法】
+
+k_s32 kd_mpi_sensor_open(const char \*sensor_name)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------|---------------|
+| sensor_name | Sensor设备名称 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 正值 | 成功。返回设备描述符 |
+| 负值 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.2 kd_mpi_sensor_close
+
+【描述】
+
+关闭sensor设备
+
+【语法】
+
+k_s32 kd_mpi_sensor_close (k_s32 fd)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.3 kd_mpi_sensor_power_set
+
+【描述】
+
+设置sensor电源状态
+
+【语法】
+
+k_s32 kd_mpi_sensor_power_set(k_s32 fd, k_bool on)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-----------------------------------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| on | 设置sensor上电状态,K_TRUE:上电,K_FALSE:下电 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.4 kd_mpi_sensor_id_get
+
+【描述】
+
+获取sensor id
+
+【语法】
+
+k_s32 kd_mpi_sensor_id_get(k_s32 fd, k_u32 \*sensor_id)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| sensor_id | 获取的sensor id | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.5 kd_mpi_sensor_init
+
+【描述】
+
+Sensor初始化
+
+【语法】
+
+k_s32 kd_mpi_sensor_init(k_s32 fd, k_sensor_mode mode)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|---------------------------------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| mode | 根据指定的sensor mode初始化sensor配置寄存器 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.6 kd_mpi_sensor_reg_read
+
+【描述】
+
+读取sensor寄存器内容
+
+【语法】
+
+k_s32 kd_mpi_sensor_reg_read(k_s32 fd, k_u32 reg_addr, k_u32 \*reg_val)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| reg_addr | Sensor寄存器地址 | 输入 |
+| reg_val | 读取寄存器内容 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.7 kd_mpi_sensor_reg_write
+
+【描述】
+
+写sensor寄存器内容
+
+【语法】
+
+k_s32 kd_mpi_sensor_reg_write(k_s32 fd, k_u32 reg_addr, k_u32 reg_val)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| reg_addr | Sensor寄存器地址 | 输入 |
+| reg_val | 写入sensor寄存器内容 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.8 kd_mpi_sensor_mode_get
+
+【描述】
+
+获取sensor mode配置
+
+【语法】
+
+k_s32 kd_mpi_sensor_mode_get(k_s32 fd, k_sensor_mode \*mode)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| mode | 返回获取的sensor mode配置参数 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.9 kd_mpi_sensor_mode_set
+
+【描述】
+
+设置sensor mode配置
+
+【语法】
+
+k_s32 kd_mpi_sensor_mode_get(k_s32 fd, k_sensor_mode mode)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| mode | 设置sensor mode配置参数 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.10 kd_mpi_sensor_stream_enable
+
+【描述】
+
+设置sensor mode配置
+
+【语法】
+
+k_s32 kd_mpi_sensor_stream_enable(k_s32 fd, k_s32 enable)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------------------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| enable | 设置sensor流输出状态,0:禁止输出,非0:使能输出 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.11 kd_mpi_sensor_again_set
+
+【描述】
+
+设置sensor 模拟增益
+
+【语法】
+
+k_s32 kd_mpi_sensor_again_set(k_s32 fd, k_sensor_gain gain)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| gain | gain配置参数 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.12 kd_mpi_sensor_again_get
+
+【描述】
+
+获取sensor 模拟增益
+
+【语法】
+
+k_s32 kd_mpi_sensor_again_set(k_s32 fd, k_sensor_gain \*gain)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| gain | gain配置参数 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.13 kd_mpi_sensor_dgain_set
+
+【描述】
+
+设置sensor 数字增益
+
+【语法】
+
+k_s32 kd_mpi_sensor_dgain_set(k_s32 fd, k_sensor_gain gain)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| gain | gain配置参数 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.14 kd_mpi_sensor_dgain_get
+
+【描述】
+
+获取sensor 数字增益
+
+【语法】
+
+k_s32 kd_mpi_sensor_dgain_get(k_s32 fd, k_sensor_gain \*gain)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| gain | gain配置参数 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.15 kd_mpi_sensor_intg_time_set
+
+【描述】
+
+设置sensor 积分时间
+
+【语法】
+
+k_s32 kd_mpi_sensor_intg_time_set(k_s32 fd, k_sensor_intg_time time)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| time | 积分时间配置参数 | 输入 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+#### 2.2.16 kd_mpi_sensor_intg_time_get
+
+【描述】
+
+获取sensor 积分时间
+
+【语法】
+
+k_s32 kd_mpi_sensor_intg_time_get(k_s32 fd, k_sensor_intg_time \*time)
+
+【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------|---------------|
+| fd | Sensor设备文件描述符 | 输入 |
+| time | 积分时间配置参数 | 输出 |
+
+【返回值】
+
+| **返回值** | **描述** |
+|------------|------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参考错误码定义。 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sensor_api.h
+- 库文件:libsensor.a
+
+【注意】
+
+无。
+
+【举例】
+
+无。
+
+【相关主题】
+
+## 3. 数据类型
+
+### 3.1 VICAP
+
+该功能模块的相关数据类型定义如下:
+
+- [k_vicap_sensor_type](#311-k_vicap_sensor_type)
+- [k_vicap_dev](#312-k_vicap_dev)
+- [k_vicap_chn](#313-k_vicap_chn)
+- [k_vicap_csi_num](#314-k_vicap_csi_num)
+- [k_vicap_mipi_lanes](#315-k_vicap_mipi_lanes)
+- [k_vicap_csi_data_type](#316-k_vicap_csi_data_type)
+- [k_vicap_data_source](#317-k_vicap_data_source)
+- [k_vicap_vi_dvp_port](#318-k_vicap_vi_dvp_port)
+- [k_vicap_vi_flash_mode](#319-k_vicap_vi_flash_mode)
+- [k_vicap_img_window](#3110-k_vicap_img_window)
+- [k_vicap_work_mode](#3111-k_vicap_work_mode)
+- [k_vicap_sensor_info](#3112-k_vicap_sensor_info)
+- [k_vicap_dump_format](#3113-k_vicap_dump_format)
+- [k_vicap_dev_attr](#3114-k_vicap_dev_attr)
+- [k_vicap_chn_attr](#3115-k_vicap_chn_attr)
+
+#### 3.1.1 k_vicap_sensor_type
+
+【说明】当前系统支持的sensor类型定义
+
+【定义】
+
+```c
+typedef enum {
+OV_OV9732_MIPI_1920X1080_30FPS_10BIT_LINEAR,
+OV_OV9732_MIPI_1920X1080_30FPS_10BIT_HDR,
+OV_OV9732_MIPI_1280X720_30FPS_10BIT_LINEAR,
+OV_OV9286_MIPI_1920X1080_30FPS_10BIT_LINEAR,
+OV_OV9286_MIPI_1920X1080_30FPS_10BIT_HDR,
+OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR,
+OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE,
+SENSOR_TYPE_MAX,
+} k_vicap_sensor_type;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|----------------------------------------------------|-----------------------------------------|
+| OV_OV9732_MIPI_1920X1080_30FPS_10BIT_LINEAR | OV9732 1080P 10bit 30帧线性输出配置 |
+| OV_OV9732_MIPI_1920X1080_30FPS_10BIT_HDR | OV9732 1080P 10bit 30帧HDR输出配置 |
+| OV_OV9732_MIPI_1280X720_30FPS_10BIT_LINEAR | OV9732 720P 10bit 30帧线性输出配置 |
+| OV_OV9286_MIPI_1920X1080_30FPS_10BIT_LINEAR | OV9286 1080P 10bit 30帧线性输出配置 |
+| OV_OV9286_MIPI_1920X1080_30FPS_10BIT_HDR | OV9286 1080P 10bit 30帧HDR输出配置 |
+| OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR | OV9286 720P 10bit 30帧线性输出 红外配置 |
+| OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE | OV9286 720P 10bit 30帧线性输出 散斑配置 |
+
+【注意事项】
+
+1. 该列表需要有sensor驱动开发人员维护,应用开发者通过此处定义的sensor type来打开指定类型的sensor设备
+1. 当前版本支持如下类型:
+
+ OV_OV9732_MIPI_1280X720_30FPS_10BIT_LINEAR
+
+ OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR
+
+ OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE
+
+#### 3.1.2 k_vicap_dev
+
+【说明】vicap设备号定义
+
+【定义】
+
+```c
+typedef enum {
+VICAP_DEV_ID_0 = 0,
+VICAP_DEV_ID_1 = 1,
+VICAP_DEV_ID_2 = 2,
+VICAP_DEV_ID_MAX,
+} k_vicap_dev;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|----------------|------------|
+| VICAP_DEV_ID_0 | VICAP设备0 |
+| VICAP_DEV_ID_1 | VICAP设备1 |
+| VICAP_DEV_ID_2 | VICAP设备2 |
+
+#### 3.1.3 k_vicap_chn
+
+【说明】vicap输出通道号定义
+
+【定义】
+
+```c
+typedef enum {
+VICAP_CHN_ID_0 = 0,
+VICAP_CHN_ID_1 = 1,
+VICAP_CHN_ID_2 = 2,
+VICAP_CHN_ID_MAX,
+} k_vicap_chn;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|----------------|----------------|
+| VICAP_CHN_ID_0 | VICAP输出通道0 |
+| VICAP_CHN_ID_1 | VICAP输出通道1 |
+| VICAP_CHN_ID_2 | VICAP输出通道2 |
+
+#### 3.1.4 k_vicap_csi_num
+
+【说明】vicap csi标号定义
+
+【定义】
+
+```c
+typedef enum {
+VICAP_CSI0 = 1,
+VICAP_CSI1 = 2,
+VICAP_CSI2 = 3,
+} k_vicap_csi_num;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|--------------|----------|
+| VICAP_CSI0 | CSI0 |
+| VICAP_CSI1 | CSI1 |
+| VICAP_CSI2 | CSI2 |
+
+【注意事项】
+
+Sensor连接的CSI号由硬件物理连接决定。
+
+#### 3.1.5 k_vicap_mipi_lanes
+
+【说明】vicap mipi通道数定义
+
+【定义】
+
+```c
+typedef enum {
+VICAP_MIPI_1LANE = 0,
+VICAP_MIPI_2LANE = 1,
+VICAP_MIPI_4LANE = 3,
+} k_vicap_mipi_lanes;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|------------------|----------|
+| VICAP_MIPI_1LANE | 1 lane |
+| VICAP_MIPI_2LANE | 2 lane |
+| VICAP_MIPI_4LANE | 4 lane |
+
+【注意事项】
+
+Sensor连接使用的mipi 通道个数由硬件物理连接决定,当使用4lane时,最多只能连接两个sensor。
+
+#### 3.1.6 k_vicap_csi_data_type
+
+【说明】vicap mipi通道数定义
+
+【定义】
+
+```c
+typedef enum {
+VICAP_CSI_DATA_TYPE_RAW8 = 0x2A,
+VICAP_CSI_DATA_TYPE_RAW10 = 0x2B,
+VICAP_CSI_DATA_TYPE_RAW12 = 0x2C,
+VICAP_CSI_DATA_TYPE_RAW14 = 0x2D,
+} k_vicap_csi_data_type;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|---------------------------|----------|
+| VICAP_CSI_DATA_TYPE_RAW8 | RAW8 |
+| VICAP_CSI_DATA_TYPE_RAW10 | RAW10 |
+| VICAP_CSI_DATA_TYPE_RAW12 | RAW12 |
+| VICAP_CSI_DATA_TYPE_RAW14 | RAW14 |
+
+【注意事项】
+
+无
+
+#### 3.1.7 k_vicap_data_source
+
+【说明】vicap 数据源
+
+【定义】
+
+```c
+typedef enum {
+VICAP_SOURCE_CSI0 = 0, /**< vicap acquire data from the csi0*/
+VICAP_SOURCE_CSI1 = 1, /**< vicap acquire data from the csi0*/
+VICAP_SOURCE_CSI1_FS_TR0 = 2, /**
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍媒体子系统中系统控制模块的功能和用法,其它模块的功能和用法将各有专门的文档加以论述。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|-------------------------------------|
+| mpp | Media Process Platform 媒体处理平台 |
+| vb | video buffer 视频缓存池 |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|----------|--------|----------|
+| V1.0 | 初版 | 郝海波 | 2023/3/4 |
+
+## 1. 概述
+
+### 1.1 概述
+
+系统控制根据 k230芯片特性,完成硬件各个部件的复位、基本初始化工作,同时负责完成 MPP(Media Process Platform 媒体处理平台)系统内存管理,日志管理,绑定管理等模块的初始化、去初始化。
+
+### 1.2 功能描述
+
+#### 1.2.1 视频缓存池
+
+视频缓存池是一组缓冲区(而不是一个),主要提供给多媒体硬件设备使用,并在多媒体硬件设备之间流转。缓存池分为公共缓存池和私有缓存池,公共缓存池主要是针对VI的,使用前要根据VI的图像参数确定缓存块的大小,然后向 申请一定数量的缓存块组成一个缓存池。总体来说,对于VI输入的原始画面,一帧的大小对应一个缓存块的大小,多个缓存块相当于给VI提供了多帧缓存的机制。同时这些公共缓存块也可以给VO或VENC使用。私有的缓存池往往代表存储在内存中的数据是与多媒体设备本身紧密相关的,例如编码的码流数据与实际的图像像素组成的视频流差别还是很大的,这些码流只有编解码器可用,而VB为这些设备提供专用的缓冲池。下图展示了虚拟VI和虚拟VO使用VB进行缓存块流转的流程。
+
+![图示 描述已自动生成](images/4c6fbf213dcaf35f8d035d69fcc43750.png)
+
+#### 1.2.2 系统绑定
+
+系统绑定,即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。K230大的语音和视频处理主要分为几个大的模块如下:
+
+语音:语音输入(Audio Input,简称AI), 语音编码(Audio Encoder,简称AENC),语音识别(Audio recognize,简称AREC),语音解码(Audio Decoder,简称ADEC),语音输出(Audio Output,简称AO)
+
+图像:视频输入(Video Input,简称VI),视频编码(Video Encoder,简称VENC),图像旋转(由GSDMA完成,简称DMA),深度处理单元(Depth Process Unit, 简称DPU),图像解码(Video Decoder,简称VDEC),视频输出(Video Output,简称VO),虚拟视频输入(Virtual Video Input,简称VVI),虚拟视频输出(Virtual Video Output,简称VVO)
+
+K230支持的绑定关系如下
+
+表 11
+
+| **数据源** | **数据接收者** | **说明** |
+|-------------------|----------------|----------------------------------------------------------|
+| VI(视频输入) | GSDMA | VI的数据可以送到GSDMA进行旋转处理 |
+| | VO | VI的数据可以直接送到VO进行显示 |
+| | DPU | VI的数据可以直接送到DPU进行处理 |
+| | VENC | VI的数据可以直接送到VENC进行处理 |
+| GSDMA(图像旋转) | VO | GSDMA 处理后的数据,可以直接送给VO显示 |
+| | DPU | GSDMA处理后的数据,可以直接送给DPU进行处理 |
+| | VENC | VPROC处理后的数据,可以直接送给VENC进行编码 |
+| VDEC(视频解码) | GSDMA | VDEC的数据最终会本地播放,播放前可能需要做旋转 |
+| | VO | VDEC的数据最终会本地播放 |
+| DPU(深度处理单元) | 无 | DPU是视频数据的终点,不支持绑定关系 |
+| VENC(视频编码) | 无 | 不支持绑定关系 |
+| VO(视频显示) | 无 | VO是视频数据的终点,不支持绑定关系 |
+| AI(音频输入) | AREC | AI处理后的数据,可以直接送给语音识别模块进行识别 |
+| | AENC | AI处理后的数据,可以直接送给语音编码模块进行编码 |
+| | AO | AI处理后的数据,可以直接进行播放 |
+| ADEC(语音解码) | AO | ADEC处理后的数据,可以直接进行播放 |
+| AREC(语音识别) | AO | AREC处理后的数据,可以直接进行播放,例如本地离线语音翻译 |
+| AENC(语音编码) | 无 | 不支持绑定关系 |
+| AO(音频输出) | 无 | AO是音频数据的终点,不支持绑定关系 |
+
+## 2. API 参考
+
+### 2.1 多媒体内存管理
+
+该功能模块提供以下API:
+
+- [kd\_mpi\_sys\_mmz\_alloc](#211-kd_mpi_sys_mmz_alloc)
+- [kd\_mpi\_sys\_mmz\_alloc\_cached](#212-kd_mpi_sys_mmz_alloc_cached)
+- [kd\_mpi\_sys\_mmap](#213-kd_mpi_sys_mmap)
+- [kd\_mpi\_sys\_mmap\_cached](#214-kd_mpi_sys_mmap_cached)
+- [kd\_mpi\_sys\_munmap](#215-kd_mpi_sys_munmap)
+- [kd\_mpi\_sys\_mmz\_flush\_cache](#216-kd_mpi_sys_mmz_flush_cache)
+- [kd\_mpi\_sys\_mmz\_free](#217-kd_mpi_sys_mmz_free)
+- [kd\_mpi\_sys\_get\_virmem\_info](#218-kd_mpi_sys_get_virmem_info)
+- [kd\_mpi\_vb\_set\_config](#219-kd_mpi_vb_set_config)
+- [kd\_mpi\_vb\_get\_config](#2110-kd_mpi_vb_get_config)
+- [kd\_mpi\_vb\_init](#2111-kd_mpi_vb_init)
+- [kd\_mpi\_vb\_exit](#2112-kd_mpi_vb_exit)
+- [kd\_mpi\_vb\_create\_pool](#2113-kd_mpi_vb_create_pool)
+- [kd\_mpi\_vb\_destory\_pool](#2114-kd_mpi_vb_destory_pool)
+- [kd\_mpi\_vb\_get\_block](#2115-kd_mpi_vb_get_block)
+- [kd\_mpi\_vb\_release\_block](#2116-kd_mpi_vb_release_block)
+- [kd\_mpi\_vb\_phyaddr\_to\_handle](#2117-kd_mpi_vb_phyaddr_to_handle)
+- [kd\_mpi\_vb\_handle\_to\_phyaddr](#2118-kd_mpi_vb_handle_to_phyaddr)
+- [kd\_mpi\_vb\_handle\_to\_pool\_id](#2119-kd_mpi_vb_handle_to_pool_id)
+- [kd\_mpi\_vb\_inquire\_user\_cnt](#2120-kd_mpi_vb_inquire_user_cnt)
+- [kd\_mpi\_vb\_get\_supplement\_attr](#2121-kd_mpi_vb_get_supplement_attr)
+- [kd\_mpi\_vb\_set\_supplement\_config](#2122-kd_mpi_vb_set_supplement_config)
+- [kd\_mpi\_vb\_get\_supplement\_config](#2123-kd_mpi_vb_get_supplement_config)
+- [kd\_mpi\_vb\_set\_mod\_pool\_config](#2124-kd_mpi_vb_set_mod_pool_config)
+- [kd\_mpi\_vb\_get\_mod\_pool\_config](#2125-kd_mpi_vb_get_mod_pool_config)
+- [kd\_mpi\_vb\_init\_mod\_common\_pool](#2126-kd_mpi_vb_init_mod_common_pool)
+- [kd\_mpi\_vb\_exit\_mod\_common\_pool](#2127-kd_mpi_vb_exit_mod_common_pool)
+
+#### 2.1.1 kd_mpi_sys_mmz_alloc
+
+【描述】
+
+在用户空间申请MMZ内存
+
+【语法】
+
+k_s32 kd_mpi_sys_mmz_alloc(k_u64\* phy_addr, void\*\* virt_addr, const k_char\* mmb, const k_char\* zone, k_u32 len);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------|------------------------------|-----------|
+| phy_addr | 物理地址指针。 | 输出 |
+| virt_addr | 指向虚拟地址指针的指针。 | 输出 |
+| mmb | Mmb 名称的字符串指针。 | 输入 |
+| zone | MMZ zone 名称的字符串指针。 | 输入 |
+| len | 内存块大小。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#412-多媒体内存zone错误码) |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:mpi_sys_api.h
+- 库文件:libsys.a
+
+【注意】
+
+MMZ由多个zone组成,每个zone有多个MMB。你可以调用这个MPI,在MMZ的\*zone分配一个大小为len的内存块\*mmb。在这种情况下,指向物理地址和用户模式虚拟地址的指针被返回。如果在MMZ中存在匿名区,将\*zone设置为null。如果\*mmb被设置为null,创建的MMB就被命名为null。【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.2 kd_mpi_sys_mmz_alloc_cached
+
+【描述】
+
+在用户空间申请带cache的MMZ内存
+
+【语法】
+
+k_s32 kd_mpi_sys_mmz_alloc_cached(k_u64\* phy_addr, void\*\* virt_addr, const k_char\* mmb, const k_char\* zone, k_u32 len);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------|------------------------------|-----------|
+| phy_addr | 物理地址指针。 | 输出 |
+| virt_addr | 指向虚拟地址指针的指针。 | 输出 |
+| mmb | Mmb 名称的字符串指针。 | 输入 |
+| zone | MMZ zone 名称的字符串指针。 | 输入 |
+| len | 内存块大小。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#412-多媒体内存zone错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h
+- 库文件:libsys.a
+
+【注意】
+
+- [kd_mpi_sys_mmz_alloc_cached](#212-kd_mpi_sys_mmz_alloc_cached)与[kd_mpi_sys_mmz_alloc](#211-kd_mpi_sys_mmz_alloc)之间的区别:通过调用[kd_mpi_sys_mmz_alloc_cached](#212-kd_mpi_sys_mmz_alloc_cached)分配的内存支持缓存,如果要分配的内存将被频繁使用,推荐使用[kd_mpi_sys_mmz_alloc_cached](#212-kd_mpi_sys_mmz_alloc_cached)。这样可以提高CPU的读/写效率和系统性能。
+- 当 cpu 访问此接口分配的内存时,会将内存中的数据放在 cache 中。硬件设备只能访问物理内存而不是缓存。在这种情况下[kd_mpi_sys_mmz_flush_cache](#216-kd_mpi_sys_mmz_flush_cache)需要被调用来同步数据。
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.3 kd_mpi_sys_mmap
+
+【描述】
+
+memory 存储映射接口。
+
+【语法】
+
+void \*kd_mpi_sys_mmap(k_u64 phy_addr, k_u32 size);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|--------------------------|-----------|
+| phy_addr | 需映射的内存单元起始地址 | 输入 |
+| size | 映射的字节数 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|----------|
+| 0 | 无效地址 |
+| 非0 | 有效地址 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h
+- 库文件:libsys.a
+
+【注意】
+
+- 通过MMZ申请得到的物理地址才可以使用这个API进行映射
+- 如果地址区间属于一个VB,那么映射的大小需要小于VB池的大小
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_sys_munmap()](#215-kd_mpi_sys_munmap)
+
+#### 2.1.4 kd_mpi_sys_mmap_cached
+
+【描述】
+
+memory 存储映射带cache的接口。
+
+【语法】
+
+void \*kd_mpi_sys_mmap_cached(k_u64 phy_addr, k_u32 size);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|--------------------------|-----------|
+| phy_addr | 需映射的内存单元起始地址 | 输入 |
+| size | 映射的字节数 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|----------|
+| 0 | 无效地址 |
+| 非0 | 有效地址 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h
+- 库文件:libsys.a
+
+【注意】
+
+- 通过MMZ申请得到的物理地址才可以使用这个API进行映射
+- 如果地址区间属于一个VB,那么映射的大小需要小于VB池的大小
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.5 kd_mpi_sys_munmap
+
+【描述】
+
+memory 存储映射解除接口。
+
+【语法】
+
+void \*kd_mpi_sys_mmap(void \*virt_addr, k_u32 size);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------|--------------------|-----------|
+| virt_addr | mmap返回的虚拟地址 | 输入 |
+| size | 映射的字节数 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|------|
+| 0 | 成功 |
+| 非0 | 失败 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+- [kd_mpi_sys_mmap](#213-kd_mpi_sys_mmap)
+- [kd_mpi_sys_mmap_cached](#214-kd_mpi_sys_mmap_cached)
+
+#### 2.1.6 kd_mpi_sys_mmz_flush_cache
+
+【描述】
+
+刷新 cache 里的内容到内存并且使 cache 里的内容无效。
+
+【语法】
+
+k_s32 kd_mpi_sys_mmz_flush_cache(k_u64 phy_addr, void\* virt_addr, k_u32 size);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------|-------------------------------------------|-----------|
+| phy_addr | 待操作数据的起始物理地址。 | 输入 |
+| virt_addr | 待操作数据的起始虚拟地址指针。不能传 NULL | 输入 |
+| size | 待操作数据的大小 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#412-多媒体内存zone错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h
+- 库文件:libsys.a
+
+【注意】
+
+- 如果缓存中的数据是最新的数据,你需要调用这个MPI来同步数据到内存。这可以确保不能直接访问缓存的硬件可以获得正确的数据。.
+- 必须先调用[kd_mpi_sys_mmz_alloc_cached](#212-kd_mpi_sys_mmz_alloc_cached)然后再使用这个MPI
+- 若将 phy_addr 设为 0,则表示操作整个 cache 区域。(暂不支持)
+- 你需要确保传输的参数是有效的
+- 确保在执行刷新操作时不调用[kd_mpi_sys_mmz_free](#217-kd_mpi_sys_mmz_free)来释放被刷新的内存。否则,不可预知的异常可能会 发生。
+
+【举例】
+
+无
+
+【相关主题】
+
+- [kd_mpi_sys_mmz_alloc_cached](#212-kd_mpi_sys_mmz_alloc_cached)
+- [kd_mpi_sys_mmap_cached](#214-kd_mpi_sys_mmap_cached)
+
+#### 2.1.7 kd_mpi_sys_mmz_free
+
+【描述】
+
+在用户态释放 MMZ 内存。
+
+【语法】
+
+k_s32 kd_mpi_sys_mmz_free(k_u64 phy_addr, void\* virt_addr);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------|----------------|-----------|
+| phy_addr | 物理地址。 | 输入 |
+| virt_addr | 虚拟地址指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#412-多媒体内存zone错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h
+- 库文件:libsys.a
+
+【注意】
+
+- 输入的地址必须为有效的物理地址,虚拟地址指针可以置为 NULL。
+- 不能释放正在进行 flush 操作的内存,否则会引发不可预知的异常。
+
+【举例】
+
+无
+
+【相关主题】
+
+- [kd_mpi_sys_mmz_alloc](#211-kd_mpi_sys_mmz_alloc)
+- [kd_mpi_sys_mmz_alloc_cached](#212-kd_mpi_sys_mmz_alloc_cached)
+
+#### 2.1.8 kd_mpi_sys_get_virmem_info
+
+【描述】
+
+根据虚拟地址获取对应的内存信息,包括物理地址及 cached 属性
+
+【语法】
+
+k_s32 kd_mpi_sys_get_virmem_info(const void\* virt_addr, k_sys_virmem_info\* mem_info);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------|---------------------------------------------------------|-----------|
+| virt_addr | 虚拟地址指针。 | 输入 |
+| mem_info | 虚拟地址对应的内存信息,含物理地址、cached 属性等信息。 | 输出 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#412-多媒体内存zone错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_mmz_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+- 输入必须为用户态虚拟地址。
+- 不支持跨进程使用。
+
+【举例】
+
+无
+
+【相关主题】
+
+- [kd_mpi_sys_mmz_alloc](#211-kd_mpi_sys_mmz_alloc)
+- [kd_mpi_sys_mmz_alloc_cached](#212-kd_mpi_sys_mmz_alloc_cached)
+
+#### 2.1.9 kd_mpi_vb_set_config
+
+【描述】
+
+设置 MPP 视频缓存池属性。
+
+【语法】
+
+k_s32 kd_mpi_vb_set_config(const [k_vb_config](#323-k_vb_config) \*config);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|----------------------|-----------|
+| config | 视频缓存池属性指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 只能在系统处于未初始化的状态下,才可以设置缓存池属性,否则会返回失败。
+- 公共缓存池中每个缓存块的大小应根据当前图像像素格式以及图像是否压缩而有
+
+ 所不同。具体分配大小请参考 [k_vb_config](#323-k_vb_config) 结构体中的描述。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_get_config](#2110-kd_mpi_vb_get_config)
+
+#### 2.1.10 kd_mpi_vb_get_config
+
+【描述】
+
+获取 MPP 视频缓存池属性。
+
+【语法】
+
+k_s32 kd_mpi_vb_get_config(const [k_vb_config](#323-k_vb_config) \*config);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|----------------------|-----------|
+| config | 视频缓存池属性指针。 | 输出 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+必须先调用 [kd_mpi_vb_set_config](#219-kd_mpi_vb_set_config) 设置 MPP 视频缓存池属性,再获取属性。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_set_config](#219-kd_mpi_vb_set_config)
+
+#### 2.1.11 kd_mpi_vb_init
+
+【描述】
+
+初始化 MPP 视频缓存池。。
+
+【语法】
+
+k_s32 kd_mpi_vb_init(void);
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 必须先调用 [kd_mpi_vb_set_config](#219-kd_mpi_vb_set_config) 设置 MPP 视频缓存池属性,再初始化缓存池,否则会失
+ 败。
+- 可反复初始化,不返回失败。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_exit](#2112-kd_mpi_vb_exit)
+
+#### 2.1.12 kd_mpi_vb_exit
+
+【描述】
+
+去初始化 MPP 视频缓存池。。
+
+【语法】
+
+k_s32 kd_mpi_vb_exit(void);
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 去初始化不会清除先前对缓存池的配置。
+- 可反复去初始化,不返回失败。
+- 退出 VB 池之前请确保 VB 池里的任何 VB 都没有被占用,否则无法退出。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_init](#2111-kd_mpi_vb_init)
+
+#### 2.1.13 kd_mpi_vb_create_pool
+
+【描述】
+
+创建一个视频缓存池
+
+【语法】
+
+k_s32 kd_mpi_vb_create_pool([k_vb_pool_config](#324-k_vb_pool_config) \*config);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|------------------------|-----------|
+| config | 缓存池配置属性参数指针 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|----------------------|--------------------------------------------------|
+| 非 VB_INVALID_POOLID | 有效的缓存池 ID 号 |
+| VB_INVALID_POOLID | 创建缓存池失败,可能是参数非法或者保留内存不够。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_destory_pool](#2114-kd_mpi_vb_destory_pool)
+
+#### 2.1.14 kd_mpi_vb_destory_pool
+
+【描述】
+
+销毁一个视频缓存池。
+
+【语法】
+
+k_s32 kd_mpi_vb_destory_pool(k_u32 pool_id);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|----------------------------------------------|-----------|
+| pool_id | 缓存池 ID 号。 取值范围:[0, VB_MAX_POOLS)。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|---------------------------------------------|
+| 0 | 成功。 |
+| 非 0 | 失败,其值参见[错误码](#411-视频缓存池错误码)。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 销毁一个不存在的缓存池,会返回[K_ERR_VB_UNEXIST](#411-视频缓存池错误码)
+- 只有通过[k_mpi_vb_create_pool](#2113-kd_mpi_vb_create_pool)创建的缓存池才可以销毁
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_create_pool](#2113-kd_mpi_vb_create_pool)
+
+#### 2.1.15 kd_mpi_vb_get_block
+
+【描述】
+
+用户态获取一个缓存块
+
+【语法】
+
+k_vb_blk_handle kd_mpi_vb_get_block(k_u32 pool_id, k_u64 blk_size, const k_char \*mmz_name);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|---------------------------------------------------------|-----------|
+| pool_id | 缓存池 ID 号。 取值范围:[0, VB_MAX_POOLS)。 | 输入 |
+| blk_size | 缓存块大小。 取值范围:数据类型全范围,以 byte 为单位。 | 输入 |
+| mmz_name | 缓存池所在 DDR 的名字。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|----------------------|------------------|
+| 非 VB_INVALID_HANDLE | 有效的缓存块句柄 |
+| VB_INVALID_HANDLE | 获取缓存块失败 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 用户可以在创建一个缓存池之后,调用本接口从该缓存池中获取一个缓存块;即将第 1 个参数 P设置为创建的缓存池 ID;从指定缓存池获取缓存块时,参数mmz_name 无效 \*
+- 如果用户需要从任意一个公共缓存池中获取一块指定大小的缓存块,则可以将第 1个参数 Pool 设置为无效 ID 号(VB_INVALID_POOLID),将第 2 个参数blk_size 设置为需要的缓存块大小,并指定要从哪个 DDR 上的公共缓存池获取缓存块。如果指定的 DDR 上并没有公共缓存池,那么将获取不到缓存块。如果mmz_name 等于 NULL,则表示在匿名DDR 上的公共缓存池获取缓存块。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_release_block](#2116-kd_mpi_vb_release_block)
+
+#### 2.1.16 kd_mpi_vb_release_block
+
+【描述】
+
+用户态释放一个缓存块
+
+【语法】
+
+k_s32 kd_mpi_vb_release_block(k_vb_blk_handle block);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------|-----------|
+| block | vb 块句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|---------------------------------------------|
+| 0 | 成功。 |
+| 非 0 | 失败,其值参见[错误码](#411-视频缓存池错误码)。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+获取的缓存块使用完后,应该调用此接口释放缓存块。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_get_block](#2115-kd_mpi_vb_get_block)
+
+#### 2.1.17 kd_mpi_vb_phyaddr_to_handle
+
+【描述】
+
+用户态通过缓存块的物理地址获取其句柄。
+
+【语法】
+
+k_vb_blk_handle kd_mpi_vb_phyaddr_to_handle(k_u64 phys_addr);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------|-----------|-----------|
+| phys_addr | vb 块句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|----------------------|--------------------|
+| 非 VB_INVALID_HANDLE | 有效的缓存块句柄 |
+| VB_INVALID_HANDLE | 获取缓存快句柄失败 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+物理地址应该是从 MPP 视频缓存池中获取的有效缓存块的地址。
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.18 kd_mpi_vb_handle_to_phyaddr
+
+【描述】
+
+用户态获取一个缓存块的物理地址
+
+【语法】
+
+k_u64 kd_mpi_vb_handle_to_phyaddr(k_vb_blk_handle block);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------|-----------|
+| block | vb 块句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|------------------------------|
+| 0 | 无效返回值,缓存块句柄非法。 |
+| 非 0 | 有效物理地址。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+指定的缓存块应该是从 MPP 视频缓存池中获取的有效缓存块。
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.19 kd_mpi_vb_handle_to_pool_id
+
+【描述】
+
+用户态获取一个帧缓存块所在缓存池的 ID。
+
+【语法】
+
+k_s32 kd_mpi_vb_handle_to_pool_id(k_vb_blk_handle block);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------|-----------|
+| block | vb 块句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|----------------------|--------------------|
+| 非 VB_INVALID_POOLID | 有效的缓存池 ID 号 |
+| VB_INVALID_POOLID | 获取缓存池ID失败。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+指定的缓存块应该是从 MPP 视频缓存池中获取的有效缓存块。
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.20 kd_mpi_vb_inquire_user_cnt
+
+【描述】
+
+查询缓存块使用计数信息。
+
+【语法】
+
+k_s32 kd_mpi_vb_inquire_user_cnt(k_vb_blk_handle block);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------|-----------|
+| block | vb 块句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|----------|--------------------|
+| K_FAILED | 查询失败 |
+| 其他值 | 缓存块使用计数值。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+无。
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.21 kd_mpi_vb_get_supplement_attr
+
+【描述】
+
+获取 VB Block 内存的辅助信息。
+
+【语法】
+
+k_s32 kd_mpi_vb_get_supplement_attr(k_vb_blk_handle block, [k_video_supplement](#333-k_video_supplement) \*supplement);【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|------------|-------------------------------------------------|-----------|
+| block | vb 块句柄 | 输入 |
+| supplement | vb block 内存的辅助信息。 如ISP信息、DCF 信息等 | 输出 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+Supplement保存的DCF和ISP的虚拟地址信息为内核态虚拟地址
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.22 kd_mpi_vb_set_supplement_config
+
+【描述】
+
+设置 VB 内存的附加信息。
+
+![打开的书 轮廓](458c9a7b50ccf347bf7ed5e8c4c5b7a8.png)说明
+
+有些信息需要附加在 VB 内存的后面。例如 DCF 信息、ISP 的统计信息、ISP 的一些实时参数
+
+等,这些附加的信息可以跟着 VB 内存在 MPP 各个模块传递。用户态获取 VB 内存,也可以获
+
+取到这些信息。
+
+【语法】
+
+k_s32 kd_mpi_vb_set_supplement_config(const [k_vb_supplement_config](#326-k_vb_supplement_config) \*supplement_config);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-------------------|----------------------------------------------------|-----------|
+| supplement_config | VB 内存附加信息控制结构体。 用于附加信息分配内存。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 当前支持 2 种 VB 内存附加信息,分别为:
+- DCF 信息,对应结构体[k_jpeg_dcf](#335-k_jpeg_dcf)。对应的 MASK 为VB_SUPPLEMENT_JPEG_MASK。
+- ISP信息,对应结果提[k_isp_frame_info](#334-k_isp_frame_info)。对应的MASK为VB_SUPPLEMENT_ISPINFO_MASK。
+- 需要在 [kd_mpi_vb_init](#2111-kd_mpi_vb_init) 前调用此接口,辅助信息才能生效。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_get_supplement_config](#2123-kd_mpi_vb_get_supplement_config)
+
+#### 2.1.23 kd_mpi_vb_get_supplement_config
+
+【描述】
+
+获取VB 内存的附加信息。
+
+【语法】
+
+k_s32 kd_mpi_vb_set_supplement_config(const [k_vb_supplement_config](#326-k_vb_supplement_config) \*supplement_config);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-------------------|----------------------------------------------------|-----------|
+| supplement_config | VB 内存附加信息控制结构体。 用于附加信息分配内存。 | 输出 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+kd_mpi_vb_set_supplement_config
+
+#### 2.1.24 kd_mpi_vb_set_mod_pool_config
+
+【描述】
+
+设置模块公共视频缓存池属性。
+
+【语法】
+
+k_s32 kd_mpi_vb_set_mod_pool_config(k_vb_uid vb_uid, const [k_vb_config](#323-k_vb_config) \*config);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------------------------------|-----------|
+| vb_uid | 使用模块公共视频缓冲池的模块 ID。 | 输入 |
+| config | 视频缓存池属性指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 模块公共视频缓冲区的配置根据实际需要配置,否则会造成内存浪
+- 如果模块 VB 已创建,再次配置返回错误码 KD_ERR_VB_BUSY
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_get_mod_pool_config](#2125-kd_mpi_vb_get_mod_pool_config)
+
+#### 2.1.25 kd_mpi_vb_get_mod_pool_config
+
+【描述】
+
+获取模块公共视频缓存池属性。
+
+【语法】
+
+k_s32 kd_mpi_vb_get_mod_pool_config(k_vb_uid vb_uid, [k_vb_config](#323-k_vb_config) \*config);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------------------------------|-----------|
+| vb_uid | 使用模块公共视频缓冲池的模块 ID。 | 输入 |
+| config | 视频缓存池属性指针。 | 输出 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+必须先调用 [kd_mpi_vb_set_mod_pool_config](#2124-kd_mpi_vb_set_mod_pool_config) 设置模块公共视频缓存池属性,再获取属
+
+性。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_set_mod_pool_config](#2124-kd_mpi_vb_set_mod_pool_config)
+
+#### 2.1.26 kd_mpi_vb_init_mod_common_pool
+
+【描述】
+
+初始化模块公共视频缓存池。
+
+【语法】
+
+k_s32 kd_mpi_vb_init_mod_common_pool([k_vb_uid](#322-k_vb_uid) vb_uid);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------------------------------|-----------|
+| vb_uid | 使用模块公共视频缓冲池的模块 ID。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 必须先调用[kd_mpi_vb_init](#2111-kd_mpi_vb_init) 进行公共视频缓冲池初始化。
+- 必须先调用 [kd_mpi_vb_set_mod_pool_config](#2124-kd_mpi_vb_set_mod_pool_config)f配置缓存池属性,再初始化缓存池,否则会失败。
+- 可反复初始化,不返回失败。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_exit_mod_common_pool](#2127-kd_mpi_vb_exit_mod_common_pool)
+
+#### 2.1.27 kd_mpi_vb_exit_mod_common_pool
+
+【描述】
+
+退出模块公共视频缓存池。
+
+【语法】
+
+k_s32 kd_mpi_vb_exit_mod_common_pool([k_vb_uid](#322-k_vb_uid) vb_uid);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------------------------------|-----------|
+| vb_uid | 使用模块公共视频缓冲池的模块 ID。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-------------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#411-视频缓存池错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vb_api.h k_vb_comm.h
+- 库文件:libvb.a
+
+【注意】
+
+- 必须在调用[kd_mpi_vb_exit](#2112-kd_mpi_vb_exit) 之前调用该接口,否则会返回失败。
+- 退出后会清除先前对模块公共视频缓存池的配置。
+- 可反复退出,不返回失败。
+- 退出 VB 池之前请确保 VB 池里的任何 VB 都没有被占用,否则无法退出。
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_vb_init_mod_common_pool](#2126-kd_mpi_vb_init_mod_common_pool)
+
+### 2.2 系统绑定
+
+该功能模块提供以下API:
+
+- [kd_mpi_sys_bind](#221-kd_mpi_sys_bind)
+- [kd_mpi_sys_unbind](#222-kd_mpi_sys_unbind)
+- [kd_mpi_sys_get_bind_by_dest](#223-kd_mpi_sys_get_bind_by_dest)
+
+#### 2.2.1 kd_mpi_sys_bind
+
+【描述】
+
+数据源到数据接收者绑定接口
+
+【语法】
+
+k_s32 kd_mpi_sys_bind([k_mpp_chn](#312-k_mpp_chn) \*src_chn, [k_mpp_chn](#312-k_mpp_chn) \*dest_chn);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|----------------|-----------|
+| src_chn | 源通道指针。 | 输入 |
+| dest_chn | 目的通道指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#42-系统绑定错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h
+- 库文件:libsys.a
+
+【注意】
+
+- 系统目前支持的绑定关系,请参见[表 1-1](#411-视频缓存池错误码)。
+- 同一个数据接收者只能绑定一个数据源。
+- 绑定是指数据源和数据接收者建立关联关系。绑定后,数据源生成的数据将自动
+ 发送给接收者
+
+【举例】
+
+无/xx。
+
+【相关主题】
+
+[kd_mpi_sys_unbind](#222-kd_mpi_sys_unbind)
+
+#### 2.2.2 kd_mpi_sys_unbind
+
+【描述】
+
+数据源到数据接收者解绑定接口。
+
+【语法】
+
+k_s32 kd_mpi_sys_unbind([k_mpp_chn](#312-k_mpp_chn) \*src_chn, [k_mpp_chn](#312-k_mpp_chn) \*dest_chn);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|----------------|-----------|
+| src_chn | 源通道指针。 | 输入 |
+| dest_chn | 目的通道指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#42-系统绑定错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h
+- 库文件:libsys.a
+
+【注意】
+
+pstDestChn 如果找不到绑定的源通道,则直接返回成功。如果找到了绑定的源通道,
+但是绑定的源通道和 pstSrcChn 不匹配,则返回失败。
+
+【举例】
+
+无/xx。
+
+【相关主题】
+
+[kd_mpi_sys_bind](#221-kd_mpi_sys_bind)
+
+#### 2.2.3 kd_mpi_sys_get_bind_by_dest
+
+【描述】
+
+获取此通道上绑定的源通道的信息。
+
+【语法】
+
+k_s32 kd_mpi_sys_get_bind_by_dest([k_mpp_chn](#312-k_mpp_chn) \*dest_chn, [k_mpp_chn](#312-k_mpp_chn) \*src_chn);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|----------------|-----------|
+| src_chn | 源通道指针。 | 输出 |
+| dest_chn | 目的通道指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#42-系统绑定错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无/xx。
+
+【相关主题】
+
+- [kd_mpi_sys_bind](#221-kd_mpi_sys_bind)
+- [kd_mpi_sys_unbind](#222-kd_mpi_sys_unbind)
+
+### 2.3 日志管理
+
+该功能模块提供以下API:
+
+- [kd_mpi_log_set_level_conf](#231-kd_mpi_log_set_level_conf)
+- [kd_mpi_log_get_level_conf](#232-kd_mpi_log_get_level_conf)
+- [kd_mpi_log_set_wait_flag](#233-kd_mpi_log_set_wait_flag)
+- [kd_mpi_log_read](#234-kd_mpi_log_read)
+- [kd_mpi_log_close](#235-kd_mpi_log_close)
+- [kd_mpi_log_set_console](#236-kd_mpi_log_set_console)
+- [kd_mpi_log_get_console](#237-kd_mpi_log_get_console)
+
+#### 2.3.1 kd_mpi_log_set_level_conf
+
+【描述】
+
+设置日志等级。。
+
+【语法】
+
+k_s32 kd_mpi_log_set_level_conf(const [k_log_level_conf](#341-k_log_level_conf) \*conf);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------------------|-----------|
+| conf | 日志等级信息结构体。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#43-日志管理错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h k_log_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+当 conf中的成员 mod_name 设置为字符串“all”时,将设置全部模块的日志等级。否
+则,只设定mod_id指定的模块的日志等级
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_log_get_level_conf](#232-kd_mpi_log_get_level_conf)
+
+#### 2.3.2 kd_mpi_log_get_level_conf
+
+【描述】
+
+设置日志等级。。
+
+【语法】
+
+k_s32 kd_mpi_log_get_level_conf([k_log_level_conf](#341-k_log_level_conf) \*conf);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|-----------------|-----------------------------|-----------|
+| conf-\>mod_id | 需要获取日志等级的模块 ID。 | 输入 |
+| conf-\>level | 获取到的日志等级 | 输出 |
+| conf-\>mod_name | 模块的名字 | 输出 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#43-日志管理错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h k_log_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_log_set_level_conf](#231-kd_mpi_log_set_level_conf)
+
+#### 2.3.3 kd_mpi_log_set_wait_flag
+
+【描述】
+
+设置读取日志时等待标志。
+
+【语法】
+
+k_s32 kd_mpi_log_set_wait_flag(k_bool is_wait);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|-----------------------------|-----------|
+| is_wait | 读取日志时是否等待的标志。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#43-日志管理错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h k_log_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.4 kd_mpi_log_read
+
+【描述】
+
+读取日志。
+
+【语法】
+
+k_s32 kd_mpi_log_read(k_char \*buf, k_u32 size);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|----------|---------------------------|-----------|
+| buf | 用于存放日志的内存指针。 | 输出 |
+| size | 读取日志的大小。 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|------------|------------------------|
+| 大于等于 0 | 成功读取的日志的大小。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h k_log_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.5 kd_mpi_log_close
+
+【描述】
+
+关闭日志文件。。
+
+【语法】
+
+void kd_mpi_log_close(void);
+
+【参数】
+
+无
+
+【返回值】
+
+无
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h k_log_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.6 kd_mpi_log_set_console
+
+【描述】
+
+配置日志是否直接通过控制台打印。
+
+【语法】
+
+k_s32 kd_mpi_log_set_console(k_bool is_console);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|------------|--------------------|-----------|
+| is_console | 是否通过控制台打印 | 输入 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#43-日志管理错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h k_log_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_log_get_console](#237-kd_mpi_log_get_console)
+
+#### 2.3.7 kd_mpi_log_get_console
+
+【描述】
+
+获取日志是否直接通过控制台打印。
+
+【语法】
+
+k_s32 kd_mpi_log_set_console(k_bool is_console);
+
+【参数】
+
+| **参数名称** | **描述** | 输入/输出 |
+|------------|--------------------|-----------|
+| is_console | 是否通过控制台打印 | 输出 |
+
+【返回值】
+
+| 返回值 | **描述** |
+|--------|-----------------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见[错误码](#43-日志管理错误码) |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_sys_api.h k_module.h k_log_comm.h
+- 库文件:libsys.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+[kd_mpi_log_set_console](#236-kd_mpi_log_set_console)
+
+## 3. 数据类型
+
+### 3.1 公共数据类型
+
+该模块有如下数据类型
+
+- [k_mod_id](#311-k_mod_id)
+- [k_mpp_chn](#312-k_mpp_chn)
+
+#### 3.1.1 k_mod_id
+
+【说明】
+
+定义模块 ID 枚举类型。
+
+【定义】
+
+```C
+typedef enum {
+
+K_ID_CMPI = 0, /*< common module platform interface */
+
+K_ID_LOG = 1, /*< mpi device log */
+
+K_ID_MMZ = 2, /*< media memory zone */
+
+K_ID_MMZ_USER_DEV = 3, /*< media memory zone user used */
+
+K_ID_VB = 4, /*< video buffer device */
+
+K_ID_SYS = 5, /*< system contrl device */
+
+K_ID_VI = 6, /*< video in device */
+
+K_ID_VPROC = 7, /*< video proc device */
+
+K_ID_VREC = 8, /*< video recognize device */
+
+K_ID_VENC = 9, /*< video encoding device */
+
+K_ID_VDEC = 10, /*< video decoding device */
+
+K_ID_VO = 11, /*< video output device */
+
+K_ID_AI = 12, /*< audio input device */
+
+K_ID_AREC = 13, /*< audio recognize device */
+
+K_ID_AENC = 14, /*< audio encoding device */
+
+K_ID_ADEC = 15, /*< audio decoding device */
+
+K_ID_AO = 16, /*< audio output device */
+
+K_ID_DPU = 17, /*< depth Process Unit */
+
+K_ID_V_VI, /*< virtual video input device */
+
+K_ID_V_VO, /*< virtual video output device */
+
+K_ID_DMA, /*< dma device */
+
+K_ID_BUTT, /*< Invalid */
+
+} k_mod_id;
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.2 k_mpp_chn
+
+【说明】
+
+定义模块 ID 枚举类型。
+
+【定义】
+
+```C
+typedef struct {
+
+k_mod_id mod_id; /*< Module ID */
+
+k_s32 dev_id; /*< Device ID */
+
+k_s32 chn_id; /*< Channel ID */
+
+} k_mpp_chn;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|----------|--------|
+| mod_id | 模块号 |
+| dev_id | 设备号 |
+| chn_id | 通道号 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+- [kd_mpi_sys_bind](#221-kd_mpi_sys_bind)
+- [kd_mpi_sys_unbind](#222-kd_mpi_sys_unbind)
+- [kd_mpi_sys_get_bind_by_dest](#223-kd_mpi_sys_get_bind_by_dest)
+
+### 3.2 多媒体内存管理
+
+该模块有如下数据类型
+
+- [VB_MAX_POOLS](#321-vb_max_pools)
+- [k_vb_uid](#322-k_vb_uid)
+- [k_vb_config](#323-k_vb_config)
+- [k_vb_pool_config](#324-k_vb_pool_config)
+- [k_vb_remap_mode](#325-k_vb_remap_mode)
+- [k_vb_supplement_config](#326-k_vb_supplement_config)
+
+#### 3.2.1 VB_MAX_POOLS
+
+【说明】
+
+最大的视频缓存池个数
+
+【定义】
+
+```C
+#define VB_SINGLE_MAX_BLKS 256
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.2 k_vb_uid
+
+【说明】
+
+定义模块 ID 枚举类型。
+
+【定义】
+
+``` C
+typedef enum {
+
+VB_UID_VI = 0,
+
+VB_UID_VPROC = 1,
+
+VB_UID_VREC = 2,
+
+VB_UID_VENC = 3,
+
+VB_UID_VDEC = 4,
+
+VB_UID_VO = 5,
+
+VB_UID_USER = 6,
+
+VB_UID_AI = 7,
+
+VB_UID_AREC = 8,
+
+VB_UID_AENC = 9,
+
+VB_UID_ADEC = 10,
+
+VB_UID_AO = 11,
+
+VB_UID_V_VI = 12,
+
+VB_UID_V_VO = 13,
+
+VB_UID_DMA = 14,
+
+VB_UID_BUTT = 15,
+
+}k_vb_uid;
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.3 k_vb_config
+
+【说明】
+
+定义视频缓存池属性结构体。
+
+【定义】
+
+``` C
+typedef struct {
+
+k_u32 max_pool_cnt;
+
+k_vb_pool_config comm_pool[VB_MAX_COMM_POOLS];
+
+} k_vb_config;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|--------------|------------------------------------------------------------|
+| max_pool_cnt | 整个系统中可容纳的缓存池个数。 取值范围:(0, VB_MAX_POOLS] |
+| comm_pool | 公共缓存池属性结构体。 静态属性 |
+
+【注意事项】
+
+- blk_size等于 0 或blk_cnt 等于 0,则对应的缓存池不会被创建。
+- 建议整个结构体先 memset 为 0 再按需赋值。
+
+【相关数据类型及接口】
+
+- kd_mpi_vb_get_config
+
+#### 3.2.4 k_vb_pool_config
+
+【说明】
+
+定义视频缓存池属性结构体。
+
+【定义】
+
+```C
+typedef struct
+
+{
+
+k_u64 blk_size; /*< Size of each VB block*/
+
+k_u32 blk_cnt; /*< Number of blocks*/
+
+k_vb_remap_mode mode; /*< Mapping mode of the kernel mode virtual addresses of the VB*/
+
+char mmz_name[MAX_MMZ_NAME_LEN];/*< Name of the MMZ that allocates the memory for the current VB pool*/
+
+}k_vb_pool_config;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|----------|-------------------------------------------------|
+| blk_size | 缓存块大小,以 Byte 位单位。 |
+| blk_cnt | 每个缓存池的缓存块个数。0 \~ VB_SINGLE_MAX_BLKS |
+| mode | VB 的内核态虚拟地址映射模式 |
+| mmz_name | 当前缓存池从哪个 MMZ 区域分配内存。 |
+
+【注意事项】
+
+- 每个缓存块的大小 u64BlkSize 应根据当前图像宽高、像素格式、数据位宽、是否压缩等来计算。
+- 该缓存池是从空闲 MMZ 内存中分配,一个缓存池包含若干个大小相同的缓存块。如果该缓存池的大小超过了保留内存中的空闲空间,则创建缓存池会失败。
+- 用户需保证输入的 DDR 名字已经存在,如果输入不存在 DDR 的名字,会造成分不到内存。如果数组 mmz_name 被 memset 为 0 则表示在没有命名的 DDR 中创建缓存池。
+
+【相关数据类型及接口】
+
+- [kd_mpi_vb_set_config](#219-kd_mpi_vb_set_config)
+- [kd_mpi_vb_create_pool](#2113-kd_mpi_vb_create_pool)
+
+#### 3.2.5 k_vb_remap_mode
+
+【说明】
+
+定义 VB 内核态虚拟地址映射模式。
+
+【定义】
+
+```C
+typedef enum {
+
+VB_REMAP_MODE_NONE = 0, /*< no remap */
+
+VB_REMAP_MODE_NOCACHE = 1, /*< no cache remap */
+
+VB_REMAP_MODE_CACHED = 2, /*< cache remap, if you use this mode, you should flush cache by yourself */
+
+VB_REMAP_MODE_BUTT
+
+} k_vb_remap_mode;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|-----------------------|---------------|
+| VB_REMAP_MODE_NONE | 不映射。 |
+| VB_REMAP_MODE_NOCACHE | 映射为nocache |
+| VB_REMAP_MODE_CACHED | 映射为cache |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.6 k_vb_supplement_config
+
+【说明】
+
+定义 VB 附加信息结构体。
+
+【定义】
+
+```C
+typedef struct
+
+{
+
+k_u32 supplement_config; /*= Lc \>= β V = 4.500 \* Lcfor β \> Lc \>= 0 |
+| HDR10 | V = ( ( c1 + c2 \* Lc n ) ÷ ( 1 + c3 \* Lc n ) )m for all values of Lc c1 = c3 - c2 + 1 = 3424 ÷ 4096 = 0.8359375 c2 = 32 \* 2413 ÷ 4096 = 18.8515625 c3 = 32 \* 2392 ÷ 4096 = 18.6875 m = 128 \* 2523 ÷ 4096 = 78.84375 n = 0.25 \* 2610 ÷ 4096 = 0.1593017578125 for which Lc equal to 1 for peak white is ordinarily intended to correspond to a reference output luminance level of 10000 candelas per square metre |
+| HLG | V = a \* Ln( 12 \* Lc - b ) + c for 1 \>= Lc \> 1 ÷ 12 V = Sqrt( 3 ) \* Lc0.5 for 1 ÷ 12 \>= Lc \>= 0 a = 0.17883277, b = 0.28466892, c = 0.55991073 |
+
+【相关数据类型及接口】
+
+无
+
+#### 3.3.12 k_video_format
+
+【说明】
+
+定义视频格式结构体。
+
+【定义】
+
+```C
+typedef enum
+
+{
+
+VIDEO_FORMAT_LINEAR = 0, /* nature video line */
+
+VIDEO_FORMAT_TILE_64x16, /* tile cell: 64pixel x 16line */
+
+VIDEO_FORMAT_TILE_16x8, /* tile cell: 16pixel x 8line */
+
+VIDEO_FORMAT_LINEAR_DISCRETE, /* The data bits are aligned in bytes */
+
+VIDEO_FORMAT_BUTT
+
+} k_video_format;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|------------------------------|------------------------------------------------------------------------------------------|
+| VIDEO_FORMAT_LINEAR | 线性存储的视频格式。 |
+| VIDEO_FORMAT_TILE_64x16 | TILE 格式存储的视频格式,其中 tile 的块大小为 64 像素宽,16 行像素高。 |
+| VIDEO_FORMAT_TILE_16x8 | TILE 格式存储的视频格式,其中 tile 的块大小为 16 像素宽,8 行像素高,也称为小TILE 格式。 |
+| VIDEO_FORMAT_LINEAR_DISCRETE | 线性离散自然行存储数据格式,数据 bit位宽按字节对齐,低位有效,高位无效。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.3.13 k_video_filed
+
+【说明】
+
+定义视频图像帧场类型。
+
+【定义】
+
+``` C
+typedef enum
+
+{
+
+VIDEO_FIELD_TOP = 0x1, /* even field */
+
+VIDEO_FIELD_BOTTOM = 0x2, /* odd field */
+
+VIDEO_FIELD_INTERLACED = 0x3, /* two interlaced fields */
+
+VIDEO_FIELD_FRAME = 0x4, /* frame */
+
+VIDEO_FIELD_BUTT
+
+} k_video_field;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|------------------------|--------------|
+| VIDEO_FIELD_TOP | 顶场类型 |
+| VIDEO_FIELD_BOTTOM | 底场类型 |
+| VIDEO_FIELD_INTERLACED | 俩场间插类型 |
+| VIDEO_FIELD_FRAME | 帧类型 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+[k_video_frame](#332-k_video_frame)
+
+#### 3.3.14 k_pixel_format
+
+【说明】
+
+定义像素格式类型。
+
+【定义】
+
+``` C
+typedef enum {
+
+PIXEL_FORMAT_RGB_444 = 0,
+
+PIXEL_FORMAT_RGB_555,
+
+PIXEL_FORMAT_RGB_565,
+
+PIXEL_FORMAT_RGB_888,
+
+PIXEL_FORMAT_BGR_444,
+
+PIXEL_FORMAT_BGR_555,
+
+PIXEL_FORMAT_BGR_565,
+
+PIXEL_FORMAT_BGR_888,
+
+PIXEL_FORMAT_ARGB_1555,
+
+PIXEL_FORMAT_ARGB_4444,
+
+PIXEL_FORMAT_ARGB_8565,
+
+PIXEL_FORMAT_ARGB_8888,
+
+PIXEL_FORMAT_ARGB_2BPP,
+
+PIXEL_FORMAT_ABGR_1555,
+
+PIXEL_FORMAT_ABGR_4444,
+
+PIXEL_FORMAT_ABGR_8565,
+
+PIXEL_FORMAT_ABGR_8888,
+
+PIXEL_FORMAT_RGB_MONOCHROME_8BPP,
+
+PIXEL_FORMAT_RGB_BAYER_8BPP,
+
+PIXEL_FORMAT_RGB_BAYER_10BPP,
+
+PIXEL_FORMAT_RGB_BAYER_12BPP,
+
+PIXEL_FORMAT_RGB_BAYER_14BPP,
+
+PIXEL_FORMAT_RGB_BAYER_16BPP,
+
+PIXEL_FORMAT_YVU_PLANAR_422,
+
+PIXEL_FORMAT_YVU_PLANAR_420,
+
+PIXEL_FORMAT_YVU_PLANAR_444,
+
+PIXEL_FORMAT_YVU_SEMIPLANAR_422,
+
+PIXEL_FORMAT_YVU_SEMIPLANAR_420,
+
+PIXEL_FORMAT_YVU_SEMIPLANAR_444,
+
+PIXEL_FORMAT_YUV_SEMIPLANAR_422,
+
+PIXEL_FORMAT_YUV_SEMIPLANAR_420,
+
+PIXEL_FORMAT_YUV_SEMIPLANAR_444,
+
+PIXEL_FORMAT_YUYV_PACKAGE_422,
+
+PIXEL_FORMAT_YVYU_PACKAGE_422,
+
+PIXEL_FORMAT_UYVY_PACKAGE_422,
+
+PIXEL_FORMAT_VYUY_PACKAGE_422,
+
+PIXEL_FORMAT_YYUV_PACKAGE_422,
+
+PIXEL_FORMAT_YYVU_PACKAGE_422,
+
+PIXEL_FORMAT_UVYY_PACKAGE_422,
+
+PIXEL_FORMAT_VUYY_PACKAGE_422,
+
+PIXEL_FORMAT_VY1UY0_PACKAGE_422,
+
+PIXEL_FORMAT_YUV_400,
+
+PIXEL_FORMAT_UV_420,
+
+/* SVP data format */
+
+PIXEL_FORMAT_BGR_888_PLANAR,
+
+PIXEL_FORMAT_HSV_888_PACKAGE,
+
+PIXEL_FORMAT_HSV_888_PLANAR,
+
+PIXEL_FORMAT_LAB_888_PACKAGE,
+
+PIXEL_FORMAT_LAB_888_PLANAR,
+
+PIXEL_FORMAT_S8C1,
+
+PIXEL_FORMAT_S8C2_PACKAGE,
+
+PIXEL_FORMAT_S8C2_PLANAR,
+
+PIXEL_FORMAT_S8C3_PLANAR,
+
+PIXEL_FORMAT_S16C1,
+
+PIXEL_FORMAT_U8C1,
+
+PIXEL_FORMAT_U16C1,
+
+PIXEL_FORMAT_S32C1,
+
+PIXEL_FORMAT_U32C1,
+
+PIXEL_FORMAT_U64C1,
+
+PIXEL_FORMAT_S64C1,
+
+PIXEL_FORMAT_BUTT
+
+} k_pixel_format;
+```
+
+【成员】
+
+无
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+略
+
+### 3.4 多媒体日志管理
+
+本模块有以下数据结构
+
+- [k_log_level_conf](#341-k_log_level_conf)
+
+#### 3.4.1 k_log_level_conf
+
+【说明】
+
+定义日志等级信息结构体。
+
+【定义】
+
+```C
+typedef struct {
+
+k_mod_id mod_id;
+
+k_s32 level;
+
+k_char mod_name[16];
+
+} k_log_level_conf;
+```
+
+【成员】
+
+| **成员名称** | **描述** |
+|----------|------------|
+| mod_id | 模块的ID |
+| level | 日志等级 |
+| mod_name | 模块的名字 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+- [kd_mpi_log_set_level_conf](#231-kd_mpi_log_set_level_conf)
+- [kd_mpi_log_get_level_conf](#232-kd_mpi_log_get_level_conf)
+
+## 4. 错误码
+
+### 4.1 多媒体内存管理错误码
+
+#### 4.1.1 视频缓存池错误码
+
+表 41
+
+| **错误代码** | **宏定义** | **描述** |
+|------------|------------------------|------------------|
+| 0xa0048006 | K_ERR_VB_NULL_PTR | 参数空指针错误 |
+| 0xa004800c | K_ERR_VB_NOMEM | 分配内存失败 |
+| 0xa004800d | K_ERR_VB_NOBUF | 分配缓存失败 |
+| 0xa0048005 | K_ERR_VB_UNEXIST | 视频缓存不存在 |
+| 0xa0048003 | K_ERR_VB_ILLEGAL_PARAM | 参数设置无效 |
+| 0xa0048010 | K_ERR_VB_NOTREADY | 缓存池还未就绪 |
+| 0xa0048012 | K_ERR_VB_BUSY | 系统忙 |
+| 0xa0048009 | K_ERR_VB_NOT_PERM | 操作不允许 |
+| 0xa0048040 | K_ERR_VB_2MPOOLS | 创建的缓存池太多 |
+
+#### 4.1.2 多媒体内存zone错误码
+
+表 42
+
+| **错误代码** | **宏定义** | **描述** |
+|------------|---------------------------------|----------------|
+| 0xa0038003 | K_ERR_MMZ_USERDEV_ILLEGAL_PARAM | 参数设置微小 |
+| 0xa0038006 | K_ERR_MMZ_USERDEV_NULL_PTR | 参数空指针错误 |
+| 0xa0038008 | K_ERR_MMZ_USERDEV_NOT_SUPPORT | 不支持的操作 |
+| 0xa0038009 | K_ERR_MMZ_USERDEV_NOT_PERM | 操作不允许 |
+| 0xa003800c | K_ERR_MMZ_USERDEV_NOMEM | 分配内存失败 |
+| 0xa0038010 | K_ERR_MMZ_USERDEV_NOTREADY | 系统未就绪 |
+| 0xa0038011 | K_ERR_MMZ_USERDEV_BADADDR | 错误的地址 |
+| 0xa0038012 | K_ERR_MMZ_USERDEV_BUSY | 系统忙 |
+
+### 4.2 系统绑定错误码
+
+表 43
+
+| **错误代码** | **宏定义** | **描述** |
+|------------|-------------------------|------------------------------|
+| 0xa0058003 | K_ERR_SYS_ILLEGAL_PARAM | 参数错误 |
+| 0xa0058006 | K_ERR_SYS_NULL_PTR | 空指针错误 |
+| 0xa0058008 | K_ERR_SYS_NOT_SUPPORT | 不支持的功能 |
+| 0xa0058009 | K_ERR_SYS_NOT_PERM | 操作不允许 |
+| 0xa0058010 | K_ERR_SYS_NOTREADY | 系统控制属性未配置 |
+| 0xa0058011 | K_ERR_SYS_BADADDR | 系统忙 |
+| 0xa005800c | K_ERR_SYS_NOMEM | 分配内存失败,如系统内存不足 |
+
+### 4.3 日志管理错误码
+
+表 44
+
+| **错误代码** | **宏定义** | **描述** |
+|------------|-------------------------|------------------------------|
+| 0xa0018003 | K_ERR_LOG_ILLEGAL_PARAM | 参数错误 |
+| 0xa0018006 | K_ERR_LOG_NULL_PTR | 空指针错误 |
+| 0xa0018009 | K_ERR_LOG_NOT_PERM | 操作不允许 |
+| 0xa0018010 | K_ERR_LOG_NOTREADY | 日志设备未就绪 |
+| 0xa001800c | K_ERR_LOG_NOMEM | 分配内存失败,如系统内存不足 |
+
+## 5. 调试信息
+
+### 5.1 概述
+
+调试信息采用了 proc 文件系统,可实时反映当前系统的运行状态,所记录的信息可供问题定位及分析时使用
+
+【文件目录】
+
+/proc/
+
+【文件清单】
+
+| **文件名称** | **描述** |
+|---------------|--------------------------------------|
+| umap/sysbind | 记录当前 系统绑定的情况 |
+| umap/vb | 记录当前 VB 模块的 buffer 使用情况。 |
+| mem-media | 记录当前多媒体内存的使用情况 |
+
+### 5.2 多媒体内存管理
+
+#### 5.2.1 视频缓存池调试信息
+
+【调试信息】
+
+```text
+-----VB PUB CONFIG--------------------------------------------------------------
+MaxPoolCnt
+ 10
+-----VB SUPPLEMENT ATTR---------------------------------------------------------
+Config Size VbCnt
+1 204 21
+-----COMMON POOL CONFIG---------------------------------------------------------
+PoolConfId BlkSize Count RemapMode
+0 8294400 5 CACHED
+1 8192 3 NONE
+2 4096 5 NOCACHE
+-----MODULE COMMON MOD POOL CONFIG of [2]---------------------------------------
+PoolConfId BlkSize Count RemapMode
+0 4096 5 CACHED
+1 8192 3 NONE
+
+-------------------------------------------------------------------------------------
+PoolId PhysAddr VirtAddr IsComm Owner BlkSz BlkCnt Free MinFree
+0 0x18001000 0xc00d1000 1 -1 8294400 5 2 2
+BLK VI VENC VDEC VO USER AI AREC AENC ADEC AO V_VI V_VO DMA DPU
+0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+2 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+Sum 0 0 0 0 3 0 0 0 0 0 0 0 0 0
+
+-------------------------------------------------------------------------------------
+PoolId PhysAddr VirtAddr IsComm Owner BlkSz BlkCnt Free MinFree
+1 0x1a78f000 0x0 1 -1 8192 3 3 3
+
+-------------------------------------------------------------------------------------
+PoolId PhysAddr VirtAddr IsComm Owner BlkSz BlkCnt Free MinFree
+2 0x1a796000 0xc2860000 1 -1 4096 5 5 5
+
+-------------------------------------------------------------------------------------
+PoolId PhysAddr VirtAddr IsComm Owner BlkSz BlkCnt Free MinFree
+3 0x1a79c000 0xc2866000 1 2 4096 5 5 5
+
+-------------------------------------------------------------------------------------
+PoolId PhysAddr VirtAddr IsComm Owner BlkSz BlkCnt Free MinFree
+4 0x1a7a2000 0x0 1 2 8192 3 3 3
+```
+
+【调试信息分析】
+
+记录当前VB模块的block使用情况
+
+【参数说明】
+
+| **参数** | **描述** | |
+|--------------------------------------------------------------|------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
+| VB PUB CONFIG | MaxPoolCnt | 最大的缓存池的个数。 |
+| VB SUPPLEMENT ATTR | Config | 视频帧补充信息配置。 |
+| | Size | 视频帧补充信息占用内存空间。 |
+| | VbCnt | 所有 VB 池(共有、私有)包含的的 VB块总数。 |
+| COMMON POOL CONFIG | PoolId | 公共缓存池的句柄。 |
+| | Size | 缓存池内块的大小。 |
+| | Count | 缓存池内块的个数。 |
+| MODULE COMMON POOL CONFIG of VB_UID (模块分配的 公共 VB) | PoolId | 公共缓存池的句柄。 |
+| | Size | 缓存池内块的大小。 |
+| | Count | 缓存池内块的个数。 |
+| NULL(表空,即匿名的DDR) | PoolId | 公共/私有缓存池的句柄。 |
+| | PhysAddr | 公共/私有缓存池的开始物理地址。 |
+| | VirtAddr | 公共/私有缓存池的开始虚拟地址。 |
+| | IsComm | 是否公共缓存池。 取值:{0, 1}。 |
+| | Owner | 缓存池的拥有者。 -2:私有池。 -1:公共池。 ≥0:模块 VB。 |
+| | BlkSz | 缓存池内缓存块的大小。 |
+| | BlkCnt | 缓存池内缓存块的个数。 |
+| | Free | 缓存池空闲缓存块的个数。 |
+| | MinFree | MinFree 程序运行以来,空闲缓存块的最小剩余个数。若该计数为 0,则说明可能存在因缓存块不够而丢帧的情况。 |
+| | BLK | 缓存池内缓存块的句柄。 |
+| | VI/VPROC/VREC/VENC /VDEC/VO/USER/AI/AREC /AENC/ADEC/AO/V_VI/ V_VO/DMA | 模块名 下面对应的数字表示当前模块有多少个 地方占用缓存池内的该缓存块。 0:没占用。 非 0:占用次数 |
+
+### 5.2.2 多媒体内存zone调试信息
+
+【调试信息】
+
+```text
+msh /bin\>cat /proc/media-mem
+
++---ZONE: PHYS(0x18000000, 0x1FEFFFFF), GFP=0, nBYTES=130048KB, NAME="anonymous"
+ |-MMB: phys(0x18000000, 0x18000FFF), kvirt=0xC00D0000, flags=0x00000001, length=4KB, name="sup_nc"
+ |-MMB: phys(0x18001000, 0x1A78DFFF), kvirt=0xC00D1000, flags=0x00000003, length=40500KB, name="vb_pool"
+ |-MMB: phys(0x1A78E000, 0x1A78EFFF), kvirt=0xC285E000, flags=0x00000001, length=4KB, name="sup_nc"
+ |-MMB: phys(0x1A78F000, 0x1A794FFF), kvirt=0x00000000, flags=0x00000000, length=24KB, name="vb_pool"
+ |-MMB: phys(0x1A795000, 0x1A795FFF), kvirt=0xC285F000, flags=0x00000001, length=4KB, name="sup_nc"
+ |-MMB: phys(0x1A796000, 0x1A79AFFF), kvirt=0xC2860000, flags=0x00000001, length=20KB, name="vb_pool"
+ |-MMB: phys(0x1A79B000, 0x1A79BFFF), kvirt=0xC2865000, flags=0x00000001, length=4KB, name="sup_nc"
+ |-MMB: phys(0x1A79C000, 0x1A7A0FFF), kvirt=0xC2866000, flags=0x00000003, length=20KB, name="vb_mod_pool"
+ |-MMB: phys(0x1A7A1000, 0x1A7A1FFF), kvirt=0xC286B000, flags=0x00000001, length=4KB, name="sup_nc"
+ |-MMB: phys(0x1A7A2000, 0x1A7A7FFF), kvirt=0x00000000, flags=0x00000000, length=24KB, name="vb_mod_pool"
+
+---MMZ_USE_INFO:
+ total size=130048KB(127MB),used=40608KB(39MB + 672KB),remain=89440KB(87MB + 352KB),zone_number=1,block_number=10
+
+```
+
+【调试信息分析】
+
+记录当前多媒体内存的使用情况
+
+【参数说明】
+
+无
+
+### 5.3 系统绑定
+
+#### 5.3.1 系统绑定调试信息
+
+【调试信息】
+
+```text
+msh /bin\>cat /proc/umap/sysbind
+
+\-----BIND RELATION TABLE--------------------------------------------------------
+
+FirMod FirDev FirChn SecMod SecDev SecChn TirMod TirDev TirChn SendCnt rstCnt
+
+vvi 0 0 vvo 0 0 null 0 0 42 0
+
+vvi 0 0 vvo 1 1 null 0 0 42 0
+```
+
+【调试信息分析】
+
+记录当前系统绑定的情况
+
+【参数说明】
+
+| **参数** | **描述** |
+|---------|------------------------------------------|
+| FirMod | 数据源的模块号 |
+| FirDev | 数据源的设备号 |
+| FirChn | 数据源的通道号 |
+| SecMod | 第二个模块的模块号(与数据源绑定) |
+| SecDev | 第二个模块的的设备号(与数据源绑定) |
+| SecChn | 第二个模块的的通道号(与数据源绑定) |
+| ThrMod | 第三个模块的模块号(与第二个模块绑定) |
+| ThrDev | 第三个模块的的设备号(与第二个模块绑定) |
+| ThrChn | 第三个模块的的通道号(与第二个模块绑定) |
+| Sendcnt | 数据发送的次数 |
+| Rstcnt | 复位的次数 |
diff --git "a/zh/01_software/board/mpp/K230_\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201_API\345\217\202\350\200\203.md" "b/zh/01_software/board/mpp/K230_\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201_API\345\217\202\350\200\203.md"
new file mode 100755
index 0000000..856d4ca
--- /dev/null
+++ "b/zh/01_software/board/mpp/K230_\350\247\206\351\242\221\347\274\226\350\247\243\347\240\201_API\345\217\202\350\200\203.md"
@@ -0,0 +1,4256 @@
+# K230视频编解码API参考
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍视频编解码模块的功能和用法。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|------|
+| | |
+| | |
+
+### 修订记录
+
+| 文档版本号 | 修改者 | 日期 | 修改说明 |
+|---|---|---|---|
+| V1.0 | 系统软件部 | 2023.03.10 | 初版 |
+| V1.1 | 系统软件部 | 2023.03.31 | 1. 新增2d设置/获取运算模式接口kd_mpi_venc_set_2d_mode、 kd_mpi_venc_get_2d_mode 2.修改2d的参数设置/获取接口,kd_mpi_venc_set_2d_osd_param、 kd_mpi_venc_get_2d_osd_param 3. 新增设置2D运算中的图像格式转换系数接口kd_mpi_venc_set_2d_set_custom_coef 4. kd_mpi_venc_set_2d_set_custom_coef删除编码器属性结构体k_venc_attr的pic_format属性 |
+| V1.1.1 | 系统软件部 | 2023.04.11 | 1. 新增编码图像旋转设置/获取接口 kd_mpi_venc_set_rotaion、 kd_mpi_venc_get_rotaion 2. 新增2D画框属性的设置/获取接口 kd_mpi_venc_set_2d_border_param、 kd_mpi_venc_get_2d_border_param 3. 删除2D运算属性结构体`k_venc_2d_attr`4. 增加OSD背景层格式说明 5. 增加部分MAPI函数接口及数据类型,具体是章节4 MAPI。|
+| V1.2 | 系统软件部 | 2023.04.27 | 1. 修改2D画框结构体k_venc_2d_border_attr的线宽参数 2. 修改2D用户自定义转换系数API名称kd_mpi_venc_set_2d_custom_coef 3. 修改kd_mpi_venc_set_2d_custom_coef的转换系数参数类型。 4. 增加获取转换系数的接口kd_mpi_venc_get_2d_custom_coef 5. 增加色域设置和获取接口kd_mpi_venc_set_2d_color_gamut、kd_mpi_venc_get_2d_color_gamut 6. 修改kd_mpi_venc_set_rotaion的旋转角度参数。7. 修改视频编码功能描述中JPEG的输入格式 |
+| V1.2.1 | 系统软件部 | 2023-04-28 | 1. 在 k_venc_chn_attr中增加GOP属性 |
+| V1.2.2 | 系统软件部 | 2023-05-24 | 1. 增加图像翻转设置/获取接口kd_mpi_venc_set_mirror、kd_mpi_venc_get_mirror 2. 增加IDR帧使能接口kd_mpi_venc_enable_idr |
+| V1.3 | 系统软件部 | 2023-05-25 | 1. mapi增加IDR帧使能接口 kd_mapi_venc_request_idr |
+| V1.3.1 | 系统软件部 | 2023-06-14 | 1. 添加mpi可设置解码输出缩小的图像。kd_mpi_vdec_set_downscale |
+| V1.3.2 | 系统软件部 | 2023-06-19 | 1. 修改kd_mapi_venc_request_idr 2. 增加kd_mpi_venc_request_idr、kd_mapi_venc_enable_idr 3.增加H.265 SAO设置和获取接口kd_mpi_venc_set_h265_sao、kd_mpi_venc_get_h265_sao 4. 增加deblocking设置/获取接口kd_mpi_venc_set_dblk、kd_mpi_venc_get_dblk 5. 增加ROI接口kd_mpi_venc_set_roi_attr、kd_mpi_venc_get_roi_attr |
+| V1.3.3 | 系统软件部 | 2023-06-20 | 1. 增加H.264/H.265熵编码模式设置/获取接口kd_mpi_venc_set_h264_entropy、kd_mpi_venc_get_h264_entropy、kd_mpi_venc_set_h265_entropy、kd_mpi_venc_get_h265_entropy 2. k_venc_rotation枚举更明为k_rotation 3. 增加解码旋转设置接口kd_mpi_vdec_set_rotation |
+| V1.3.4 | 系统软件部 | 2023-06-30 | 修改编解码及2D支持的数据类型 |
+
+## 1. 概述
+
+### 1.1 概述
+
+视频编解码模块,支持H.264、H.265、JPEG编解码。VENC模块实现2D运算和编码功能,两者既可以同时使能,也可以单独运算。VDEC模块实现解码功能。
+
+VENC、VENC+2D和VDEC支持系统绑定,2D单独运算时不支持系统绑定。
+
+### 1.2 功能描述
+
+#### 1.2.1 视频编码
+
+![encode flow](images/9f7f41ea96a97ae9bf514535f6af1622.jpeg)
+
+图1-1编码数据流程图
+
+典型的编码流程包括了输入图像的接收、图像内容的遮挡和覆盖、图像的编码、以及码流的输出等过程。
+
+编码模块由VENC接收通道、编码通道、2D接收通道、2D运算模块组成。编码能力和2D运算能力见下表。
+
+编码数据流程图中的绿色箭头所示路径,为单独做2D运算的流程。蓝色箭头所示路径为单独做编码运算的流程。紫色箭头所示路径为先做2D运算再进行编码的流程。
+
+表 1-1 编码能力
+
+| | H264 | HEVC | JPEG |
+|---|---|---|---|
+| 输入格式 | YUV420 NV12 8bit, ARGB8888, BGRA8888 | YUV420 NV12 8bit, ARGB8888, BGRA8888 | YUV420 NV12 8bit, YUV422 UYVY 8bit, ARGB8888, BGRA8888 |
+| 输出格式 | YUV420 H.264 Baseline Profile(BP) ; H.264 Main Profile(MP) ; H.264 High Profile(HP); H.264 High 10 Profile(HP) | YUV420 HEVC (H.265) Main ; HEVC (H.265) Main 10 Profile | YUV420 and YUV422 JPEG baseline sequential |
+| 最大分辨率 | 3840x2160 | 3840x2160 | 8192x8192 |
+| 码率控制模式 | CBR/VBR/FIXQP | CBR/VBR/FIXQP | FIXQP |
+| GOP | I/P帧 | I/P帧 | - |
+| 编码通道 | 4路 | 4路 | 4路 |
+
+注意:H264/HEVC/JPEG共用4路。
+
+表1-2 2D运算能力
+
+| video输入格式 | video输出格式 | 叠加数据格式 | 最大分辨率 |
+|---|---|---|---|
+| I420/NV12/ARGB8888/BGRA8888 | 同输入格式 | ARGB8888/ARGB4444/ARGB1555 | 3840x2160 |
+
+##### 1.2.1.1 编码通道
+
+编码通道作为基本容器,保存编码通道的多种用户设置和管理编码通道的多种内部资源。编码通道完成图像叠加和编码的功能。2D模块实现图像叠加运算,编码器模块实现图像编码,两者既可以单独使用,也可以协同使用。
+
+![encode channel](images/d8ea12750bef3150afebf98c8a4563fd.jpeg)
+
+图1-2 编码通道
+
+##### 1.2.1.2 码率控制
+
+码率控制器实现对编码码率进行控制。
+
+从信息学的角度分析,图像的压缩比越低,压缩图像的质量越高;图像压缩比例越高,压缩图像的质量越低。在场景变化的情况下,追求图像质量稳定,则编码码率会波动较大;如追求编码码率稳定,则图像质量会波动较大。
+
+H264/H265编码支持CBR、VBR和FIXQP三种码率控制模式。
+
+MJPEG只支持FIXQP模式。
+
+###### 1.2.1.2.1 CBR
+
+(Constant Bit Rate)固定比特率。即在码率统计时间内保证编码码率平稳。
+
+###### 1.2.1.2.2 VBR
+
+VBR( Variable Bit Rate)可变比特率,即允许在码率统计时间内编码码率波动,从而保证编码图像质量平稳。
+
+###### 1.2.1.2.3 FIXQP
+
+FIXQP固定QP值。在码率统计时间内,编码图像所有宏块QP值相同,采用用户设定的图像QP值。
+
+##### 1.2.1.3 GOP结构
+
+本模块只支持I帧和P帧
+
+##### 1.2.1.4 2D运算
+
+2D运算模块可以实现对图像数据的OSD叠加,OSD模式可以实现8个region图像叠加,各region不重叠。支持的OSD格式有:ARGB4444/ARGB1555/ARGB8888。
+
+###### 1.2.1.4.1 2D转换系数的计算
+
+在OSD叠加运算时,如果输入video的格式为YUV,则OSD层需要做RGB to YUV的转换。内核态有一组默认的转换系数,用户如果需要自定义一组12bit的转换系数。转换系数由RGB to YUV的转换公式得到。
+
+已知,RGB to YUV的转换公式如下:
+
+![osd formula](images/osd_formula.png)
+
+则,3\*3矩阵中的系数乘以256后四舍五入取整得到对应的转换系数,3\*1矩阵中的值为对应的转换系数。
+
+以BT709 LIMITED为例,RGB-\>YUV的转换公式为:
+
+Y = 0.1826\*R + 0.6142\*G + 0.0620\*B + 16
+
+U = -0.1007\*R - 0.3385\*G + 0.4392\*B + 128
+
+V = 0.4392\*R - 0.3990\*G - 0.0402\*B + 128
+
+得到,转换系数为:{ 47, 157, 16, 16, -26, -86, 112, 128, 112, -102, -10, 128 }
+
+###### 1.2.1.4.2 2D转换系数的配置
+
+2D转换系数可以通过用户自定义系数接口[kd_mpi_venc_set_2d_custom_coef](#2120-kd_mpi_venc_set_2d_custom_coef)和色域配置接口[kd_mpi_venc_set_2d_color_gamut](#2122-kd_mpi_venc_set_2d_color_gamut)进行配置,两者中选择一个接口进行配置即可。如果两个接口在开始运算前都没有调用,会使用默认系数进行色域转换。
+
+##### 1.2.1.5 限制条件
+
+编码运算存在以下限制:
+
+1. 如果输入数据格式为YUV420,Y、U、V各分量的图像数据的物理起始地址需要保证4k对齐。
+1. 如果输入数据格式为NV12,Y和UV数据的图像数据的物理起始地址需要保证4k对齐。
+
+2D运算存在以下限制:
+
+1. 源图像以及目的图像在ddr的物理起始地址要保证8byte align。
+1. 支持图像、osd、框的尺寸为偶数。
+1. 叠加和画框运算中的video数据的src和dst地址必须相同。
+
+解码运算存在以下限制:
+
+1. 每帧输入数据的物理起始地址需要4k对齐。
+
+##### 1.2.1.6 编码典型应用举例
+
+![venc sample flow](images/e57bfe4e5657980663f22e7cdef1f182.jpeg)
+
+图1-3 编码典型应用场景流程图
+
+#### 1.2.2 视频解码
+
+表 12 vpu解码能力
+
+| | H264 | HEVC | JPEG |
+|:--|:--|:--|:--|
+| 输入格式 | H.264 Baseline;H.264 Main;H.264 High;H.264 High10;支持interlaced stream | HEVC (H.265) Main/Main10 | JPEG, baseline sequential |
+| 输出格式 | YUV420 NV12, ARGB8888, BGRA8888 | YUV420 NV12, ARGB8888, BGRA8888 | YUV422 UYVY, YUV420 NV12, ARGB8888, BGRA8888 |
+| 解码通道 | 4路 | 4路 | 4路 |
+
+注意:H264/HEVC/JPEG共用4路。
+
+VDEC支持流式发送:
+
+- 流式发送( K_VDEC_SEND_MODE_STREAM):用户每次可发送任意长度码流到解码器,由解码器内部完成一帧码流的识别过程。须注意,对H.264/H.265而言,在收到下一帧码流才能识别当前帧码流的结束,所以在该发送模式下,输入一帧H.264/H.265码流,不能希望马上开始解码图像。
+
+##### 1.2.2.1 解码典型应用举例
+
+![vdec sample flow](images/e49f8a05613f3b2524e3dc075009146e.jpeg)
+
+图1-3 编码典型应用场景流程图
+
+## 2. API参考
+
+### 2.1 视频编码
+
+该功能模块提供以下API:
+
+- [kd_mpi_venc_create_chn](#211-kd_mpi_venc_create_chn):创建编码通道。
+- [kd_mpi_venc_destory_chn](#212-kd_mpi_venc_destory_chn):销毁编码通道。
+- [kd_mpi_venc_start_chn](#213-kd_mpi_venc_start_chn):开启编码通道接收输入图像。
+- [kd_mpi_venc_stop_chn](#214-kd_mpi_venc_stop_chn):停止编码通道接收输入图像。
+- [kd_mpi_venc_query_status](#215-kd_mpi_venc_query_status):查询编码通道状态。
+- [kd_mpi_venc_get_stream](#216-kd_mpi_venc_get_stream):获取编码后的码流。
+- [kd_mpi_venc_release_stream](#217-kd_mpi_venc_release_stream):释放码流缓存。
+- [kd_mpi_venc_send_frame](#218-kd_mpi_venc_send_frame):支持用户发送原始图像进行编码。
+- [kd_mpi_venc_set_rotaion](#219-kd_mpi_venc_set_rotaion):设置编码图像旋转角度。
+- [kd_mpi_venc_get_rotaion](#2110-kd_mpi_venc_get_rotaion):获取编码图像旋转角度。
+- [kd_mpi_venc_set_mirror](#2111-kd_mpi_venc_set_mirror):设置编码图像旋转角度。
+- [kd_mpi_venc_get_mirror](#2112-kd_mpi_venc_get_mirror):获取编码图像翻转方式。
+- [kd_mpi_venc_enable_idr](#2113-kd_mpi_venc_enable_idr):使能IDR帧,根据GOP间隔产生IDR帧。
+- [kd_mpi_venc_set_2d_mode](#2114-kd_mpi_venc_set_2d_mode):设置2D运算模式。
+- [kd_mpi_venc_get_2d_mode](#2115-kd_mpi_venc_get_2d_mode):获取2D运算模式。
+- [kd_mpi_venc_set_2d_osd_param](#2116-kd_mpi_venc_set_2d_osd_param):设置2D运算中OSD的区域属性。
+- [kd_mpi_venc_get_2d_osd_param](#2117-kd_mpi_venc_get_2d_osd_param):获取2D运算中指定索引的OSD的区域属性。
+- [kd_mpi_venc_set_2d_border_param](#2118-kd_mpi_venc_set_2d_border_param):设置2D运算中的画框属性。
+- [kd_mpi_venc_get_2d_border_param](#2119-kd_mpi_venc_get_2d_border_param):获取2D运算中的画框属性。
+- [kd_mpi_venc_set_2d_custom_coef](#2120-kd_mpi_venc_set_2d_custom_coef):设置2D运算中的图像格式转换系数。
+- [kd_mpi_venc_get_2d_custom_coef](#2121-kd_mpi_venc_get_2d_custom_coef):获取2D运算中的图像格式转换系数。
+- [kd_mpi_venc_set_2d_color_gamut](#2122-kd_mpi_venc_set_2d_color_gamut):设置2D运算的色域。
+- [kd_mpi_venc_get_2d_color_gamut](#2123-kd_mpi_venc_get_2d_color_gamut):获取2D运算的色域
+- [kd_mpi_venc_attach_2d](#2124-kd_mpi_venc_attach_2d):将2D运算与venc关联。
+- [kd_mpi_venc_detach_2d](#2125-kd_mpi_venc_detach_2d):将2D运算与venc分离。
+- [kd_mpi_venc_send_2d_frame](#2126-kd_mpi_venc_send_2d_frame):向2D模块发送一帧数据。
+- [kd_mpi_venc_get_2d_frame](#2127-kd_mpi_venc_get_2d_frame):获取2D运算结果。
+- [kd_mpi_venc_start_2d_chn](#2128-kd_mpi_venc_start_2d_chn):开始2D通道接收输入图像。
+- [kd_mpi_venc_stop_2d_chn](#2129-kd_mpi_venc_stop_2d_chn):停止2D通道接收输入图像。
+- [kd_mpi_venc_request_idr](#2130-kd_mpi_venc_request_idr):请求IDR帧,在调用之后立即产生一个IDR帧。
+- [kd_mpi_venc_set_h265_sao](#2131-kd_mpi_venc_set_h265_sao):设置H.265通道的Sao属性。
+- [kd_mpi_venc_get_h265_sao](#2132-kd_mpi_venc_get_h265_sao):获取H.265通道的Sao属性。
+- [kd_mpi_venc_set_dblk](#2133-kd_mpi_venc_set_dblk):设置协议编码通道的Deblocking使能。
+- [kd_mpi_venc_get_dblk](#2134-kd_mpi_venc_get_dblk):获取协议编码通道的Deblocking状态。
+- [kd_mpi_venc_set_roi_attr](#2135-kd_mpi_venc_set_roi_attr):设置H.264/H.265通道的ROI属性。
+- [kd_mpi_venc_get_roi_attr](#2136-kd_mpi_venc_get_roi_attr):获取H.264/H.265通道的ROI属性。
+- [kd_mpi_venc_set_h264_entropy](#2137-kd_mpi_venc_set_h264_entropy):设置H.264协议编码通道的熵编码模式。
+- [kd_mpi_venc_get_h264_entropy](#2138-kd_mpi_venc_get_h264_entropy):获取H.264协议编码通道的熵编码模式。
+- [kd_mpi_venc_set_h265_entropy](#2139-kd_mpi_venc_set_h265_entropy):设置H.265协议编码通道的熵编码模式。
+- [kd_mpi_venc_get_h265_entropy](#2140-kd_mpi_venc_get_h265_entropy):获取H.265协议编码通道的熵编码模式。
+
+#### 2.1.1 kd_mpi_venc_create_chn
+
+【描述】
+创建编码通道。
+
+【语法】
+k_s32 kd_mpi_venc_create_chn(k_u32 chn_num, const [k_venc_chn_attr](#3115-k_venc_chn_attr) \*attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| attr | 编码通道属性指针。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 编码器支持通道宽高入下表所示:
+
+| H.264/H.265 | JPEG | | | | | | |
+|-------------|--------|-------|--------|------|-----|------|-----|
+| WIDTH | HEIGHT | WIDTH | HEIGHT | | | | |
+| MAX | MIN | MAX | MIN | MAX | MIN | MAX | MIN |
+| 4096 | 128 | 4096 | 64 | 8192 | 128 | 8192 | 64 |
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.2 kd_mpi_venc_destory_chn
+
+【描述】
+销毁编码通道。
+
+【语法】
+k_s32 kd_mpi_venc_destory_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 销毁前必须停止接收图像,否则返回失败。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_stop_chn](#214-kd_mpi_venc_stop_chn)
+
+#### 2.1.3 kd_mpi_venc_start_chn
+
+【描述】
+开启编码通道接收输入图像。
+
+【语法】
+k_s32 kd_mpi_venc_start_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 如果通道未创建,则返回失败K_ERR_VENC_UNEXIST。
+- 如果通道已经开始接收图像,没有停止接收图像前再一次调用此接口指定接收帧数,返回操作不允许。
+- 只有开启接收之后编码器才开始接收图像编码。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_create_chn](#211-kd_mpi_venc_create_chn)
+[kd_mpi_venc_stop_chn](#214-kd_mpi_venc_stop_chn)
+
+#### 2.1.4 kd_mpi_venc_stop_chn
+
+【描述】
+停止编码通道接收输入图像。
+
+【语法】
+k_s32 kd_mpi_venc_stop_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 如果通道未创建,则返回失败。
+- 此接口并不判断当前是否停止接收,即允许重复停止接收不返回错误。
+- 此接口用于编码通道停止接收图像来编码,在编码通道销毁或复位前必须停止接收图像。
+- 调用此接口仅停止接收原始数据编码,码流buffer并不会被清除。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_destory_chn](#212-kd_mpi_venc_destory_chn)
+
+#### 2.1.5 kd_mpi_venc_query_status
+
+【描述】
+查询编码通道状态。
+
+【语法】
+k_s32 kd_mpi_venc_query_status(k_u32 chn_num, [k_venc_chn_status](#3115-k_venc_chn_attr) \*status);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| status | 编码通道的状态指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 如果通道未创建,则返回失败。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_create_chn](#211-kd_mpi_venc_create_chn)
+
+#### 2.1.6 kd_mpi_venc_get_stream
+
+【描述】
+获取编码后的码流。
+
+【语法】
+k_s32 kd_mpi_venc_get_stream(k_u32 chn_num, [k_venc_stream](#3123-k_venc_stream) \*stream, k_s32 milli_sec);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| stream | 码流结构体指针. | 输出 |
+| milli_sec | 获取码流超时时间。 取值范围: [-1, +∞ ) -1:阻塞。 0:非阻塞。 大于0:超时时间 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 如果通道未创建,返回失败。
+- 如果stream为空,返回K_ERR_VENC_NULL_PTR。
+- 如果milli_sec小于-1,返回K_ERR_VENC_ILLEGAL_PARAM。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_create_chn](#211-kd_mpi_venc_create_chn)
+[kd_mpi_venc_start_chn](#213-kd_mpi_venc_start_chn)
+
+#### 2.1.7 kd_mpi_venc_release_stream
+
+【描述】
+释放码流缓存。
+
+【语法】
+k_s32 kd_mpi_venc_release_stream(k_u32 chn_num, [k_venc_stream](#3123-k_venc_stream) \*stream);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| stream | 码流结构体指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 如果通道未创建,则返回错误码K_ERR_VENC_UNEXIST。
+- 如果stream为空,则返回错误码K_ERR_VENC_NULL_PTR。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_create_chn](#211-kd_mpi_venc_create_chn)
+[kd_mpi_venc_start_chn](#213-kd_mpi_venc_start_chn)
+
+#### 2.1.8 kd_mpi_venc_send_frame
+
+【描述】
+支持用户发送原始图像进行编码。
+
+【语法】
+k_s32 kd_mpi_venc_send_frame(k_u32 chn_num, k_video_frame_info \*frame, k_s32 milli_sec);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| frame | 原始图像信息结构指针,参考《K230 系统控制 API参考》。 | 输入 |
+| milli_sec | 发送图像超时时间。 取值范围: [-1,+∞ ) -1:阻塞。 0:非阻塞。 \> 0:超时时间。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 此接口支持用户发送图像至编码通道。
+- 如果milli_sec小于-1,返回K_ERR_VENC_ILLEGAL_PARAM。
+- 调用该接口发送图像,用户需要保证编码通道已创建且开启接收输入图像。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_create_chn](#211-kd_mpi_venc_create_chn)
+[kd_mpi_venc_start_chn](#213-kd_mpi_venc_start_chn)
+
+#### 2.1.9 kd_mpi_venc_set_rotaion
+
+【描述】
+设置编码图像旋转角度。
+
+【语法】
+k_s32 kd_mpi_venc_set_rotaion(k_u32 chn_num, const [k_rotation](#3112-k_rotation) rotation);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| rotation | 旋转角度枚举。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.10 kd_mpi_venc_get_rotaion
+
+【描述】
+获取编码图像旋转角度。
+
+【语法】
+k_s32 kd_mpi_venc_get_rotaion(k_u32 chn_num, [k_rotation](3113-k_rotation) \*rotation);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [VENC_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| rotation | 旋转角度枚举指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.11 kd_mpi_venc_set_mirror
+
+【描述】
+设置编码图像旋转角度。
+
+【语法】
+k_s32 kd_mpi_venc_set_mirror(k_u32 chn_num, const [k_venc_mirror](#3113-k_venc_mirror) mirror);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。取值范围:[0, VENC_MAX_CHN_NUM)。 | 输入 |
+| mirror | 翻转方式枚举。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+【举例】
+无。
+【相关主题】
+无。
+
+#### 2.1.12 kd_mpi_venc_get_mirror
+
+【描述】
+设置编码图像旋转角度。
+【语法】
+| k_s32 kd_mpi_venc_get_mirror(k_u32 chn_num, [k_venc_mirror](#3113-k_venc_mirror) mirror);|
+|---|
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。取值范围:[0, VENC_MAX_CHN_NUM)。 | 输入 |
+| mirror | 翻转方式枚举。 | 输出 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+【举例】
+无。
+【相关主题】
+无。
+
+#### 2.1.13 kd_mpi_venc_enable_idr
+
+【描述】
+设置IDR帧使能。
+
+【语法】
+k_s32 kd_mpi_venc_enable_idr(k_u32 chn_num, const k_bool idr_enable);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| idr_enable | 是否使能IDR帧。0:不使能。1:使能。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口需要在创建编码通道之后,开始编码通道之前调用。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.14 kd_mpi_venc_set_2d_mode
+
+【描述】
+设置2D运算模式。
+
+【语法】
+k_s32 kd_mpi_venc_set_2d_mode(k_u32 chn_num, const [k_venc_2d_calc_mode](#318-k_venc_2d_calc_mode) mode);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| mode | 2D运算模式枚举。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 目前运算模式不支持K_VENC_2D_CALC_MODE_CSC模式。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.15 kd_mpi_venc_get_2d_mode
+
+【描述】
+获取2D运算模式。
+
+【语法】
+k_s32 kd_mpi_venc_get_2d_mode(k_u32 chn_num, [k_venc_2d_calc_mode](#318-k_venc_2d_calc_mode) \*mode);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| mode | 2D运算模式枚举指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+
+- 库文件:libvenc.a
+
+【注意】
+
+- 目前运算模式不支持K_VENC_2D_CALC_MODE_CSC模式。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.16 kd_mpi_venc_set_2d_osd_param
+
+【描述】
+设置2D运算中OSD的区域属性。
+
+【语法】
+k_s32 kd_mpi_venc_set_2d_osd_param(k_u32 chn_num, k_u8 index, const [k_venc_2d_osd_attr](#3125-k_venc_2d_osd_attr) \*attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| index | OSD区域索引。 取值范围:[0, [K_VENC_MAX_2D_OSD_REGION_NUM](#312-k_venc_max_2d_osd_region_num))。 | 输入 |
+| attr | OSD属性指针。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 如果有n个叠加区域,索引值应分别设置为0\~n-1。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.17 kd_mpi_venc_get_2d_osd_param
+
+【描述】
+获取2D运算中指定索引的OSD的区域属性。
+
+【语法】
+k_s32 kd_mpi_venc_get_2d_osd_param(k_u32 chn_num, k_u8 index, const [k_venc_2d_osd_attr](#3125-k_venc_2d_osd_attr) \*attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| index | OSD区域索引。 取值范围:[0, [K_VENC_MAX_2D_OSD_REGION_NUM](#312-k_venc_max_2d_osd_region_num))。 | 输入 |
+| attr | OSD属性指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.18 kd_mpi_venc_set_2d_border_param
+
+【描述】
+设置2D运算中的画框属性。
+
+【语法】
+k_s32 kd_mpi_venc_set_2d_border_param(k_u32 chn_num, k_u8 index, const [k_venc_2d_border_attr](#3126-k_venc_2d_border_attr) \*attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| index | 画框索引。 取值范围:[0, [K_VENC_MAX_2D_BORDER_NUM](#313-k_venc_max_2d_border_num))。 | 输入 |
+| attr | 画框属性指针。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 如果有n个框,索引值应分别设置为0\~n-1。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.19 kd_mpi_venc_get_2d_border_param
+
+【描述】
+获取2D运算中的画框属性。
+
+【语法】
+k_s32 kd_mpi_venc_get_2d_border_param(k_u32 chn_num, k_u8 index, [k_venc_2d_border_attr](#3126-k_venc_2d_border_attr) \*attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| index | 画框索引。 取值范围:[0, [K_VENC_MAX_2D_BORDER_NUM](#313-k_venc_max_2d_border_num))。 | 输入 |
+| attr | 画框属性指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.20 kd_mpi_venc_set_2d_custom_coef
+
+【描述】
+设置2D运算中的图像格式转换系数。
+
+【语法】
+k_s32 kd_mpi_venc_set_2d_custom_coef(k_u32 chn_num, const k_s16 \*coef);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| coef | 转换系数指针。参考[2D转换系数的计算](#12141-2d转换系数的计算) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 内核态有一组默认的转换系数,如需自定义转换系数,可通过本接口配置。
+- 本接口调用应该在设置运算模式之后。
+- 转换系数的说明,详见[2D转换系数的计算](#12141-2d转换系数的计算)
+- 在运算模式为K_VENC_2D_CALC_MODE_BORDER时,不适用转换系数,调用本接口会报错。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_set_2d_mode](#2114-kd_mpi_venc_set_2d_mode)
+
+#### 2.1.21 kd_mpi_venc_get_2d_custom_coef
+
+【描述】
+获取2D运算中的图像格式转换系数。
+
+【语法】
+k_s32 kd_mpi_venc_get_2d_custom_coef(k_u32 chn_num, k_s16 \*coef);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| coef | 转换系数指针。参考[2D转换系数的计算](#12141-2d转换系数的计算) | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口调用应该在设置运算模式之后。
+- 在运算模式为K_VENC_2D_CALC_MODE_BORDER时,不适用转换系数,调用本接口会报错。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.22 kd_mpi_venc_set_2d_color_gamut
+
+【描述】
+设置2D运算的色域。
+
+【语法】
+k_s32 kd_mpi_venc_set_2d_color_gamut(k_u32 chn_num, const [k_venc_2d_color_gamut](#3114-k_venc_2d_color_gamut) color_gamut);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| color_gamut | 色域枚举。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 内核态有一组默认的转换系数,如需自定义转换系数,可通过本接口配置。
+- 本接口调用应该在设置运算模式之后。
+- 在运算模式为K_VENC_2D_CALC_MODE_BORDER时,不适用色域,调用本接口会报错。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.23 kd_mpi_venc_get_2d_color_gamut
+
+【描述】
+获取2D运算的色域。
+
+【语法】
+k_s32 kd_mpi_venc_get_2d_color_gamut(k_u32 chn_num, [k_venc_2d_color_gamut](#3114-k_venc_2d_color_gamut) \*color_gamut);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| color_gamut | 色域枚举指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 内核态有一组默认的转换系数,如需自定义转换系数,可通过本接口配置。
+- 本接口调用应该在设置运算模式之后。
+- 在运算模式为K_VENC_2D_CALC_MODE_BORDER时,不适用色域,调用本接口会报错。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.24 kd_mpi_venc_attach_2d
+
+【描述】
+将2D运算与venc关联。
+
+【语法】
+k_s32 kd_mpi_venc_attach_2d(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 目前绑定只支持编码通道号和2D运算通道号相同的模式。只有前3路编码支持attach 2D操作。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.25 kd_mpi_venc_detach_2d
+
+【描述】
+将2D运算与venc分离。
+
+【语法】
+k_s32 kd_mpi_venc_detach_2d(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 2D运算通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 调用该接口,用户需要保证编码通道已停止。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_stop_chn](#214-kd_mpi_venc_stop_chn)
+
+#### 2.1.26 kd_mpi_venc_send_2d_frame
+
+【描述】
+向2D模块发送一帧数据。
+
+【语法】
+| k_s32 kd_mpi_venc_send_2d_frame(k_u32 chn_num, const k_video_frame_info \*frame, k_s32 milli_sec);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 2D运算通道号,取值范围[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| frame | 原始图像信息结构指针,参考《K230 系统控制 API参考》。 | 输入 |
+| milli_sec | 发送图像超时时间。 取值范围: [-1,+∞ ) -1:阻塞。 0:非阻塞。 \> 0:超时时间。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|---|---|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口只在单2D运算的场景使用,在2D运算后再进行编码的场景,需要使用venc发送图形的接口[kd_mpi_venc_send_frame](#218-kd_mpi_venc_send_frame)。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_send_frame](#218-kd_mpi_venc_send_frame)
+
+#### 2.1.27 kd_mpi_venc_get_2d_frame
+
+【描述】
+获取2D运算结果。
+
+【语法】
+k_s32 kd_mpi_venc_get_2d_frame(k_u32 chn_num, k_video_frame_info \*frame, k_s32 milli_sec);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 2D运算通道号,取值范围[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| frame | 输出图像信息结构指针,参考《K230 系统控制 API参考》。 | 输入 |
+| milli_sec | 发送图像超时时间。 取值范围: [-1,+∞ ) -1:阻塞。 0:非阻塞。 \> 0:超时时间。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口只在单2D运算的场景使用,在2D运算后再进行编码的场景,获取编码后的码流需要使用[kd_mpi_venc_get_stream](#216-kd_mpi_venc_get_stream)
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_get_stream](#216-kd_mpi_venc_get_stream)
+
+#### 2.1.28 kd_mpi_venc_start_2d_chn
+
+【描述】
+开始2D通道接收输入图像。
+
+【语法】
+k_s32 kd_mpi_venc_start_2d_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 2D运算通道号,取值范围[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+
+【注意】
+
+- 本接口只在单2D运算的场景使用,在VENC+2D的场景,需要调用[kd_mpi_venc_start_chn](#213-kd_mpi_venc_start_chn)
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_venc_start_chn](#213-kd_mpi_venc_start_chn)
+
+#### 2.1.29 kd_mpi_venc_stop_2d_chn
+
+【描述】
+停止2D通道接收输入图像。
+
+【语法】
+k_s32 kd_mpi_venc_stop_2d_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 2D运算通道号,取值范围[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.30 kd_mpi_venc_request_idr
+
+【描述】
+请求IDR帧,在调用之后立即产生一个IDR帧。
+
+【语法】
+k_s32 kd_mpi_venc_request_idr(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.31 kd_mpi_venc_set_h265_sao
+
+【描述】
+设置H.265通道的Sao属性。
+
+【语法】
+k_s32 kd_mpi_venc_set_h265_sao(k_u32 chn_num, const [k_venc_h265_sao](#3127-k_venc_h265_sao) *h265_sao);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| h265_sao | H.265协议编码通道的Sao配置。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口需要在创建编码通道之后,开始编码通道之前调用。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.32 kd_mpi_venc_get_h265_sao
+
+【描述】
+获取H.265通道的Sao属性。
+
+【语法】
+k_s32 kd_mpi_venc_get_h265_sao(k_u32 chn_num, [k_venc_h265_sao](#3127-k_venc_h265_sao) *h265_sao);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| h265_sao | H.265协议编码通道的Sao配置。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.33 kd_mpi_venc_set_dblk
+
+【描述】
+设置H.264/H.265协议编码通道的Deblocking使能。
+
+【语法】
+k_s32 kd_mpi_venc_set_dblk(k_u32 chn_num, const k_bool dblk_en);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| dblk_en | 是否使能deblocking。K_TRUE:使能。K_FALSE:不使能。默认使能。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口需要在创建编码通道之后,开始编码通道之前调用。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.34 kd_mpi_venc_get_dblk
+
+【描述】
+获取H.264/H.265协议编码通道的Deblocking状态。
+
+【语法】
+k_s32 kd_mpi_venc_get_dblk(k_u32 chn_num, k_bool *dblk_en);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| dblk_en | 是否使能deblocking。K_TRUE:使能。K_FALSE:不使能。默认使能。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.35 kd_mpi_venc_set_roi_attr
+
+【描述】
+设置H.264/H.265通道的ROI属性。
+
+【语法】
+k_s32 kd_mpi_venc_set_roi_attr(k_u32 chn_num, const [k_venc_roi_attr](#3129-k_venc_roi_attr) *roi_attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| dblk_en | 是否使能deblocking。K_TRUE:使能。K_FALSE:不使能。默认使能。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口需要在创建编码通道之后,开始编码通道之前调用。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.36 kd_mpi_venc_get_roi_attr
+
+【描述】
+获取H.264/H.265通道的ROI属性。
+
+【语法】
+k_s32 kd_mpi_venc_get_roi_attr(k_u32 chn_num, [k_venc_roi_attr](#3129-k_venc_roi_attr) *roi_attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| dblk_en | 是否使能deblocking。K_TRUE:使能。K_FALSE:不使能。默认使能。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.37 kd_mpi_venc_set_h264_entropy
+
+【描述】
+设置H.264协议编码通道的熵编码模式。
+
+【语法】
+k_s32 kd_mpi_venc_set_h264_entropy(k_u32 chn_num, const [k_venc_h264_entropy](#3130-k_venc_h264_entropy) *h264_entropy);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| h264_entropy | H.264协议编码通道的熵编码模式。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口需要在创建编码通道之后,开始编码通道之前调用。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.38 kd_mpi_venc_get_h264_entropy
+
+【描述】
+获取H.264协议编码通道的熵编码模式。
+
+【语法】
+k_s32 kd_mpi_venc_get_h264_entropy(k_u32 chn_num, [k_venc_h264_entropy](#3130-k_venc_h264_entropy) *h264_entropy);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| h264_entropy | H.264协议编码通道的熵编码模式。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.39 kd_mpi_venc_set_h265_entropy
+
+【描述】
+设置H.265协议编码通道的熵编码模式。
+
+【语法】
+k_s32 kd_mpi_venc_set_h265_entropy(k_u32 chn_num, const [k_venc_h265_entropy](#3131-k_venc_h265_entropy) *h265_entropy);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| h265_entropy | H.265协议编码通道的熵编码模式。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+
+- 本接口需要在创建编码通道之后,开始编码通道之前调用。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.1.40 kd_mpi_venc_get_h265_entropy
+
+【描述】
+获取H.265协议编码通道的熵编码模式。
+
+【语法】
+k_s32 kd_mpi_venc_get_h265_entropy(k_u32 chn_num, [k_venc_h265_entropy](#3131-k_venc_h265_entropy) *h265_entropy);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 通道号。 取值范围:[0, [K_VENC_2D_MAX_CHN_NUM](#311-venc_max_chn_num))。 | 输入 |
+| h265_entropy | H.265协议编码通道的熵编码模式。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,返回[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_venc_api.h,k_type.h,k_module.h,k_sys_comm.h,k_venc_comm.h
+- 库文件:libvenc.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+### 2.2 视频解码
+
+该功能模块提供以下API:
+
+- [kd_mpi_vdec_create_chn](#221-kd_mpi_vdec_create_chn):创建视频解码通道。
+- [kd_mpi_vdec_destroy_chn](#222-kd_mpi_vdec_destroy_chn):销毁视频解码通道。
+- [kd_mpi_vdec_start_chn](#223-kd_mpi_vdec_start_chn):开启视频解码通道。
+- [kd_mpi_vdec_stop_chn](#224-kd_mpi_vdec_stop_chn):停止视频解码通道。
+- [kd_mpi_vdec_query_status](#225-kd_mpi_vdec_query_status):解码器停止接收用户发送的码流。
+- [kd_mpi_vdec_send_stream](#226-kd_mpi_vdec_send_stream):向视频解码通道发送码流数据。
+- [kd_mpi_vdec_get_frame](#227-kd_mpi_vdec_get_frame):获取视频解码通道的解码图像。
+- [kd_mpi_vdec_release_frame](#228-kd_mpi_vdec_release_frame):获取视频解码通道的解码图像。
+- [kd_mpi_vdec_set_downscale](#229-kd_mpi_vdec_set_downscale):设置解码输出缩小的图像(指定长宽或按比例)。
+- [kd_mpi_vdec_set_rotation](#2210-kd_mpi_vdec_set_rotation):设置解码旋转角度。
+
+#### 2.2.1 kd_mpi_vdec_create_chn
+
+【描述】
+创建视频解码通道。
+
+【语法】
+k_s32 kd_mpi_vdec_create_chn(k_u32 chn_num, const [k_vdec_chn_attr](#323-k_vdec_chn_attr) \*attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+| attr | 解码通道属性指针。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.2 kd_mpi_vdec_destroy_chn
+
+【描述】
+销毁视频解码通道。
+
+【语法】
+k_s32 kd_mpi_vdec_destroy_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.3 kd_mpi_vdec_start_chn
+
+【描述】
+开启视频解码通道。
+
+【语法】
+k_s32 kd_mpi_vdec_start_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.4 kd_mpi_vdec_stop_chn
+
+【描述】
+停止视频解码通道。
+
+【语法】
+k_s32 kd_mpi_vdec_stop_chn(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.5 kd_mpi_vdec_query_status
+
+【描述】
+查询解码通道状态。
+
+【语法】
+k_s32 kd_mpi_vdec_query_status(k_u32 chn_num, [k_vdec_chn_status](#3114-(#324-k_vdec_chn_status) \*status);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+| status | 视频解码通道状态结构体指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.6 kd_mpi_vdec_send_stream
+
+【描述】
+向视频解码通道发送码流数据。
+
+【语法】
+k_s32 kd_mpi_vdec_send_stream(k_u32 chn_num, const [k_vdec_stream](#326-k_vdec_stream) \*stream, k_s32 milli_sec);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+| stream | 解码码流数据指针。 | 输入 |
+| milli_sec | 送码流方式标志。 取值范围: -1:阻塞。 0:非阻塞。 正值:超时时间,没有上限值,以ms为单位。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.7 kd_mpi_vdec_get_frame
+
+【描述】
+获取视频解码通道的解码图像。
+
+【语法】
+k_s32 kd_mpi_vdec_get_frame(k_u32 chn_num, k_video_frame_info \*frame_info, [k_vdec_supplement_info](#327-k_vdec_supplement_info) \*supplement, k_s32 milli_sec);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 输入 |
+| frame_info | 获取的解码图像信息,参考《K230 系统控制 API参考》。| 输出 |
+| supplement | 获取的解码图像补充信息。 | 输出 |
+| milli_sec | 送码流方式标志。 取值范围: -1:阻塞。 0:非阻塞。 正值:超时时间,没有上限值,以ms为单位 动态属性。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.8 kd_mpi_vdec_release_frame
+
+【描述】
+获取视频解码通道的解码图像。
+
+【语法】
+k_s32 kd_mpi_vdec_release_frame(k_u32 chn_num, const k_video_frame_info \*frame_info);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+| frame_info | 解码后的图像信息指针,由[kd_mpi_vdec_get_frame](#227-kd_mpi_vdec_get_frame)接口获取,参考《K230 系统控制 API参考》。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mpi_vdec_get_frame](#227-kd_mpi_vdec_get_frame)
+
+#### 2.2.9 kd_mpi_vdec_set_downscale
+
+【描述】
+设置解码输出缩小的图像(指定长宽或按比例)。
+
+【语法】
+k_s32 kd_mpi_vdec_set_downscale(k_u32 chn_num, const [k_vdec_downscale](#3211-k_vdec_downscale) *downscale)
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+| downscale | 缩小尺寸参数结构体指针。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+在kd_mpi_vdec_create_chn和kd_mpi_vdec_start_chn之间设置。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+#### 2.2.10 kd_mpi_vdec_set_rotation
+
+【描述】
+设置解码旋转角度。
+
+【语法】
+k_s32 kd_mpi_vdec_set_rotation(k_u32 chn_num, const [k_rotation](#3112-k_rotation) rotation)
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+| rotation | 旋转角度枚举。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见[错误码](#5-错误码)。 |
+
+【芯片差异】
+无。
+
+【需求】
+
+- 头文件:mpi_vdec_api.h,k_type.h,k_module.h,k_sys_comm.h,k_vdec_comm.h
+- 库文件:libvdec.a
+
+【注意】
+在kd_mpi_vdec_create_chn和kd_mpi_vdec_start_chn之间设置。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+## 3. 数据类型
+
+### 3.1 视频编码
+
+该功能模块的相关数据类型定义如下:
+
+- [VENC_MAX_CHN_NUM](#311-venc_max_chn_num):定义最大通道个数。
+- [K_VENC_MAX_2D_OSD_REGION_NUM](#312-k_venc_max_2d_osd_region_num):定义2D运算叠加OSD的最大Region个数。
+- [K_VENC_MAX_2D_BORDER_NUM](#313-k_venc_max_2d_border_num):定义2D运算画框的最大个数。
+- [K_VENC_2D_COFF_NUM](#314-k_venc_2d_coff_num):定义2D运算CSC转换系数的个数。
+- [K_VENC_2D_MAX_CHN_NUM](#315-k_venc_2d_max_chn_num):定义2D运算channel个数。
+- [k_venc_rc_mode](#316-k_venc_rc_mode):定义编码通道码率控制器模式。
+- [k_venc_pack_type](#317-k_venc_pack_type):定义JPEG码流PACK类型枚举。
+- [k_venc_2d_calc_mode](#318-k_venc_2d_calc_mode):定义2d运算的计算模式枚举。
+- [k_venc_2d_src_dst_fmt](#319-k_venc_2d_src_dst_fmt):定义2D运算的输入输出数据格式枚举。
+- [k_venc_2d_osd_fmt](#3110-k_venc_2d_osd_fmt):定义2D运算的OSD层数据格式枚举。
+- [k_venc_2d_add_order](#3111-k_venc_2d_add_order):定义2D运算的OSD叠加枚举。
+- [k_rotation](#3112-k_rotation):定义编码旋转角度枚举。
+- [k_venc_mirror](#3113-k_venc_mirror):定义编码翻转方式枚举。
+- [k_venc_2d_color_gamut](#3114-k_venc_2d_color_gamut):定义2D运算的色域枚举。
+- [k_venc_chn_attr](#3115-k_venc_chn_attr):定义编码通道属性结构体。
+- [k_venc_attr](#3116-k_venc_attr):定义编码器属性结构体。
+- [k_venc_rc_attr](#3117-k_venc_rc_attr):定义编码通道码率控制器属性结构体。
+- [k_venc_cbr](#3118-k_venc_cbr):定义H.264/H.265编码通道CBR属性结构体。
+- [k_venc_vbr](#3119-k_venc_vbr):定义H.264/H.265编码通道VBR属性结构体。
+- [k_venc_fixqp](#3120-k_venc_fixqp):定义H.264/H.265编码通道Fixqp属性结构体。
+- [k_venc_mjpeg_fixqp](#3121-k_venc_mjpeg_fixqp):定义MJPEG编码通道Fixqp属性结构体。
+- [k_venc_chn_status](#3122-k_venc_chn_status):定义编码通道的状态结构体。
+- [k_venc_stream](#3123-k_venc_stream):定义帧码流类型结构体。
+- [k_venc_pack](#3124-k_venc_pack):定义帧码流包结构体。
+- [k_venc_2d_osd_attr](#3125-k_venc_2d_osd_attr):2D叠加属性结构体。
+- [k_venc_2d_border_attr](#3126-k_venc_2d_border_attr):2D画框结构体。
+- [k_venc_h265_sao](#3127-k_venc_h265_sao):定义H.265协议编码通道Sao的结构体。
+- [k_venc_rect](#3128-k_venc_rect):定义矩形区域信息结构体。
+- [k_venc_roi_attr](#3129-k_venc_roi_attr):定义编码感兴趣区域信息。
+- [k_venc_h264_entropy](#3130-k_venc_h264_entropy):定义H.264协议编码通道熵编码结构体。
+- [k_venc_h265_entropy](#3131-k_venc_h265_entropy):定义H.265协议编码通道熵编码结构体。
+
+#### 3.1.1 VENC_MAX_CHN_NUM
+
+【说明】
+定义最大通道个数。
+
+【定义】
+
+\#define VENC_MAX_CHN_NUM 4
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.2 K_VENC_MAX_2D_OSD_REGION_NUM
+
+【说明】
+定义2D运算叠加OSD的最大Region个数。
+
+【定义】
+
+\#define K_VENC_MAX_2D_OSD_REGION_NUM 8
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.3 K_VENC_MAX_2D_BORDER_NUM
+
+【说明】
+定义2D运算画框的最大个数。
+
+【定义】
+
+\#define K_VENC_MAX_2D_BORDER_NUM 32
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.4 K_VENC_2D_COFF_NUM
+
+【说明】
+定义2D运算CSC转换系数的个数。
+
+【定义】
+
+\#define K_VENC_2D_COFF_NUM 12
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.5 K_VENC_2D_MAX_CHN_NUM
+
+【说明】
+定义2D运算channel个数。
+
+【定义】
+
+\#define K_VENC_2D_MAX_CHN_NUM 3
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.6 k_venc_rc_mode
+
+【说明】
+定义编码通道码率控制器模式。
+
+【定义】
+typedef enum {
+ K_VENC_RC_MODE_CBR = 1,
+ K_VENC_RC_MODE_VBR,
+ K_VENC_RC_MODE_FIXQP,
+ K_VENC_RC_MODE_MJPEG_FIXQP,
+ K_VENC_RC_MODE_BUTT,
+} k_venc_rc_mode;
+
+【成员】
+| 成员名称 | 描述 |
+|---|---|
+| K_VENC_RC_MODE_CBR | H.264/H.265 CBR模式。 |
+| K_VENC_RC_MODE_VBR | H.264/H.265 VBR模式。 |
+| K_VENC_RC_MODE_FIXQP | H.264/H.265 Fixqp模式。 |
+| K_VENC_RC_MODE_MJPEG_FIXQP | MJPEG Fixqp模式。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.7 k_venc_pack_type
+
+【说明】
+定义JPEG码流PACK类型枚举。
+
+【定义】
+typedef enum {
+ K_VENC_P_FRAME = 1,
+ K_VENC_I_FRAME = 2,
+ K_VENC_HEADER = 3,
+ K_VENC_BUTT
+} k_venc_pack_type;
+
+【成员】
+| 成员名称 | 描述 |
+|----------------|----------|
+| K_VENC_P_FRAME | I帧。 |
+| K_VENC_I_FRAME | P帧。 |
+| K_VENC_HEADER | Header。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.8 k_venc_2d_calc_mode
+
+【说明】
+定义2d运算的计算模式枚举。
+
+【定义】
+typedef enum {
+ K_VENC_2D_CALC_MODE_CSC = 0,
+ K_VENC_2D_CALC_MODE_OSD,
+ K_VENC_2D_CALC_MODE_BORDER,
+ K_VENC_2D_CALC_MODE_OSD_BORDER,
+ K_VENC_2D_CALC_MODE_BUTT
+} k_venc_2d_calc_mode;
+
+【成员】
+
+| 成员名称 | 描述 |
+|--------------------------------|--------------------------|
+| K_VENC_2D_CALC_MODE_CSC | 图片格式转换。 |
+| K_VENC_2D_CALC_MODE_OSD | 图片叠加。 |
+| K_VENC_2D_CALC_MODE_BORDER | 画框。 |
+| K_VENC_2D_CALC_MODE_OSD_BORDER | 先进行图片叠加,再画框。 |
+
+【注意事项】
+
+- 目前不支持K_VENC_2D_CALC_MODE_CSC模式。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.9 k_venc_2d_src_dst_fmt
+
+【说明】
+定义2D运算的输入输出数据格式枚举。
+
+【定义】
+typedef enum {
+ K_VENC_2D_SRC_DST_FMT_YUV420_NV12= 0,
+ K_VENC_2D_SRC_DST_FMT_YUV420_NV21,
+ K_VENC_2D_SRC_DST_FMT_YUV420_I420,
+ K_VENC_2D_SRC_DST_FMT_ARGB8888 = 4,
+ K_VENC_2D_SRC_DST_FMT_ARGB4444,
+ K_VENC_2D_SRC_DST_FMT_ARGB1555,
+ K_VENC_2D_SRC_DST_FMT_XRGB8888,
+ K_VENC_2D_SRC_DST_FMT_XRGB4444,
+ K_VENC_2D_SRC_DST_FMT_XRGB1555,
+ K_VENC_2D_SRC_DST_FMT_BGRA8888,
+ K_VENC_2D_SRC_DST_FMT_BGRA4444,
+ K_VENC_2D_SRC_DST_FMT_BGRA5551,
+ K_VENC_2D_SRC_DST_FMT_BGRX8888,
+ K_VENC_2D_SRC_DST_FMT_BGRX4444,
+ K_VENC_2D_SRC_DST_FMT_BGRX5551,
+ K_VENC_2D_SRC_DST_FMT_RGB888,
+ K_VENC_2D_SRC_DST_FMT_BGR888,
+ K_VENC_2D_SRC_DST_FMT_RGB565,
+ K_VENC_2D_SRC_DST_FMT_BGR565,
+ K_VENC_2D_SRC_DST_FMT_SEPERATE_RGB,
+ K_VENC_2D_SRC_DST_FMT_BUTT
+} k_venc_2d_src_dst_fmt;
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.10 k_venc_2d_osd_fmt
+
+【说明】
+定义2D运算的OSD层数据格式枚举。
+
+【定义】
+typedef enum {
+ K_VENC_2D_OSD_FMT_ARGB8888= 0,
+ K_VENC_2D_OSD_FMT_ARGB4444,
+ K_VENC_2D_OSD_FMT_ARGB1555,
+ K_VENC_2D_OSD_FMT_XRGB8888,
+ K_VENC_2D_OSD_FMT_XRGB4444,
+ K_VENC_2D_OSD_FMT_XRGB1555,
+ K_VENC_2D_OSD_FMT_BGRA8888,
+ K_VENC_2D_OSD_FMT_BGRA4444,
+ K_VENC_2D_OSD_FMT_BGRA5551,
+ K_VENC_2D_OSD_FMT_BGRX8888,
+ K_VENC_2D_OSD_FMT_BGRX4444,
+ K_VENC_2D_OSD_FMT_BGRX5551,
+ K_VENC_2D_OSD_FMT_RGB888,
+ K_VENC_2D_OSD_FMT_BGR888,
+ K_VENC_2D_OSD_FMT_RGB565,
+ K_VENC_2D_OSD_FMT_BGR565,
+ K_VENC_2D_OSD_FMT_SEPERATE_RGB,
+ K_VENC_2D_OSD_FMT_BUTT
+} k_venc_2d_osd_fmt;
+
+【注意事项】
+
+- 目前叠加图像只支持ARGB8888、ARGB4444和ARGB1555的格式。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.11 k_venc_2d_add_order
+
+【说明】
+定义2D运算的OSD叠加(video、osd和背景层)顺序枚举。
+
+【定义】
+typedef enum {
+/\* bottom ------\> top \*/
+ K_VENC_2D_ADD_ORDER_VIDEO_OSD= 0,
+ K_VENC_2D_ADD_ORDER_OSD_VIDEO,
+ K_VENC_2D_ADD_ORDER_VIDEO_BG,
+ K_VENC_2D_ADD_ORDER_BG_VIDEO,
+ K_VENC_2D_ADD_ORDER_VIDEO_BG_OSD,
+ K_VENC_2D_ADD_ORDER_VIDEO_OSD_BG,
+ K_VENC_2D_ADD_ORDER_BG_VIDEO_OSD,
+ K_VENC_2D_ADD_ORDER_BG_OSD_VIDEO,
+ K_VENC_2D_ADD_ORDER_OSD_VIDEO_BG,
+ K_VENC_2D_ADD_ORDER_OSD_BG_VIDEO,
+ K_VENC_2D_ADD_ORDER_BUTT
+} k_venc_2d_add_order;
+
+【成员】
+| 成员名称 | 描述 |
+|----------------------------------|------------------------------------------|
+| K_VENC_2D_ADD_ORDER_VIDEO_OSD | Video在底层,OSD在顶层。 |
+| K_VENC_2D_ADD_ORDER_OSD_VIDEO | OSD在底层,video在顶层。 |
+| K_VENC_2D_ADD_ORDER_VIDEO_BG | Video在底层,背景色顶层。 |
+| K_VENC_2D_ADD_ORDER_BG_VIDEO | 背景色在底层,video顶层。 |
+| K_VENC_2D_ADD_ORDER_VIDEO_BG_OSD | Video在底层,背景色在中间层,OSD在顶层。 |
+| K_VENC_2D_ADD_ORDER_VIDEO_OSD_BG | Video在底层,OSD在中间层,背景色在顶层。 |
+| K_VENC_2D_ADD_ORDER_BG_VIDEO_OSD | 背景色在底层,video在中间层,OSD在顶层。 |
+| K_VENC_2D_ADD_ORDER_BG_OSD_VIDEO | 背景色在底层,OSD在中间层,video在顶层。 |
+| K_VENC_2D_ADD_ORDER_OSD_VIDEO_BG | OSD在底层,video在中间层,背景色在顶层。 |
+| K_VENC_2D_ADD_ORDER_OSD_BG_VIDEO | OSD在底层,背景色在中间层,video在顶层。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.12 k_rotation
+
+【说明】
+定义编码旋转角度枚举。
+
+【定义】
+typedef enum {
+ K_VPU_ROTATION_0 = 0,
+ K_VPU_ROTATION_90 = 1,
+ K_VPU_ROTATION_180 = 2,
+ K_VPU_ROTATION_270 = 3,
+ K_VPU_ROTATION_BUTT
+} k_rotation;
+
+【成员】
+| 成员名称 | 描述 |
+|----------------------|-------------------|
+| K_VPU_ROTATION_0 | 不旋转,旋转0度。 |
+| K_VPU_ROTATION_90 | 旋转90度。 |
+| K_VPU_ROTATION_180 | 旋转180度。 |
+| K_VPU_ROTATION_270 | 旋转270度。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.13 k_venc_mirror
+
+【说明】
+定义编码翻转方式枚举。
+
+【定义】
+
+typedef enum {
+ K_VENC_MIRROR_HORI = 0,
+ K_VENC_MIRROR_VERT = 1,
+ K_VENC_MIRROR_BUTT
+} k_venc_mirror; |
+
+【成员】
+| 成员名称 | 描述 |
+|----------------------|-------------------|
+| K_VENC_MIRROR_HORI | 水平翻转。 |
+| K_VENC_MIRROR_VERT | 垂直翻转。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.14 k_venc_2d_color_gamut
+
+【说明】
+定义2D运算的色域枚举。
+
+【定义】
+typedef enum {
+ VENC_2D_COLOR_GAMUT_BT601 = 0,
+ VENC_2D_COLOR_GAMUT_BT709,
+ VENC_2D_COLOR_GAMUT_BT2020,
+ VENC_2D_COLOR_GAMUT_BUTT
+} k_venc_2d_color_gamut;
+
+【成员】
+| 成员名称 | 描述 |
+|----------------------------|-------------|
+| VENC_2D_COLOR_GAMUT_BT601 | BT.601色域 |
+| VENC_2D_COLOR_GAMUT_BT709, | BT.709色域 |
+| VENC_2D_COLOR_GAMUT_BT2020 | BT.2020色域 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.15 k_venc_chn_attr
+
+【说明】
+定义编码通道属性结构体。
+
+【定义】
+typedef struct {
+ [k_venc_attr](#3116-k_venc_attr) venc_attr;
+ [k_venc_rc_attr](#3117-k_venc_rc_attr) rc_attr;
+} k_venc_chn_attr;
+
+【成员】
+| 成员名称 | 描述 |
+|-----------|------------------|
+| venc_attr | 编码器属性。 |
+| rc_attr | 码率控制器属性。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.16 k_venc_attr
+
+【说明】
+定义编码器属性结构体。
+
+【定义】
+typedef struct {
+ k_payload_type type;
+ k_u32 stream_buf_size;
+ k_u32 stream_buf_cnt;
+ k_u32 pic_width;
+ k_u32 pic_height;
+ k_venc_profile profile;
+} k_venc_attr;
+
+【成员】
+| 成员名称 | 描述 |
+|---|---|
+| type | 编码协议类型枚。 |
+| stream_buf_size | 码流buffer大小。 |
+| stream_buf_size | 码流buffer大小。 |
+| stream_buf_cnt | 码流buffer个数。|
+| profile | 编码的等级枚举。|
+| pic_width | 编码图像宽度。 取值范围: `[MIN_WIDTH, MAX_WIDTH]`,以像素为单 位。 必须是MIN_ALIGN的整数倍。 |
+| pic_height | 编码图像高度。 取值范围: `[MIN_HEIGHT, MAX_HEIGHT]`,以像素为 单位。 必须是MIN_ALIGN的整数倍。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.17 k_venc_rc_attr
+
+【说明】
+定义编码通道码率控制器属性结构体。
+
+【定义】
+typedef struct {
+ [k_venc_rc_mode](#316-k_venc_rc_mode) rc_mode;
+ union { [k_venc_cbr](#3118-k_venc_cbr) cbr;
+ [k_venc_vbr](#3119-k_venc_vbr) vbr;
+ [k_venc_fixqp](#3120-k_venc_fixqp) fixqp;
+ [k_venc_mjpeg_fixqp](#3121-k_venc_mjpeg_fixqp) mjpeg_fixqp;
+ };
+} k_venc_rc_attr;
+
+【成员】
+| 成员名称 | 描述 |
+|--------------|---------------------------------------------|
+| rc_mode | RC模式。 |
+| cbr | H.264/H.265协议编码通道固定比特率模式属性。 |
+| Vbr | H.264/H.265协议编码通道可变比特率模式属性。 |
+| fixqp | H.264/H.265协议编码通道固定qp模式属性。 |
+| mjpeg_fixqp | Mjpeg协议编码通道Fixqp模式属性。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.18 k_venc_cbr
+
+【说明】
+定义H.264/H.265编码通道CBR属性结构体。
+
+【定义】
+typedef struct {
+ k_u32 gop;
+ k_u32 stats_time;
+ k_u32 src_frame_rate;
+ k_u32 dst_frame_rate;
+ k_u32 bit_rate;
+} k_venc_cbr;
+
+【成员】
+| 成员名称 | 描述 |
+|-----------------|----------------------------------------------------|
+| gop | gop值。 |
+| stats_time | CBR码率统计时间,以秒为单位。 取值范围: `[1, 60]`。 |
+| src_frame_rate | 输入帧率,以fps为单位。 |
+| dst_frame_rate | 编码器输出帧率,以fps为单位。 |
+| bit_rate | 平均bitrate,以kbps为单位。 |
+
+【注意事项】
+
+- 如果设置的码率超过芯片手册中规定的最大实时码率,则不能保证实时编码。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.19 k_venc_vbr
+
+【说明】
+定义H.264/H.265编码通道VBR属性结构体。
+
+【定义】
+typedef struct {
+ k_u32 gop;
+ k_u32 stats_time;
+ k_u32 src_frame_rate;
+ k_u32 dst_frame_rate;
+ k_u32 max_bit_rate;
+ k_u32 bit_rate;
+} k_venc_vbr;
+
+【成员】
+| 成员名称 | 描述 |
+|-----------------|----------------------------------------------------|
+| gop | gop值。 |
+| stats_time | VBR码率统计时间,以秒为单位。 取值范围: `[1, 60]`。 |
+| src_frame_rate | 输入帧率,以fps为单位。 |
+| dst_frame_rate | 编码器输出帧率,以fps为单位。 |
+| max_bit_rate | 最大bitrate,以kbps为单位。 |
+| bit_rate | 平均bitrate,以kbps为单位。 |
+
+【注意事项】
+请参见[k_venc_cbr](#3118-k_venc_cbr)关于src_frame_rate和dst_frame_rate的说明。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.20 k_venc_fixqp
+
+【说明】
+定义H.264/H.265编码通道Fixqp属性结构体。
+
+【定义】
+typedef struct {
+ k_u32 gop;
+ k_u32 src_frame_rate;
+ k_u32 dst_frame_rate;
+ k_u32 i_qp; k_u32 p_qp;
+} k_venc_fixqp;
+
+【成员】
+| 成员名称 | 描述 |
+|-----------------|----------------------------------------|
+| gop | gop值。 |
+| src_frame_rate | 输入帧率,以fps为单位。 |
+| dst_frame_rate | 编码器输出帧率,以fps为单位。 |
+| i_qp | I帧所有宏块Qp值。 取值范围: `[0, 51]`。 |
+| q_qp | P帧所有宏块Qp值。 取值范围: `[0, 51]`。 |
+
+【注意事项】
+请参见[k_venc_cbr](#3118-k_venc_cbr)关于src_frame_rate和dst_frame_rate的说明。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.21 k_venc_mjpeg_fixqp
+
+【说明】
+定义MJPEG编码通道Fixqp属性结构体。
+
+【定义】
+typedef struct {
+ k_u32 src_frame_rate;
+ k_u32 dst_frame_rate;
+ k_u32 q_factor;
+} k_venc_mjpeg_fixqp;
+
+【成员】
+| 成员名称 | 描述 |
+|-----------------|-------------------------------------------|
+| src_frame_rate | 输入帧率,以fps为单位。 |
+| dst_frame_rate | 编码器输出帧率,以fps为单位。 |
+| q_factor | MJPEG编码的Qfactor。 取值范围: `[1, 99]`。 |
+
+【注意事项】
+请参见[k_venc_cbr](#3118-k_venc_cbr)关于src_frame_rate和dst_frame_rate的说明。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.22 k_venc_chn_status
+
+【说明】
+定义编码通道的状态结构体。
+
+【定义】
+typedef struct {
+ k_u32 cur_packs;
+ k_u64 release_pic_pts;
+ k_bool end_of_stream;
+} k_venc_chn_status;
+
+【成员】
+| 成员名称 | 描述 |
+|------------------|-------------------------|
+| cur_packs | 当前帧的码流包个数。 |
+| release_pic_pts | 释放码流对应图像的PTS。 |
+| end_of_stream | Stream结束标志位。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.23 k_venc_stream
+
+【说明】
+定义帧码流类型结构体。
+
+【定义】
+typedef struct {
+ [k_venc_pack](#3124-k_venc_pack) \*pack;
+ k_u32 pack_cnt;
+} k_venc_stream;
+
+【成员】
+| 成员名称 | 描述 |
+|----------|--------------------------|
+| pack | 帧码流包结构。 |
+| pack_cnt | 一帧码流的所有包的个数。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.24 k_venc_pack
+
+【说明】
+定义帧码流包结构体。
+
+【定义】
+ typedef struct {
+ k_u64 phys_addr;
+ k_u32 len;
+ k_u64 pts;
+ [k_venc_pack_type](#317-k_venc_pack_type) type;
+} k_venc_pack;
+
+【成员】
+| 成员名称 | 描述 |
+|------------|---------------------|
+| phys_addr | 码流包物理地址。 |
+| len | 码流包长度。 |
+| pts | 时间戳。单位: us。 |
+| type | 包数据类型。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.25 k_venc_2d_osd_attr
+
+【说明】
+2D叠加属性结构体。
+
+【定义】
+typedef struct{
+ k_u16 width;
+ k_u16 height;
+ k_u16 startx;
+ k_u16 starty;
+ k_u32 phys_addr`[3]`;
+ k_u8 bg_alpha;
+ k_u8 osd_alpha;
+ k_u8 video_alpha;
+ [k_venc_2d_add_order](#3111-k_venc_2d_add_order) add_order;
+ k_u32 bg_color;
+ [k_venc_2d_osd_fmt](#3110-k_venc_2d_osd_fmt) fmt;
+} k_venc_2d_osd_attr;
+
+【成员】
+| 成员名称 | 描述 |
+|-------------|---------------------------------------------------------------------------|
+| width | OSD叠加区域的宽度。 |
+| height | OSD叠加区域的高度。 |
+| startx | OSD叠加区域左上点在原图中x方向上的像素偏移 |
+| starty | OSD叠加区域左上点在原图中y方向上的像素偏移 |
+| phys_addr | OSD图像的物理地址。 |
+| bg_alpha | 背景层的透明度。 |
+| osd_alpha | OSD图像的透明度。 |
+| video_alpha | video输入图像的透明度。 |
+| add_order | OSD叠加顺序枚举。 |
+| bg_color | OSD背景层颜色,YUV444格式。 Y: bit0\~bit7 U: bit8\~bit15 V: bit16\~bit 23 |
+| fmt | OSD图像格式枚举。 |
+
+【注意事项】
+
+- 源图像以及目的图像在ddr的起始地址要保证8byte align。
+- 支持图像、osd的尺寸为偶数。
+- OSD的src和dst地址必须相同。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.26 k_venc_2d_border_attr
+
+【说明】
+2D画框结构体。
+
+【定义】
+typedef struct {
+ k_u16 width;
+ k_u16 height;
+ k_u16 line_width;
+ k_u32 color;
+ k_u16 startx;
+ k_u16 starty;
+} k_venc_2d_border_attr;
+
+【成员】
+| 成员名称 | 描述 |
+|------------|----------------------------------------------------------------------|
+| width | 画框区域的宽度,此为外框宽度,包含线宽。 |
+| height | 画框区域的高度,此为外框高度,包含线宽。 |
+| line_width | 画框的线宽。 |
+| color | 框的颜色。格式为YUV444 Y: bit0\~bit7 U: bit8\~bit15 V: bit16\~bit 23 |
+| startx | 画框区域左上点在原图中x方向上的像素偏移 |
+| starty | 画框区域左上点在原图中y方向上的像素偏移 |
+
+【注意事项】
+
+- 源图像以及目的图像在ddr的起始地址要保证8byte align。
+- 支持图像、框的尺寸为偶数。
+- src和dst地址必须相同。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.27 k_venc_h265_sao
+
+【说明】
+定义H.265协议编码通道Sao的结构体。
+
+【定义】
+typedef struct {
+ k_u32 slice_sao_luma_flag;
+ k_u32 slice_sao_chroma_flag;
+} k_venc_h265_sao;
+
+【成员】
+| 成员名称 | 描述 |
+|:--|:--|
+| slice_sao_luma_flag | 默认为1。取值范围:0或1。 |
+| slice_sao_chroma_flag | 默认为1。取值范围:0或1。 |
+
+【注意事项】
+无。
+
+#### 3.1.28 k_venc_rect
+
+【说明】
+定义矩形区域信息结构体。
+
+【定义】
+typedef struct {
+ k_s32 left;
+ k_s32 right;
+ k_u32 top;
+ k_u32 bottom;
+} k_venc_rect;
+
+【成员】
+| 成员名称 | 描述 |
+|:--|:--|
+| left | Left offset。 |
+| right | Right offset。 |
+| top | Top offset。 |
+| bottom | Bottom offset。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.29 k_venc_roi_attr
+
+【说明】
+定义编码感兴趣区域信息。
+
+【定义】
+typedef struct {
+ k_u32 idx;
+ k_bool enable;
+ k_bool is_abs_qp;
+ k_s32 qp;
+ [k_venc_rect](#3128-k_venc_rect) rect;
+} k_venc_roi_attr;
+
+【成员】
+| 成员名称 | 描述 |
+|:--|:--|
+| idx | ROI区域的索引,系统支持的索引范围为`[0,15]`,不支持超出这个范围的索引。 |
+| enable | 是否使能这个ROI区域。 |
+| is_abs_qp | ROI区域QP模式。K_FALSE:相对QP。K_TRUE:绝对QP。|
+| qp | QP值,范围`[0,51]`。 |
+| rect | ROI区域。left、 right、 top、bottom必须是16对齐。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.30 k_venc_h264_entropy
+
+【说明】
+定义H.264协议编码通道熵编码结构体。
+
+【定义】
+typedef struct {
+ k_u32 entropy_coding_mode;
+ k_u32 cabac_init_idc;
+} k_venc_h264_entropy;
+
+【成员】
+| 成员名称 | 描述 |
+|:--|:--|
+| entropy_coding_mode | 熵编码模式。0: cavlc。1: cabac。>=2没有意义。Baseline不支持cabac。 默认值为1。|
+| cabac_init_idc | 取值范围: `[0, 2]`, 默认值0,具体含义请参见H.264协议。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.1.31 k_venc_h265_entropy
+
+【说明】
+定义H.265协议编码通道熵编码结构体。
+
+【定义】
+typedef struct {
+ k_u32 cabac_init_flag;
+} k_venc_h265_entropy;
+
+【成员】
+| 成员名称 | 描述 |
+|:--|:--||
+| cabac_init_flag | 取值范围: `[0, 1]`, 默认值1,具体含义请参见H.265协议。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+### 3.2 视频解码
+
+该功能模块的相关数据类型定义如下:
+
+- [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num):定义最大通道个数。
+- [k_vdec_send_mode](#322-k_vdec_send_mode):定义解码通道属性结构体。
+- [k_vdec_chn_attr](#323-k_vdec_chn_attr):定义解码通道属性结构体。
+- [k_vdec_chn_status](#324-k_vdec_chn_status):定义通道状态结构体。
+- [k_vdec_dec_err](#325-k_vdec_dec_err):定义解码错误信息结构体。
+- [k_vdec_stream](#326-k_vdec_stream):定义视频解码的码流结构体。
+- [k_vdec_supplement_info](#327-k_vdec_supplement_info):定义输出帧补充信息。
+
+#### 3.2.1 K_VDEC_MAX_CHN_NUM
+
+【说明】
+定义最大通道个数。
+
+【定义】
+
+\#define K_VDEC_MAX_CHN_NUM 4
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.2 k_vdec_send_mode
+
+【说明】
+定义解码通道属性结构体。
+
+【定义】
+typedef enum {
+ K_VDEC_SEND_MODE_STREAM = 0,
+ K_VDEC_SEND_MODE_FRAME,
+ K_VDEC_SEND_MODE_BUTT
+} k_vdec_send_mode;
+
+【成员】
+| 成员名称 | 描述 |
+|-------------------------|--------------------------------|
+| K_VDEC_SEND_MODE_STREAM | 按流方式发送码流。 |
+| OT_VDEC_SEND_MODE_FRAME | 按帧方式发送码流。以帧为单位。 |
+
+【注意事项】
+目前只支持流式发送。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.3 k_vdec_chn_attr
+
+【说明】
+定义解码通道属性结构体。
+
+【定义】
+typedef struct {
+ k_payload_type type;
+ [k_vdec_send_mode](#322-k_vdec_send_mode) mode;
+ k_u32 pic_width;
+ k_u32 pic_height;
+ k_u32 stream_buf_size;
+ k_u32 frame_buf_size;
+ k_u32 frame_buf_cnt;
+ k_pixel_format pic_format;
+} k_vdec_chn_attr;
+
+【成员】
+| 成员名称 | 描述 |
+|------------------|---------------------------------------------------|
+| type | 解码协议类型枚举值。 |
+| mode | 码流发送方式。 |
+| pic_width | 通道支持的解码图像最大宽(以像素为单位) |
+| pic_height | 通道支持的解码图像最大高(以像素为单位) |
+| stream_buf_size | 码流缓存的大小。 |
+| frame_buf_size | 解码图像帧存buffer大小。 |
+| pic_format | 输入数据格式枚举,参考《K230 系统控制 API参考》。 |
+
+【注意事项】
+
+- 目前支持的pic_format为:PIXEL_FORMAT_YUV_SEMIPLANAR_420和PIXEL_FORMAT_YVU_PLANAR_420。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.4 k_vdec_chn_status
+
+【说明】
+定义通道状态结构体。
+
+【定义】
+typedef struct {
+ k_payload_type type;
+ k_bool is_started;
+ k_u32 recv_stream_frames;
+ k_u32 dec_stream_frames;
+ [k_vdec_dec_err](#325-k_vdec_dec_err) dec_err;
+ k_u32 width;
+ k_u32 height;
+ k_u64 latest_frame_pts;
+ k_bool end_of_stream;
+} k_vdec_chn_status;
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------------|----------------------------------------------------------------|
+| type | 解码协议。 |
+| is_started | 解码器是否已经启动接收码流。 |
+| recv_stream_frames | "码流buffer中已接收码流帧数。 -1表示无效。 流模式发送时无效。" |
+| dec_stream_frames | 码流buffer中已解码帧数。 |
+| dec_err | 解码错误信息。 |
+| width | 图像宽度。 |
+| height | 图像高度。 |
+| latest_frame_pts | 最新解码图像的时间戳。 |
+| end_of_stream | Stream结束标志位。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.5 k_vdec_dec_err
+
+【说明】
+定义解码错误信息结构体。
+
+【定义】
+typedef struct {
+ k_s32 set_pic_size_err;
+ k_s32 format_err;
+ k_s32 stream_unsupport;
+} k_vdec_dec_err;
+
+【成员】
+| 成员名称 | 描述 |
+|-------------------|----------------------------------------------------------|
+| set_pic_size_err | 图像的宽(或高)比通道的宽(或高)大。 |
+| format_err | 不支持的格式。 |
+| stream_unsupport | 不支持的规格(码流规格与解决方案宣称支持的规格不一致)。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.6 k_vdec_stream
+
+【说明】
+定义视频解码的码流结构体。
+
+【定义】
+typedef struct {
+ k_bool end_of_stream;
+ k_u64 pts;
+ k_u32 len;
+ k_u8 \* addr;
+} k_vdec_stream;
+
+【成员】
+| 成员名称 | 描述 |
+|---------------|------------------------------|
+| end_of_stream | 是否发完所有码流。 |
+| pts | 码流包的时间戳。以μs为单位。 |
+| len | 码流包的长度。以byte为单位。 |
+| addr | 码流包的地址。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.7 k_vdec_supplement_info
+
+【说明】
+定义输出帧补充信息。
+
+【定义】
+typedef struct {
+ k_payload_type type;
+ k_bool is_valid_frame;
+ k_bool end_of_stream;
+} k_vdec_supplement_info;
+
+【成员】
+| 成员名称 | 描述 |
+|----------------|----------------------|
+| type | 解码协议类型枚举值。 |
+| is_valid_frame | 是否为有效帧。 |
+| end_of_stream | Stream结束标志位。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.8 k_vdec_dsl_mode
+
+【说明】
+定义解码减小尺寸模式枚举。
+
+【定义】
+typedef enum {
+ K_VDEC_DSL_MODE_BY_SIZE,
+ K_VDEC_DSL_MODE_BY_RATIO,
+ K_VDEC_DSL_MODE_BUTT
+} k_vdec_dsl_mode;
+
+【成员】
+| 成员名称 | 描述 |
+|-------------------------|--------------------------------|
+| K_VDEC_DSL_MODE_BY_SIZE | 根据尺寸减小。 |
+| K_VDEC_DSL_MODE_BY_RATIO | 根据比例减小。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.9 k_vdec_dsl_size
+
+【说明】
+定义解码按照大小减小尺寸参数结构体。
+
+【定义】
+typedef struct {
+ k_u32 dsl_frame_width;
+ k_u32 dsl_frame_height;
+} k_vdec_dsl_size;
+
+【成员】
+| 成员名称 | 描述 |
+|-------------------------|--------------------------------|
+| dsl_frame_width | 减小尺寸后的宽度。 |
+| dsl_frame_height | 减小尺寸后的高度。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.10 k_vdec_dsl_ratio
+
+【说明】
+定义解码按照比例减小尺寸参数结构体。
+
+【定义】
+typedef struct {
+ k_u8 dsl_ratio_hor;
+ k_u8 dsl_ratio_ver;
+} k_vdec_dsl_ratio;
+
+【成员】
+| 成员名称 | 描述 |
+|-------------------------|--------------------------------|
+| dsl_frame_width | 减小尺寸水平方向的比例。 |
+| dsl_frame_height | 减小尺寸垂直方向的比例。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+#### 3.2.11 k_vdec_downscale
+
+【说明】
+缩小尺寸结构体。
+
+【定义】
+typedef struct {
+ [k_vdec_dsl_mode](#328-k_vdec_dsl_mode) dsl_mode;
+ union
+ {
+ [k_vdec_dsl_size](#329-k_vdec_dsl_size) dsl_size;
+ [k_vdec_dsl_ratio](#3210-k_vdec_dsl_ratio) dsl_ratio;
+ };
+} k_vdec_downscale;
+
+【成员】
+| 成员名称 | 描述 |
+|----------------|----------------------|
+| dsl_mode | 减小尺寸模式枚举。 |
+| dsl_size | 按照大小减小尺寸参数结构体。 |
+| dsl_ratio | 按照比例减小尺寸参数结构体。 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+无。
+
+## 4. MAPI
+
+### 4.1 视频编码
+
+#### 4.1.1 概述
+
+MAPI是在小核调用,用以获取venc的码流数据。
+
+#### 4.1.2 编码数据流图
+
+图4-1
+
+![mapi encode channel](images/d71726ec1aa4be0868689b0b36beaa4f.png)
+
+典型的编码流程包括了输入图像的接收、图像的编码、数据流的跨核传输以及码流的输出等过程。
+
+上图编码模块(VENC)由VENC接收通道、编码通道、2D接收通道、2D运算模块组成,详见[1.2.1](#121-视频编码) 。
+
+#### 4.1.3 API
+
+视频编码模块主要提供视频编码通道的创建和销毁、视频编码通道的开启和停止接收图像、设置和获取编码通道属性、注册和解注册获取码流的回调函数等功能。
+
+该功能模块提供以下MAPI:
+
+[kd_mapi_venc_init](#4131-kd_mapi_venc_init)
+
+[kd_mapi_venc_deinit](#4132-kd_mapi_venc_deinit)
+
+[kd_mapi_venc_registercallback](#4133-kd_mapi_venc_registercallback)
+
+[kd_mapi_venc_unregistercallback](#4134-kd_mapi_venc_unregistercallback)
+
+[kd_mapi_venc_start](#4135-kd_mapi_venc_start)
+
+[kd_mapi_venc_stop](#4136-kd_mapi_venc_stop)
+
+[kd_mapi_venc_bind_vi](#4137-kd_mapi_venc_bind_vi)
+
+[kd_mapi_venc_unbind_vi](#4138-kd_mapi_venc_unbind_vi)
+
+[kd_mapi_venc_request_idr](#4139-kd_mapi_venc_request_idr)
+
+[kd_mapi_venc_enable_idr](#41310-kd_mapi_venc_enable_idr)
+
+##### 4.1.3.1 kd_mapi_venc_init
+
+【描述】
+初始化编码通道。
+
+【语法】
+k_s32 kd_mapi_venc_init(k_u32 chn_num, [k_venc_chn_attr](#3115-k_venc_chn_attr) \* pst_venc_attr)
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---------------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+| pst_venc_attr | VENC 通道属性指针。 静态属性。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为错误码 |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+
+- 调用该接口前需要先初始化kd_mapi_sys_init ()和kd_mapi_media_init ()成功,详见“SYS MAPI”章节。
+- 重复初始化返回成功
+
+【举例】
+请参考sample_venc代码
+
+【相关主题】
+[kd_mapi_venc_deinit](#4132-kd_mapi_venc_deinit)
+[k_venc_chn_attr](#3115-k_venc_chn_attr)
+
+##### 4.1.3.2 kd_mapi_venc_deinit
+
+【描述】
+编码通道去初始化。
+
+【语法】
+k_s32 kd_mapi_venc_deinit(k_u32 chn_num)
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_venc_init](#4131-kd_mapi_venc_init)
+
+##### 4.1.3.3 kd_mapi_venc_registercallback
+
+【描述】
+注册编码通道回调函数,用于编码数据的获取。
+
+【语法】
+k_s32 kd_mapi_venc_registercallback(k_u32 chn_num, [kd_venc_callback_s](#4141-kd_venc_callback_s) \*pst_venc_cb);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|-------------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+| pst_venc_cb | 编码器回调函数结构体指针。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+
+- 回调函数结构体指针不能为空。
+- 结构体之内容完全一致时,才表示回调函数结构体相等。
+- 每个通道最多支持五个回调函数。
+
+【举例】
+无
+
+【相关主题】
+kd_mapi_venc_unregistercallback
+kd_venc_callback_s
+
+##### 4.1.3.4 kd_mapi_venc_unregistercallback
+
+【描述】
+解注册编码通道回调函数。
+
+【语法】
+k_s32 kd_mapi_venc_unregistercallback(k_u32 chn_num, [kd_venc_callback_s](#4141-kd_venc_callback_s) \*pst_venc_cb);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|-------------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+| pst_venc_cb | 编码器回调函数结构体指针。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+pst_venc_cb回调函数结构体内容与注册时的结构体内容完全一致时才能解注册该回调函数。
+
+【举例】
+无
+
+【相关主题】
+[kd_mapi_venc_registercallback](#4133-kd_mapi_venc_registercallback)
+
+##### 4.1.3.5 kd_mapi_venc_start
+
+【描述】
+启动编码通道。
+
+【语法】
+k_s32 kd_mapi_venc_start(k_s32 chn_num ,k_s32 s32_frame_cnt);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---------------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+| s32_frame_cnt | 期望编码帧的个数 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+
+- 场景一:视频流编码场景下,s32_frame_cnt 取值[KD_VENC_LIMITLESS_FRAME_COUNT](#4146-kd_venc_limitless_frame_count)
+- 场景二:单个或者多个数据编码的场景下,上一个编码完后才可以再次启动。
+- 场景一切换场景二时,需要先调用kd_mapi_venc_stop 接口。
+- 场景二切换场景一时,可以先调用kd_mapi_venc_stop 接口,也可以在编码完后再次启动编码。
+- 编码完成的标记请查看[kd_venc_data_s](#4143-kd_venc_data_s) 中end_of_stream。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_venc_stop](#4136-kd_mapi_venc_stop)
+
+##### 4.1.3.6 kd_mapi_venc_stop
+
+【描述】
+停止编码通道。
+
+【语法】
+k_s32 kd_mapi_venc_stop(k_s32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_venc_start](#4135-kd_mapi_venc_start)
+
+##### 4.1.3.7 kd_mapi_venc_bind_vi
+
+【描述】
+编码通道绑定输入源VI
+
+【语法】
+k_s32 kd_mapi_venc_bind_vi(k_s32 src_dev, k_s32 src_chn,k_s32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| src_dev | 输入源Device ID | 输入 |
+| src_chn | 输入源Channel ID | 输入 |
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_venc_unbind_vi](#4138-kd_mapi_venc_unbind_vi)
+
+##### 4.1.3.8 kd_mapi_venc_unbind_vi
+
+【描述】
+解绑定编码通道的输入源VI。
+
+【语法】
+k_s32 kd_mapi_venc_unbind_vi(k_s32 src_dev, k_s32 src_chn, k_s32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| src_dev | 输入源Device ID | 输入 |
+| src_chn | 输入源Channel ID | 输入 |
+| chn_num | VENC 通道号 取值范围:[0, VENC_MAX_CHN_NUM) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_venc_bind_vi](#4137-kd_mapi_venc_bind_vi)
+
+##### 4.1.3.9 kd_mapi_venc_request_idr
+
+【描述】
+请求IDR帧,在调用之后立即产生一个IDR帧。
+
+【语法】
+k_s32 kd_mapi_venc_request_idr(k_s32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:`[0, VENC_MAX_CHN_NUM]` | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_venc_start](#4135-kd_mapi_venc_start)
+
+##### 4.1.3.10 kd_mapi_venc_enable_idr
+
+【描述】
+使能IDR帧,根据GOP间隔产生IDR帧。
+
+【语法】
+k_s32 kd_mapi_venc_enable_idr(k_s32 chn_num, k_bool idr_enable);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VENC 通道号 取值范围:`[0, VENC_MAX_CHN_NUM]` | 输入 |
+| idr_enable | 是否是能IDR帧,0:不使能 1:使能 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+
+- 该接口应在[kd_mpi_venc_create_chn](#211-kd_mpi_venc_create_chn)之后,[kd_mpi_venc_start_chn](#213-kd_mpi_venc_start_chn)之前调用。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_venc_start](#4135-kd_mapi_venc_start)
+
+#### 4.1.4 数据类型
+
+视频编码相关的数据类型定义如下:
+[kd_venc_callback_s](#4141-kd_venc_callback_s)
+[pfn_venc_dataproc](#4142-pfn_venc_dataproc)
+[kd_venc_data_s](#4143-kd_venc_data_s)
+[k_venc_data_pack_s](#4144-k_venc_data_pack_s)
+[KD_VENC_MAX_FRAME_PACKCOUNT](#4145-kd_venc_max_frame_packcount)
+[KD_VENC_LIMITLESS_FRAME_COUNT](#4146-kd_venc_limitless_frame_count)
+
+##### 4.1.4.1 kd_venc_callback_s
+
+【说明】
+编码回调函数结构体。
+
+【定义】
+typedef struct
+{
+ [pfn_venc_dataproc](#4142-pfn_venc_dataproc)
+ k_u8 \*p_private_data;
+}kd_venc_callback_s;
+
+【成员】
+| 成员名称 | 描述 |
+|----------------|-------------------------------------------------------|
+| pfn_data_cb | 回调处理函数。用于获取编码数据 |
+| p_private_data | 私有数据指针。作为参数,在pfn_venc_dataproc中被调用。 |
+
+【注意事项】
+
+- 该结构体被注册后,编码启动后,有编码数据时,pfn_data_cb函数会被调用。用户通过该函数获取编码数据。
+- p_private_data为私有数据,用户可选用。
+
+【相关数据类型及接口】
+[kd_mapi_venc_registercallback](#4133-kd_mapi_venc_registercallback)
+[kd_mapi_venc_unregistercallback](#4134-kd_mapi_venc_unregistercallback)
+[pfn_venc_dataproc](#4142-pfn_venc_dataproc)
+
+##### 4.1.4.2 pfn_venc_dataproc
+
+【说明】
+定义编码数据回调函数。
+
+【定义】
+typedef k_s32 (*pfn_venc_dataproc)(k_u32 chn_num, [kd_venc_data_s](#4144-k_venc_data_pack_s) \*p_vstream_data, k_u8 \*p_private_data);
+
+【成员】
+| 成员名称 | 描述 |
+|----------------|--------------|
+| chn_num | 编码通道句柄 |
+| kd_venc_data_s | 数据指针 |
+| p_private_data | 私有数据指针 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+[kd_mapi_venc_registercallback](#4133-kd_mapi_venc_registercallback)
+[kd_mapi_venc_unregistercallback](#4134-kd_mapi_venc_unregistercallback)
+
+##### 4.1.4.3 kd_venc_data_s
+
+【说明】
+编码后的数据包类型。
+
+【定义】
+typedef struct
+{
+ [k_venc_chn_status](#3122-k_venc_chn_status);
+ k_u32 u32_pack_cnt;
+ [k_venc_data_pack_s](#4144-k_venc_data_pack_s) astPack `[`[KD_VENC_MAX_FRAME_PACKCOUNT](#4145-kd_venc_max_frame_packcount)`]`;
+}kd_venc_data_s;
+
+【成员】
+| 成员名称 | 描述 |
+|--------------|----------|
+| status | 通道状态 |
+| u32_pack_cnt | 包的数量 |
+| astPack | 数据包 |
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+[pfn_venc_dataproc](#4142-pfn_venc_dataproc)
+[kd_mapi_venc_start](#4135-kd_mapi_venc_start)
+
+##### 4.1.4.4 k_venc_data_pack_s
+
+【说明】
+编码后的数据包类型。
+
+【定义】
+typedef struct
+{
+ k_char * vir_addr;
+ k_u64 phys_addr;
+ k_u32 len;
+ k_u64 pts;
+ k_venc_pack_type type;
+}k_venc_data_pack_s;
+
+【成员】
+| 成员名称 | 描述 |
+|-----------|------------------|
+| vir_addr | 数据包的虚拟地址 |
+| phys_addr | 数据包的物理地址 |
+| len | 数据包的长度 |
+| pts | 时间戳 |
+| type | 码流PACK类型 |
+
+【注意事项】
+vir_addr和phys_addr都有一个地址;
+
+【相关数据类型及接口】
+[kd_venc_data_s](#4143-kd_venc_data_s)
+
+##### 4.1.4.5 KD_VENC_MAX_FRAME_PACKCOUNT
+
+【说明】
+定义每帧数据中包的最大个数。
+
+【定义】
+
+\#define KD_VENC_MAX_FRAME_PACKCOUNT 12
+
+【注意事项】
+无
+
+【相关数据类型及接口】
+无
+
+##### 4.1.4.6 KD_VENC_LIMITLESS_FRAME_COUNT
+
+【说明】
+定义视频无限制编码。
+
+【定义】
+
+\#define KD_VENC_LIMITLESS_FRAME_COUNT -1
+
+【注意事项】
+无。
+
+【相关数据类型及接口】
+[kd_mapi_venc_start](#4135-kd_mapi_venc_start)
+
+### 4.2 视频解码
+
+#### 4.2.1 API
+
+视频解码模块主要提供视频解码通道的创建和销毁、视频解码通道的开启和停止接收图像、设置和获取解码通道属性、与vo绑定输出解码图像等功能。
+
+该功能模块提供以下MAPI:
+
+[kd_mapi_vdec_init](#4211-kd_mapi_vdec_init)
+
+[kd_mapi_vdec_deinit](#4212-kd_mapi_vdec_deinit)
+
+[kd_mapi_vdec_start](#4213-kd_mapi_vdec_start)
+
+[kd_mapi_vdec_stop](#4214-kd_mapi_vdec_stop)
+
+[kd_mapi_vdec_bind_vo](#4137-kd_mapi_venc_bind_vi)
+
+[kd_mapi_vdec_unbind_vo](#4138-kd_mapi_venc_unbind_vi)
+
+[kd_mapi_vdec_send_stream](#4139-kd_mapi_venc_request_idr)
+
+[kd_mapi_vdec_query_status](#4218-kd_mapi_vdec_query_status)
+
+##### 4.2.1.1 kd_mapi_vdec_init
+
+【描述】
+初始化解码通道。
+
+【语法】
+k_s32 kd_mapi_vdec_init(k_u32 chn_num,const [k_vdec_chn_attr](#323-k_vdec_chn_attr) *attr);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---------------|---------------------------------------------|-----------|
+| chn_num | VDEC 通道号 取值范围:[0, VDEC_MAX_CHN_NUM) | 输入 |
+| attr | VDEC 通道属性指针。 静态属性。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为错误码 |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_vdec_api.h、k_vdec_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+
+- 调用该接口前需要先初始化kd_mapi_sys_init ()和kd_mapi_media_init ()成功,详见“SYS MAPI”章节。
+- 重复初始化返回成功
+
+【举例】
+请参考sample_vdec代码
+
+【相关主题】
+[kd_mapi_vdec_deinit](#4212-kd_mapi_vdec_deinit)
+
+##### 4.2.1.2 kd_mapi_vdec_deinit
+
+【描述】
+编码通道去初始化。
+
+【语法】
+k_s32 kd_mapi_vdec_deinit(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VDEC 通道号 取值范围:[0, VDEC_MAX_CHN_NUM) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_vdec_api.h、k_vdec_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_vdec_init](#4211-kd_mapi_vdec_init)
+
+##### 4.2.1.3 kd_mapi_vdec_start
+
+【描述】
+启动解码通道。
+
+【语法】
+k_s32 kd_mapi_vdec_start(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---------------|---------------------------------------------|-----------|
+| chn_num | VDEC 通道号 取值范围:[0, VDEC_MAX_CHN_NUM) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无 。
+
+【需求】
+头文件:mapi_venc_api.h、k_venc_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_vdec_stop](#4214-kd_mapi_vdec_stop)
+
+##### 4.2.1.4 kd_mapi_vdec_stop
+
+【描述】
+停止解码通道。
+
+【语法】
+k_s32 kd_mapi_vdec_stop(k_u32 chn_num);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VDEC 通道号 取值范围:[0, VDEC_MAX_CHN_NUM) | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_vdec_api.h、k_vdec_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_vdec_start](#4213-kd_mapi_vdec_start)
+
+##### 4.2.1.5 kd_mapi_vdec_bind_vo
+
+【描述】
+解码通道绑定输出源VO
+
+【语法】
+k_s32 kd_mapi_vdec_bind_vo(k_s32 chn_num,k_s32 vo_dev, k_s32 vo_chn);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VDEC 通道号 取值范围:[0, VDEC_MAX_CHN_NUM) | 输入 |
+| vo_dev | 输出vo device id | 输入 |
+| vo_chn | 输出vo device channel | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_vdec_api.h、k_vdec_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_vdec_unbind_vo](#4216-kd_mapi_vdec_unbind_vo)
+
+##### 4.2.1.6 kd_mapi_vdec_unbind_vo
+
+【描述】
+解绑定解码通道的输出源VO。
+
+【语法】
+k_s32 kd_mapi_vdec_unbind_ao(k_s32 chn_num,k_s32 vo_dev, k_s32 vo_chn);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VDEC 通道号 取值范围:[0, VDEC_MAX_CHN_NUM) | 输入 |
+| vo_dev | 输出vo device id | 输入 |
+| vo_chn | 输出vo device channel | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_vdec_api.h、k_vdec_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+[kd_mapi_vdec_bind_vo](#4215-kd_mapi_vdec_bind_vo)
+
+##### 4.2.1.7 kd_mapi_vdec_send_stream
+
+【描述】
+发送stream数据解码。
+
+【语法】
+k_s32 kd_mapi_vdec_send_stream(k_u32 chn_num, [k_vdec_stream](#326-k_vdec_stream) *stream, k_s32 milli_sec);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------------------------------------|-----------|
+| chn_num | VDEC 通道号 取值范围:[0, VDEC_MAX_CHN_NUM) | 输入 |
+| stream | 解码码流数据指针。 | 输入 |
+| milli_sec | 送码流方式标志。 取值范围: -1:阻塞。 0:非阻塞。 正值:超时时间,没有上限值,以ms为单位。 | 输入 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_vdec_api.h、k_vdec_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+##### 4.2.1.8 kd_mapi_vdec_query_status
+
+【描述】
+查询解码通道状态。
+
+【语法】
+k_s32 kd_mapi_vdec_query_status(k_u32 chn_num, k_vdec_chn_status *status);
+
+【参数】
+| 参数名称 | 描述 | 输入/输出 |
+|---|---|---|
+| chn_num | 编码通道信息。 取值范围:[0, [K_VDEC_MAX_CHN_NUM](#321-k_vdec_max_chn_num))。 | 输入 |
+| status | 视频解码通道状态结构体指针。 | 输出 |
+
+【返回值】
+| 返回值 | 描述 |
+|--------|-------------------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值为[错误码](#5-错误码) |
+
+【芯片差异】
+无。
+
+【需求】
+头文件:mapi_vdec_api.h、k_vdec_comm.h
+库文件:libmapi.a libipcmsg.a libdatafifo.a
+
+【注意】
+无。
+
+【举例】
+无。
+
+【相关主题】
+无。
+
+## 5. 错误码
+
+表 41 编码 API 错误码
+| 错误代码 | 宏定义 | 描述 |
+|------------|--------------------------|----------------------------------------------|
+| 0xa0098001 | K_ERR_VENC_INVALID_DEVID | 设备ID超出合法范围 |
+| 0xa0098002 | K_ERR_VENC_INVALID_CHNID | 通道ID超出合法范围 |
+| 0xa0098003 | K_ERR_VENC_ILLEGAL_PARAM | 参数超出合法范围 |
+| 0xa0098004 | K_ERR_VENC_EXIST | 试图申请或者创建已经存在的设备、通道或者资源 |
+| 0xa0098005 | K_ERR_VENC_UNEXIST | 试图使用或者销毁不存在的设备、通道或者资源 |
+| 0xa0098006 | K_ERR_VENC_NULL_PTR | 函数参数中有空指针 |
+| 0xa0098007 | K_ERR_VENC_NOT_CONFIG | 使用前未配置 |
+| 0xa0098008 | K_ERR_VENC_NOT_SUPPORT | 不支持的参数或者功能 |
+| 0xa0098009 | K_ERR_VENC_NOT_PERM | 该操作不允许,如试图修改静态配置参数 |
+| 0xa009800c | K_ERR_VENC_NOMEM | 分配内存失败,如系统内存不足 |
+| 0xa009800d | K_ERR_VENC_NOBUF | 分配缓存失败,如申请的数据缓冲区太大 |
+| 0xa009800e | K_ERR_VENC_BUF_EMPTY | 缓冲区中无数据 |
+| 0xa009800f | K_ERR_VENC_BUF_FULL | 缓冲区中数据满 |
+| 0xa0098010 | K_ERR_VENC_NOTREADY | 系统没有初始化或没有加载相应模块 |
+| 0xa0098011 | K_ERR_VENC_BADADDR | 地址超出合法范围 |
+| 0xa0098012 | K_ERR_VENC_BUSY | VENC系统忙 |
+
+表 42 解码 API 错误码
+| 错误代码 | 宏定义 | 描述 |
+|------------|--------------------------|----------------------------------------------|
+| 0xa00a8001 | K_ERR_VDEC_INVALID_DEVID | 设备ID超出合法范围 |
+| 0xa00a8002 | K_ERR_VDEC_INVALID_CHNID | 通道ID超出合法范围 |
+| 0xa00a8003 | K_ERR_VDEC_ILLEGAL_PARAM | 参数超出合法范围 |
+| 0xa00a8004 | K_ERR_VDEC_EXIST | 试图申请或者创建已经存在的设备、通道或者资源 |
+| 0xa00a8005 | K_ERR_VDEC_UNEXIST | 试图使用或者销毁不存在的设备、通道或者资源 |
+| 0xa00a8006 | K_ERR_VDEC_NULL_PTR | 函数参数中有空指针 |
+| 0xa00a8007 | K_ERR_VDEC_NOT_CONFIG | 使用前未配置 |
+| 0xa00a8008 | K_ERR_VDEC_NOT_SUPPORT | 不支持的参数或者功能 |
+| 0xa00a8009 | K_ERR_VDEC_NOT_PERM | 该操作不允许,如试图修改静态配置参数 |
+| 0xa00a800c | K_ERR_VDEC_NOMEM | 分配内存失败,如系统内存不足 |
+| 0xa00a800d | K_ERR_VDEC_NOBUF | 分配缓存失败,如申请的数据缓冲区太大 |
+| 0xa00a800e | K_ERR_VDEC_BUF_EMPTY | 缓冲区中无数据 |
+| 0xa00a800f | K_ERR_VDEC_BUF_FULL | 缓冲区中数据满 |
+| 0xa00a8010 | K_ERR_VDEC_NOTREADY | 系统没有初始化或没有加载相应模块 |
+| 0xa00a8011 | K_ERR_VDEC_BADADDR | 地址超出合法范围 |
+| 0xa00a8012 | K_ERR_VDEC_BUSY | VDEC系统忙 |
+
+## 6. 调试信息
+
+多媒体内存管理和和系统绑定调试信息,请参考《K230 系统控制 API参考》。
diff --git "a/zh/01_software/board/mpp/K230_\350\247\206\351\242\221\350\276\223\345\207\272_API\345\217\202\350\200\203.md" "b/zh/01_software/board/mpp/K230_\350\247\206\351\242\221\350\276\223\345\207\272_API\345\217\202\350\200\203.md"
new file mode 100644
index 0000000..209714f
--- /dev/null
+++ "b/zh/01_software/board/mpp/K230_\350\247\206\351\242\221\350\276\223\345\207\272_API\345\217\202\350\200\203.md"
@@ -0,0 +1,1956 @@
+# K230视频输出API参考
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍视频输出系统控制模块的功能和用法,其它模块的功能和用法将各有专门的文档加以论述。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|--------------------------|
+| VO | Video output |
+| DSI | Display Serial Interface |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|----------|------------|------------|
+| V1.0 | 初版 | 系统软件部 | 2023-03-10 |
+
+## 1. 概述
+
+VO(Video Output,视频输出)模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出视频和图形。芯片支持的显示/回写设备、视频层和图形层情况。
+
+LAYER层支持:
+
+| | LAYER0 | LAYER1 | LAYER2 |
+|------------|--------------------|--------------------|---------------------------|
+| 输入格式 | YUV420 NV12 | YUV420 NV12 | YUV420 NV12 YUV422 NV16 ? |
+| 最大分辨率 | 1920x1080 | 1920x1080 | 1920x1080 |
+| 叠加显示 | 支持可配置叠加顺序 | 支持可配置叠加顺序 | 支持可配置叠加顺序 |
+| Rotation | √ | √ | - |
+| Scaler | √ | - | - |
+| Mirror | √ | √ | - |
+| Gray | √ | √ | - |
+| 独立开关 | √ | √ | √ |
+
+OSD 层支持
+
+| | OSD0 | OSD1 | OSD2 | OSD3 |
+|--------------------|-----------------------------------------------------------|-----------------------------------------------------------|-----------------------------------------------------------|-----------------------------------------------------------|
+| 输入格式 | RGB888 RGB565 ARGB8888 Monochrome-8-bit RGB4444 RGB1555 | RGB888 RGB565 ARGB8888 Monochrome-8-bit RGB4444 RGB1555 | RGB888 RGB565 ARGB8888 Monochrome-8-bit RGB4444 RGB1555 | RGB888 RGB565 ARGB8888 Monochrome-8-bit RGB4444 RGB1555 |
+| 最大分辨率 | 1920x1080 | 1920x1080 | 1920x1080 | 1920x1080 |
+| 叠加显示 | 支持可配置叠加顺序 | 支持可配置叠加顺序 | 支持可配置叠加顺序 | 支持可配置叠加顺序 |
+| ARGB 265 等级ALPHA | √ | √ | √ | √ |
+| 独立开关 | √ | √ | √ | √ |
+
+### 1.1 硬件描述
+
+本次硬件介绍是以evblp3 做的介绍
+
+#### 1.1.1 Mipi接口
+
+在evblp3 上的硬件引脚如下:
+
+![图片包含 图示 描述已自动生成](images/d7197713d3821fdd3e5c0f2b10dfd5b1.png)
+
+- 屏幕触摸iic用的iic4 (scl:gpio7,sda gpio8)
+- 屏幕触摸 rst:gpio29, int:gpio30
+- 屏幕的rst:gpio9,backlight:gpio31
+- Mipi的引脚和屏幕的引脚一一对应
+
+#### 1.1.2 实物图
+
+![图片包含 游戏机, 电子, 电路 描述已自动生成](images/69dbfc0ef3144c90f5978f1019482030.png)
+
+- 图中1为mipi接口,采用的是软排线
+- 图中2为mipi信号测试点、包含四路data线和一路clk线
+
+### 1.2 软件描述
+
+视频输出软件配置分为3部分配置:phy 配置、dsi配置、VO配置,
+
+#### 1.2.1 PHY的配置流程
+
+phy的频率需要配置三个参数、计算PLL、配置voc、配置freq,根据这三个参数就可以确定txphy的频率,每一个的参数计算如下。
+
+##### 1.2.1.1 计算phy的pll
+
+数据速率由 PLL 输出时钟相位频率的两倍给出:数据速率 (Gbps) = PLL Fout(GHz) \* 2,输出频率是输入参考频率和倍频/分频比的函数。 计算phy 的pll共分为4种范围做的计算,不同的频率对应着不同的频率,它可以通过以下方式确定:
+
+| M | m+2 |
+|--------|-----|
+| N | n+1 |
+| Fclkin | 24M |
+
+For:
+
+![文本, 信件 描述已自动生成](images/e99b3eec46b58875ae936ea4ab23d86b.png)
+
+然而在这个需要遵循下边的限制:
+
+![图片包含 文本 描述已自动生成](images/cfd696fc1b6157fbf0220a4f1545a963.png)
+
+For:
+
+![文本, 信件 描述已自动生成](images/e0df5cfd79b26cd1c688cb8f82000188.png)
+
+For:
+
+![文本, 信件 描述已自动生成](images/fb853b016887c1d58cc45f4507d9276c.png)
+
+![文本 描述已自动生成](images/9cd0c8d3bd975f1f19a5eec9b846d00b.png)
+
+For:
+
+![文本 中度可信度描述已自动生成](images/659e3d039a5c3c623b3ffd6fb24ee777.png)
+
+上边的每一个for 对应着一个pll的等级、不同的等级对应着不同的计算公式和限制,计算示例如下:
+
+Example:
+
+mipi 的速率为 445.5M:所以pll的速率就是222.75M,应该选择第二个公式,计算如下
+
+222750000 = 1M / 2N = (m+2) / 2(n+1) \* 24000000 , 整理完成公式如下:
+
+222.75n + 198.75 = 12m ,通过excel 计算如下:
+
+![表格 描述已自动生成](images/8ff8dac9c9f9b815001733e37e44e4cc.png)
+
+得出来的m = 295 ,n = 15。
+
+配置pll中的m 和n都是整数值、如果所有的值都不是整数,就需要在m 和 n的值做加1和减1处理、反推回去看哪个频率理你需要的最近,再去验证是否可用,不可以就重复上边的操作。
+
+##### 1.2.1.2 配置phy的voc
+
+配置phy 的voc 可以根据表格查询即可:
+
+![表格 描述已自动生成](images/174b1b96f4a280ab5350f4ed5452d43f.png)
+
+![表格 描述已自动生成](images/8e1970bbd7ffb862547feaf8a59cab48.png)
+
+Example:
+
+mipi 的速率为 445.5M:所以pll的速率就是222.75M,voc = 010111 = 0x17
+
+##### 1.2.1.3 配置freq
+
+配置phy 的freq 可以根据表格查询即可:
+
+![表格 描述已自动生成](images/95941399975cca1c16253927129d8e19.png)
+
+![表格 描述已自动生成](images/22628c5b4acf510370e51188734fe172.png)
+
+![表格 描述已自动生成](images/4a233637850b4e84b5208317666c4314.png)
+
+Example:
+
+mipi 的速率为 445.5M:pll的速率就是222.75M,freq 选择0100101, 配置这个的时候需要将最高位bit\[7\] = 1,所有freq = 10100101= 0xa5
+
+#### 1.2.2 DSI的配置
+
+DSI(Display Serial Interface)是MIPI 定义的一组通信协议的一部分联盟,主要实现 MIPI DSI 规范中定义的所有协议功能的数字控制器,包含了具有两个和四个通道的双向 PHY。
+
+DSI在软件中主要配置屏幕显示用的timing和发送命令的功能。
+
+##### 1.2.2.1 配置显示器的timing
+
+每个厂家的屏幕都会有一组时序用来做屏幕的控制,主要包含了帧的控制时序和一行的控制时序,如下图所示:
+
+![图示 描述已自动生成](images/01cabbb3d5c1dc60d0baa95a0f87104f.png)
+
+![图示, 示意图 描述已自动生成](images/507a7bd277508dc177ebb0c4cfb49b9e.png)
+
+DSI中也会用到这些参数、配置的时序和屏幕一致即可。
+
+##### 1.2.2.2 DSI的命令下发
+
+需要dsi 先进入lp模式、然后就可以发送命令,需要的api如下:
+
+- [kd_mpi_dsi_set_lp_mode_send_cmd](#226-kd_mpi_dsi_set_lp_mode_send_cmd)
+- [kd_mpi_dsi_send_cmd](#223-kd_mpi_dsi_send_cmd)
+
+发送的数据是按照8位发送的,会根据数量自动选择发送长包还是短包。
+
+##### 1.2.2.3 DSI 的自测模式
+
+DSI 自测模式会按照自己配置的dsi timing 产生color bar 的数据发送出去,这样不依赖vo从ddr读取数据,测试模式显示如下图:
+
+![背景图案 中度可信度描述已自动生成](images/25246d8f3ff85d6e9b1de1b03369fbb3.png)
+
+DSI 和vo之间采用的是24位接口,所以配置出来的color bar 是上图的效果,使用方法只需要配置完成dsi之后使能color bar即可,api如下
+
+- [kd_mpi_dsi_set_test_pattern](#225-kd_mpi_dsi_set_test_pattern)
+
+#### 1.2.3 VO的配置
+
+VO(video output)主要是VO(Video Output,视频输出)模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出视频和图形,VO这部分包含两个配置、一个是timing 的配置、另一个是视频层的配置
+
+##### 1.2.3.1 VO 时序配置
+
+VO的时序配置和dsi 的时序配置采用的一样的配置参数,具体的行和列一样,看dsi timing 介绍即可
+
+##### V1.2.3.2 O的layer层配置
+
+VO layer 层目前支持3个layer层、4个osd层。Layer层只能显示yuv的图像格式(layer0 和 layer1 支持的功能在[概述](#概述)中的图表)。
+
+##### 1.2.3.3 VO 的回写功能配置
+
+VO 还支持回写功能、这个可以验证VO配置的是否正确,VO配置完成之后会将数据写回到ddr 当中,方便验证VO的配置是否出现异常
+
+#### 1.2.4 VO模块的调试方法
+
+##### 1.2.4.1 屏幕的测试方法
+
+- 可以通过LP命令配置屏幕进入自测模式、看产生的图像是否正常
+- 通过LP命令读取屏幕寄存器看是否有返回
+
+##### 1.2.4.2 DSI 的测试方法
+
+- 配置完dsi之后,让屏幕进入自测模式,量取信号看时候正常,也可以看屏幕是否产生color bar 的图像
+- 查看phy的err 状态寄存器、看是否有err 状态,可以通过proc查看
+
+##### 1.2.4.3 VO的测试方法
+
+- VO配置完成之后、打开writeback 功能,查看是否和配置的要求一致
+- 读取DSI的err状态寄存器,查看VO和dsi之间数据传输是否出现underflow和overflow,如果出现、适当的调整timing再次尝试
+
+## 2. API 参考
+
+### 2.1 TXPHY
+
+该功能模块提供以下API:
+
+- [kd_mpi_set_mipi_phy_attr](#211-kd_mpi_set_mipi_phy_attr)
+
+#### 2.1.1 kd_mpi_set_mipi_phy_attr
+
+【描述】
+
+设置phy 的频率
+
+【语法】
+
+k_s32 kd_mpi_set_mipi_phy_attr(k_vo_mipi_phy_attr \*attr)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------------|-----------|
+| attr | Phy 的频率结构描述 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+### 2.2 DSI
+
+该功能模块提供以下API:
+
+- [kd_mpi_dsi_set_attr](#221-kd_mpi_dsi_set_attr)
+- [kd_mpi_dsi_enable](#222-kd_mpi_dsi_enable)
+- [kd_mpi_dsi_send_cmd](#223-kd_mpi_dsi_send_cmd)
+- [kd_mpi_dsi_read_pkg](#224-kd_mpi_dsi_read_pkg)
+- [kd_mpi_dsi_set_test_pattern](#225-kd_mpi_dsi_set_test_pattern)
+- [kd_mpi_dsi_set_lp_mode_send_cmd](#226-kd_mpi_dsi_set_lp_mode_send_cmd)
+
+#### 2.2.1 kd_mpi_dsi_set_attr
+
+【描述】
+
+配置dsi 属性参数
+
+【语法】
+
+k_s32 kd_mpi_dsi_set_attr(k_display_mode \*attr)【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------|-----------|
+| attr | dsi 属性参数 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.2 kd_mpi_dsi_enable
+
+【描述】
+
+打开dsi
+
+【语法】
+
+k_s32 kd_mpi_dsi_enable(void)
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.3 kd_mpi_dsi_send_cmd
+
+【描述】
+
+Dsi 发送命令
+
+【语法】
+
+k_s32 kd_mpi_dsi_send_cmd(k_u8 \*data, k_s32 cmd_len)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------|-----------|
+| data | 发送的数据 | 输入 |
+| cmd_len | 数据长度 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.4 kd_mpi_dsi_read_pkg
+
+【描述】
+
+Dsi 读取命令
+
+【语法】
+
+k_s32 kd_mpi_dsi_read_pkg(k_u8 \*rx_buf, k_s32 cmd_len)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------|-----------|
+| rx_buf, | 接受的数据 | 输入 |
+| cmd_len | 数据长度 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.5 kd_mpi_dsi_set_test_pattern
+
+【描述】
+
+配置dsi 进入自测模式
+
+【语法】
+
+k_s32 kd_mpi_dsi_set_test_pattern(void)
+
+【参数】、
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.6 kd_mpi_dsi_set_lp_mode_send_cmd
+
+【描述】
+
+配置dsi 进入lp mode 发送命令
+
+【语法】
+
+k_s32 kd_mpi_dsi_set_lp_mode_send_cmd(void)
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+### 2.3 VO
+
+- [kd_mpi_vo_init](#231-kd_mpi_vo_init)
+- [kd_mpi_vo_set_dev_param](#232-kd_mpi_vo_set_dev_param)
+- [kd_mpi_vo_enable_video_layer](#233-kd_mpi_vo_enable_video_layer)
+- [kd_mpi_vo_disable_video_layer](#234-kd_mpi_vo_disable_video_layer)
+- [kd_mpi_vo_enable](#235-kd_mpi_vo_enable)
+- [kd_mpi_vo_chn_insert_frame](#236-kd_mpi_vo_chn_insert_frame)
+- [kd_mpi_vo_chn_dump_frame](#237-kd_mpi_vo_chn_dump_frame)
+- [kd_mpi_vo_chn_dump_release](#238-kd_mpi_vo_chn_dump_release)
+- [kd_mpi_vo_osd_enable](#239-kd_mpi_vo_osd_enable)
+- [kd_mpi_vo_osd_disable](#2310-kd_mpi_vo_osd_disable)
+- [kd_mpi_vo_set_video_osd_attr](#2311-kd_mpi_vo_set_video_osd_attr)
+- [kd_mpi_vo_set_wbc_attr](#2312-kd_mpi_vo_set_wbc_attr)
+- [kd_mpi_vo_enable_wbc](#2313-kd_mpi_vo_enable_wbc)
+- [kd_mpi_vo_disable_wbc](#2314-kd_mpi_vo_disable_wbc)
+- [kd_display_reset](#2315-kd_display_reset)
+- [kd_display_set_backlight](#2316-kd_display_set_backlight)
+- [kd_mpi_vo_set_user_sync_info](#2317-kd_mpi_vo_set_user_sync_info)
+- kd_mpi_vo_draw_frame
+
+#### 2.3.1 kd_mpi_vo_init
+
+【描述】
+
+Vo 初始化默认参数
+
+【语法】
+
+k_s32 kd_mpi_vo_init(void);
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.2 kd_mpi_vo_set_dev_param
+
+【描述】
+
+Dsi 发送命令
+
+【语法】
+
+k_s32 kd_mpi_vo_set_dev_param(k_vo_pub_attr \*attr)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------|-----------|
+| attr | 视频输出设备公共属性结构体指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.3 kd_mpi_vo_enable_video_layer
+
+【描述】
+
+配置layer 层属性参数
+
+【语法】
+
+k_s32 kd_mpi_vo_enable_video_layer([k_vo_layer](#315-k_vo_layer) layer)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------------------------------------------|-----------|
+| layer | 视频输出视频层号 取值范围 【0 – K_MAX_VO_LAYER_NUM】 | 输入 |
+| attr | 视频层属性结构体指针 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.4 kd_mpi_vo_disable_video_layer
+
+【描述】
+
+关闭视频层
+
+【语法】
+
+k_s32 kd_mpi_vo_disable_video_layer([k_vo_layer](#315-k_vo_layer) layer)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------------------------------------------|-----------|
+| layer | 视频输出视频层号 取值范围 【0 – K_MAX_VO_LAYER_NUM】 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:
+- 库文件:
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.5 kd_mpi_vo_enable
+
+【描述】
+
+打开vo
+
+【语法】
+
+k_u8 kd_mpi_vo_enable(void);
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:
+- 库文件:
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.6 kd_mpi_vo_chn_insert_frame
+
+【描述】
+
+插入帧到vo的通道
+
+【语法】
+
+k_s32 kd_mpi_vo_chn_insert_frame(k_u32 chn_num, [k_video_frame_info](#3119-k_video_frame_info) \*vf_info)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------|-----------|
+| chn_num | 通道数量 | 输入 |
+| vf_info | 视频帧的结构体指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h k_video_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.7 kd_mpi_vo_chn_dump_frame
+
+【描述】
+
+从vo 的通道中抓取一帧数据
+
+【语法】
+
+k_s32 kd_mpi_vo_chn_dump_frame(k_u32 chn_num, [k_video_frame_info](#3119-k_video_frame_info) \*vf_info, k_u32 timeout_ms);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|------------|--------------------|-----------|
+| chn_num | 通道id | 输入 |
+| vf_info | 视频帧的结构体指针 | 输入 |
+| timeout_ms | 超时时间 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h k_video_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.8 kd_mpi_vo_chn_dump_release
+
+【描述】
+
+释放抓取帧
+
+【语法】
+
+k_s32 kd_mpi_vo_chn_dump_release(k_u32 chn_num, const [k_video_frame_info](#3119-k_video_frame_info) \*vf_info);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------------|-----------|
+| chn_num | 通道id | 输入 |
+| vf_info | 视频帧的结构体指针 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件: mpi_vo_api.h k_video_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.9 kd_mpi_vo_osd_enable
+
+【描述】
+
+打开osd层
+
+【语法】
+
+k_s32 kd_mpi_vo_osd_enable([k_vo_osd](#314-k_vo_osd) layer)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------|-----------|
+| layer | 视频输出视频层号 取值范围 【0 – K_MAX_VO_OSD_NUM】 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.10 kd_mpi_vo_osd_disable
+
+【描述】
+
+关闭osd层
+
+【语法】
+
+k_s32 kd_mpi_vo_osd_disable([k_vo_osd](#314-k_vo_osd) layer)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------|-----------|
+| layer | 视频输出视频层号 取值范围 【0 – K_MAX_VO_OSD_NUM】 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.11 kd_mpi_vo_set_video_osd_attr
+
+【描述】
+
+设置osd层属性
+
+【语法】
+
+k_s32 kd_mpi_vo_set_video_osd_attr([k_vo_osd](#314-k_vo_osd) layer, [k_vo_video_osd_attr](#3118-k_vo_video_osd_attr) \*attr)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------------|----------------------------------------------------|-----------|
+| layer | 视频输出视频层号 取值范围 【0 – K_MAX_VO_OSD_NUM】 | 输入 |
+| osd 层属性参数 | osd 层属性参数 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.12 kd_mpi_vo_set_wbc_attr
+
+【描述】
+
+设置回写属性
+
+【语法】
+
+k_s32 kd_mpi_vo_set_wbc_attr([k_vo_wbc_attr](#3112-k_vo_wbc_attr) \*attr)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------------|-----------|
+| attr | writeback 属性参数 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.13 kd_mpi_vo_enable_wbc
+
+【描述】
+
+使能writeback
+
+【语法】
+
+k_s32 kd_mpi_vo_enable_wbc(void)
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.14 kd_mpi_vo_disable_wbc
+
+【描述】
+
+关闭writeback
+
+【语法】
+
+k_s32 kd_mpi_vo_disable_wbc(void)
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.15 kd_display_reset
+
+【描述】
+
+复位视频输出子系统
+
+【语法】
+
+k_s32 kd_display_reset(void)
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.16 kd_display_set_backlight
+
+【描述】
+
+复位屏幕和打开背光
+
+【语法】
+
+k_s32 kd_display_set_backlight(void)
+
+【参数】
+
+无
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.17 kd_mpi_vo_set_user_sync_info
+
+【描述】
+
+设置用户接口时序信息,用于配置时钟源、时钟大小和时钟分频比
+
+【语法】
+
+k_s32 kd_mpi_vo_set_user_sync_info([k_vo_user_sync_info](#318-k_vo_user_sync_info) \*sync_info)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+| -------- | --------------- | --------- |
+| pre_div | 用户分频数 | 输入 |
+| clk_en | 分频enable 使能 | |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.3.18 kd_mpi_vo_draw_frame
+
+【描述】
+
+画框
+
+【语法】
+
+k_s32 kd_mpi_vo_draw_frame([k_vo_draw_frame](#3115-k_vo_draw_frame) \*frame)
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------|-----------|
+| frame | 画框的属性参数 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------|
+| 0 | 成功。 |
+| 非0 | 失败,参见错误码。 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:mpi_vo_api.h k_vo_comm.h
+- 库文件:libvo.a
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+## 3. 数据类型
+
+### 3.1 VO
+
+#### 3.1.1 k_vo_intf_sync
+
+【说明】
+
+定义视频中的分辨率和帧率
+
+【定义】
+
+```c
+typedef enum {
+K_VO_OUT_1080P30,
+K_VO_OUT_1080P60,
+}k_vo_intf_sync;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|------------------------|------------------------------------------------|
+| K_VO_OUT_1080P30 | 1080 是表示1920x1080 个pix。30 表示 30fps |
+| K_VO_OUT_1080P60 | 1080 是表示1920x1080 个pix。60 表示 60fps |
+| K_VO_OUT_1080x1920P30 | 1080x1920 是表示1080x1920 个pix。30 表示 30fps |
+| K_VO_OUT_11080x1920P60 | 1080x1920 是表示1080x1920 个pix。60 表示 60fps |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+#### 3.1.2 k_vo_intf_type
+
+【说明】
+
+定义视频中的分辨率和帧率
+
+【定义】
+
+```c
+typedef enum { K_VO_INTF_MIPI = 0, }k_vo_intf_type;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------------|-----------|
+| K_VO_INTF_MIPI | Mipi 接口 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+#### 3.1.3 k_pixel_format
+
+【说明】
+
+显示中layer 支持的数据格式,下边结构体中只列举了显示支持的数据格式,并不是所有的数据格式
+
+【定义】
+
+| typedef enum { /\*yuv\*/ PIXEL_FORMAT_YVU_PLANAR_420, PIXEL_FORMAT_YVU_PLANAR_422, /\*RGB\*/ PIXEL_FORMAT_RGB_565, PIXEL_FORMAT_RGB_888, /\*ARGB\*/ PIXEL_FORMAT_ARGB_8888, PIXEL_FORMAT_ARGB_4444, PIXEL_FORMAT_ARGB_1555, PIXEL_FORMAT_RGB_MONOCHROME_8BPP, }k_pixel_format; |
+|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------------------------------|-------------|
+| PIXEL_FORMAT_YVU_PLANAR_420 | YUV420 NV12 |
+| PIXEL_FORMAT_YVU_PLANAR_422 | YUV422 NV16 |
+| PIXEL_FORMAT_RGB_565 | RGB565 |
+| PIXEL_FORMAT_RGB_888 | RGB888 |
+| PIXEL_FORMAT_RGB_MONOCHROME_8BPP | 8 BIT RGB |
+| PIXEL_FORMAT_ARGB_8888 | ARGB8888 |
+| PIXEL_FORMAT_ARGB_4444 | ARGB4444 |
+| PIXEL_FORMAT_ARGB_1555 | ARGB1444 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.4 k_vo_osd
+
+【说明】
+
+OSD 的数量和每一个osd 的编号
+
+【定义】
+
+| typedef enum { K_VO_OSD0, K_VO_OSD1, K_VO_OSD2, K_VO_OSD3, K_MAX_VO_OSD_NUM, }k_vo_osd; |
+|----------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|------------------|---------------------|
+| K_VO_OSD0 | 第0层osd |
+| K_VO_OSD1 | 第1层osd |
+| K_VO_OSD2 | 第2层osd |
+| K_VO_OSD3 | 第3层osd |
+| K_MAX_VO_OSD_NUM | Osd 层最大数量标志 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.5 k_vo_layer
+
+【说明】
+
+layer 的数量和每一个layer的编号
+
+【定义】
+
+| typedef enum { K_VO_LYAER0 = 0, K_VO_LYAER1, K_VO_LYAER2, K_MAX_VO_LAYER_NUM, }k_vo_layer; |
+|------------------------------------------------------------------------------------------------|
+| |
+
+成员】
+
+| 成员名称 | 描述 |
+|--------------------|-----------------------|
+| K_VO_LYAER0 | 第0层layer |
+| K_VO_LYAER1 | 第1层layer |
+| K_VO_LYAER2 | 第2层layer |
+| K_VO_LYAER3 | 第3层layer |
+| K_MAX_VO_LAYER_NUM | layer 层最大数量标志 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.6 k_vo_rotation
+
+【说明】
+
+Layer rotation 支持的功能
+
+【定义】
+
+| typedef enum { K_ROTATION_0 = (0x01L \<\< 0), K_ROTATION_90 = (0x01L \<\< 1), K_ROTATION_180 = (0x01L \<\< 2), K_ROTATION_270 = (0x01L \<\< 3), } k_vo_rotation; |
+|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.7 k_vo_mirror_mode
+
+【说明】
+
+Layer mirror 支持的功能。
+
+【定义】
+
+| typedef enum { K_VO_MIRROR_NONE = (0x01L \<\< 4), K_VO_MIRROR_HOR = (0x01L \<\< 5), K_VO_MIRROR_VER = (0x01L \<\< 6), K_VO_MIRROR_BOTH = (0x01L \<\< 7), } k_vo_mirror_mode; |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|------------------|-------------------------|
+| K_VO_MIRROR_NONE | Layer 不做mirror |
+| K_VO_MIRROR_HOR | Layer 只做水平mirrot |
+| K_VO_MIRROR_VER | Layer只做垂直mirror |
+| K_VO_MIRROR_BOTH | Layer做垂直和水平mirror |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.8 k_vo_user_sync_info
+
+【说明】
+
+用户自定义做时钟分频。
+
+【定义】
+
+| typedef struct { k_u32 ext_div; k_u32 dev_div; k_u32 clk_en; } k_vo_user_sync_info; |
+|----------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------|------------------|
+| ext_div; | Clkext 分频 |
+| dev_div | Clk 分频 |
+| clk_en | Display 时钟使能 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.9 k_vo_point
+
+【说明】
+
+定义坐标信息结构体。
+
+【定义】
+
+| typedef struct { k_u32 x; k_u32 y; } k_vo_point; |
+|----------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------|--------|
+| x | 横坐标 |
+| y | 纵坐标 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.10 k_vo_size
+
+【说明】
+
+定义大小信息结构体。
+
+【定义】
+
+| typedef struct { k_u32 width; k_u32 height; } k_vo_size; |
+|------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------|------|
+| width | 宽度 |
+| height | 高度 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.11 k_vo_video_layer_attr
+
+【说明】
+
+定义 display layer 层属性
+
+【定义】
+
+| typedef struct { k_point display_rect; k_size img_size k_pixel_format pixel_format; k_u32 stride; k_u32 uv_swap_en; k_u32 alptha_tpye; //only osd use } k_vo_video_layer_attr; |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| display_rect; | OSD图层的的起始位置 |
+| img_size | 图像分辨率结构体,即合成画面的尺寸 |
+| pixel_format | 视频层支持的数据格式 |
+| stride | 图像的stride |
+| uv_swap_en | Uv 交换 |
+| alptha_tpye | Alptha 的类型,仅osd层使用。分为固定alpha(可分为256等级)、以 RGB 中R作为alpha 通道、以 RGB 中G作为alpha 通道、以 RGB 中B作为alpha 通道、以alpha 通道作为alpha |
+
+【注意事项】
+
+alptha_tpye 仅对osd 层使用
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.12 k_vo_wbc_attr
+
+【说明】
+
+定义 writeback属性。
+
+【定义】
+
+| typedef struct { [k_vo_size](#3110-k_vo_size) target_size; [k_pixel_format](#313-k_pixel_format) pixel_format; k_u32 stride; k_u32 y_phy_addr; } k_vo_wbc_attr; | |
+|-------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|
+| | |
+| 成员名称 | 描述 |
+| target_size | 回写的目标大小 |
+| pixel_format; | 回写的数据格式 |
+| stride | 回写的stride |
+| y_addr | 图像回写的物理地址 |
+
+【注意事项】
+
+y_addr 需要分配空间
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.13 k_vo_pub_attr
+
+【说明】
+
+配置视频输出设备的公共属性。
+
+【定义】
+
+| typedef struct { k_u32 bg_color; //yuv [k_vo_intf_type](#312-k_vo_intf_type) intf_type; [k_vo_intf_sync](#311-k_vo_intf_sync) intf_sync; [k_vo_display_resolution](#3116-k_vo_display_resolution) \*sync_info; // }k_vo_pub_attr; |
+|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| | |
+|-----------|--------------------------|
+| 成员名称 | 描述 |
+| bg_color | 背景色 |
+| type | 接口类型,目前只支持mipi |
+| intf_sync | 视频中的分辨率和帧率 |
+| sync_info | 图像输出的时序 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.14 k_vo_scaler_attr
+
+【说明】
+
+定义 scaler 属性
+
+【定义】
+
+| typedef struct { k_size in_size; k_size out_size; k_u32 stride; }k_vo_scaler_attr; |
+|---------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------|--------------------|
+| in_size | 输入的尺寸 |
+| out_size | 输出的尺寸 |
+| stride | 输入的stride |
+| y_addr | 图像回写的物理地址 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.15 k_vo_draw_frame
+
+【说明】
+
+定义 画框的 属性
+
+【定义】
+
+| typedef struct { k_u32 draw_en; k_u32 line_x_start; k_u32 line_y_start; k_u32 line_x_end; k_u32 line_y_end; k_u32 frame_num; }k_vo_draw_frame; |
+|------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|--------------|--------------------------|
+| draw_en | 画框使能 |
+| line_x_start | X 方向的起始 |
+| line_y_start | y方向的起始 |
+| line_x_end | X方向的终点未知 |
+| line_y_end | y方向的终点未知 |
+| frame_num | 当前框的num号 【0 - 16】 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.16 k_vo_display_resolution
+
+【说明】
+
+Display timing属性。
+
+【定义】
+
+| typedef struct { k_u32 pclk; k_u32 phyclk; k_u32 htotal; k_u32 hdisplay; k_u32 hsync_len; k_u32 hback_porch; k_u32 hfront_porch; k_u32 vtotal; k_u32 vdisplay; k_u32 vsync_len; k_u32 vback_porch; k_u32 vfront_porch; } k_vo_display_resolution; |
+|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|--------------|--------------------|
+| pclk | Vo 的pix clk 频率 |
+| phyclk | d-phy 的频率 |
+| htotal | 一行的总像素 |
+| hdisplay | 一行的有效像素个数 |
+| hsync_len | 行同步的像素个数 |
+| hback_porch | 后肩 的像素个数 |
+| hfront_porch | 前肩 的像素个数 |
+| vtotal | 总行数 |
+| vdisplay | 一帧有效的行数 |
+| vsync_len | 帧同步的像素个数 |
+| vback_porch | 后肩 的行数 |
+| vfront_porch | 前肩 的行数 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.17 k_vo_mipi_phy_attr
+
+]【说明】
+
+定义 mipi phy 频率的结构体
+
+【定义】
+
+| typedef struct { k_u32 n; k_u32 m; k_u32 voc; k_u32 phy_lan_num; k_u32 hs_freq; }k_vo_mipi_phy_attr; |
+|-----------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|-------------|----------------|
+| n | Pll 系数 |
+| m | Pll 系数 |
+| voc | Pll 系数 |
+| hs_freq | Phy 的频率范围 |
+| phy_lan_num | Phy 的lan 数量 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.18 k_vo_video_osd_attr
+
+【说明】
+
+配置osd层的公共属性。
+
+【定义】
+
+| typedef struct { [k_vo_point](#3110-k_vo_size) display_rect; [k_vo_size](#3110-k_vo_size) img_size; [k_pixel_format](#313-k_pixel_format) pixel_format; k_u32 stride; k_u8 global_alptha; } k_vo_video_osd_attr; |
+|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------|------------|
+| display_rect | 位置信息 |
+| img_size | 有效的size |
+| pixel_format | 数据格式 |
+| stride; | Stride |
+| global_alptha | 透明度 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.19 k_video_frame_info
+
+【说明】
+
+一帧的信息。
+
+【定义】
+
+| typedef struct { k_video_frame v_frame; /\*\*\< Video picture frame \*/ k_u32 pool_id; /\*\*\< VB pool ID \*/ k_mod_id mod_id; /\*\*\< Logical unit for generating video frames \*/ } k_video_frame_info; |
+|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| |
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------|-------------|
+| v_frame | 帧的信息 |
+| pool_id | VB pool ID |
+| mod_id | Video帧的id |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+## 4. 错误码
+
+表 41 xxx API 错误码
+
+| 错误代码 | 宏定义 | 描述 |
+|------------|------------------------|----------------|
+| 0xa00b8006 | K_ERR_VO_NULL_PTR | 参数空指针错误 |
+| 0xa00b8001 | K_ERR_VO_INVALID_DEVID | 无效dev id |
+| 0xa00b8002 | K_ERR_VO_INVALID_CHNID | 无效 chn id |
+| 0xa00b8005 | K_ERR_VO_UNEXIST | 视频缓存不存在 |
+| 0xa00b8004 | K_ERR_VO_EXIST | 视频缓存存在 |
+| 0xa00b8003 | K_ERR_VO_ILLEGAL_PARAM | 参数设置无效 |
+| 0xa00b8010 | K_ERR_VO_NOTREADY | vo还未就绪 |
+| 0xa00b8012 | K_ERR_VO_BUSY | 系统忙 |
+| 0xa00b8007 | K_ERR_VO_NOT_CONFIG | 不允许配置 |
+| 0xa00b8008 | K_ERR_VO_NOT_SUPPORT | 不支持的操作 |
+| 0xa00b8009 | K_ERR_VO_NOT_PERM | 操作不允许 |
+| 0xa00b800c | K_ERR_VO_NOMEM | 分配内存失败 |
+| 0xa00b800d | K_ERR_VO_NOBUF | 没有buff |
+| 0xa00b800e | K_ERR_VO_BUF_EMPTY | Buf 为空 |
+| 0xa00b800f | K_ERR_VO_BUF_FULL | Buf 为满 |
+| 0xa00b8011 | K_ERR_VO_BADADDR | 错误的地址 |
+| 0xa00b8012 | K_ERR_VO_BUSY | 系统忙 |
diff --git "a/zh/01_software/board/mpp/K230_\351\237\263\351\242\221_API\345\217\202\350\200\203.md" "b/zh/01_software/board/mpp/K230_\351\237\263\351\242\221_API\345\217\202\350\200\203.md"
new file mode 100644
index 0000000..573c913
--- /dev/null
+++ "b/zh/01_software/board/mpp/K230_\351\237\263\351\242\221_API\345\217\202\350\200\203.md"
@@ -0,0 +1,3412 @@
+# K230音频API参考
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+AUDIO模块包括音频输入、音频输出、音频编码、音频解码四个子模块以及对内置audio codec的控制。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|--------------|
+| ai | 音频输入模块 |
+| ao | 音频输出模块 |
+| aenc | 音频编码模块 |
+| adec | 音频解码模块 |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | ------------------------------------------------------------ | ----------- | --------- |
+| V1.0 | 初版 | 孙小朋 | 2023/3/7 |
+| V1.1 | 1)增加i2s内置codec的支持 2)增加pdm 单/双声道支持 3)增加ai、ao 不同采样精度支持(16/24/32) 4)api接口不变,增加了参数属性,完善了文档。 | 孙小朋 | 2023/3/27 |
+| V1.1.1 | 增加音频编解码api 接口 增加声音质量增强api接口[kd_mpi_ai_set_vqe_attr](#219-kd_mpi_ai_set_vqe_attr)/[kd_mpi_ai_get_vqe_attr](#2110-kd_mpi_ai_get_vqe_attr),以及说明。 | 孙小朋/崔妍 | 2023/4/12 |
+| V1.2 | 修改声音质量增强API接口[kd_mpi_ai_set_vqe_attr](#219-kd_mpi_ai_set_vqe_attr)/[kd_mpi_ai_get_vqe_attr](#2110-kd_mpi_ai_get_vqe_attr) 增加音频编解码mapi接口函数 | 孙小朋/崔妍 | 2023/4/27 |
+| V1.3 | 1)增加内置Audio Codec API接口 | 孙小朋 | 2023/5/10 |
+| v1.4 | 1)i2s支持单双声道输入和输出,修改[k_audio_i2s_attr](#3110-k_audio_i2s_attr)属性,增加snd_mode属性。 2)增加内置Audio Codec API接口:包括音量获取和复位相关接口:[k_acodec_get_gain_micl](#257-k_acodec_get_gain_hpoutl)/[k_acodec_get_gain_micr](#2516-k_acodec_get_gain_micr)/[k_acodec_get_adcl_volume](#2518-k_acodec_get_adcl_volume)/[k_acodec_get_adcr_volume](#2519-k_acodec_get_adcr_volume)/[k_acodec_get_alc_gain_micl](#255-k_acodec_get_alc_gain_micl)/[k_acodec_get_alc_gain_micr](#256-k_acodec_get_alc_gain_micr)/[k_acodec_get_gain_hpoutl](#257-k_acodec_get_gain_hpoutl)/[k_acodec_get_gain_hpoutr](#258-k_acodec_get_gain_hpoutr)/[k_acodec_get_dacl_volume](#259-k_acodec_get_dacl_volume)/[k_acodec_get_dacr_volume](#2510-k_acodec_get_dacr_volume)/[k_acodec_reset](#2510-k_acodec_reset) | 孙小朋 | 2023/6/15 |
+
+## 1. 概述
+
+### 1.1 概述
+
+音频模块包括音频输入ai、音频输出ao、音频编码aenc、音频解码adec四个子模块以及对内置模拟audio codec的支持。音频输入模块包括i2s和pdm两种音频接口,配合pdma做内存拷贝,支持数字麦(pdm/i2s)和模拟audio codec(i2s)声源输入,内置模拟audio codec,支持对音频数据进行声音质量增强(VQE)处理:3A(AEC回声消除、ANR降噪、AGC自动增益)。音频输出模块支持i2s音频接口,配合pdma做内存拷贝,可外接数据喇叭或模拟audio codec作为声音输出。音频编码和解码模块暂支持对 G711格式的音频编解码功能,并支持外部编解码器的注册。
+
+将音频模块拆分成多个子模块,模块间以低耦合的方式实现数据流的互传,这样的设计足以满足MAIX3下现有的多媒体业务。下图仅以语音对讲业务场景下音频模块使用方式来做分析。通过音频输入模块将采集到的音频数据通过音频编码模块编码后通过网络发送到远端,从远端获取到的音频编码数据经过音频解码模块解码后经音频输出模块即可播放远端声音。
+
+![img](images/b96e2ea6fe9536e76af33afe46b2069e.png)
+
+### 1.2 功能描述
+
+#### 1.2.1 音频输入
+
+音频输入模块(AI)主要实现配置及启用音频输入设备、获取音频帧数据等功能。
+
+音频输入模块支持I2s和pdm协议接口。i2s 支持同时采集最多2路双声道音频,pdm支持同时采集最多8路单声道音频。详细的i2s、pdm特性如下:
+
+- I2s音频接口
+
+ 1. 数据采样率支持8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz,采样精度支持16/24/32bit。
+
+ 1. 支持2组可配置IO用于输入/输出I2S音频数据,支持全双工模式。
+
+- pdm音频接口
+
+ 1. 支持PDM音频输入,1bit位宽,采样时钟频率为0.256MHz/0.384MHz/0.512MHz/0.768MHz/1.024MHz/1.4112MHz/1.536MHz/2.048MHz/2.8224MHz/3.072MHz/4.096MHz/5.6448MHz/6.144MHz/12.288MHz/24.576MHz,输入的PCM音频采样率为8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz。采样精度支持16/24/32bit.
+
+ 1. 支持过采样率128、64、32倍过采样。
+
+ 1. 支持1-4个IO用于输入PDM音频数据。
+
+ 1. 输入支持可配置1-8个PDM声道,支持PDM左右单声道模式和双声道模式,各IO声道模式统一,PDM双声道模式最多使用4个IO
+
+ 1. 使能的声道序号从小到大并且连续,不支持各声道随机使能
+
+#### 1.2.2 音频输出
+
+音频输出(AO)主要实现启用音频输出设备、发送音频帧到输出通道等功能。
+
+音频输出模块支持I2s协议接口。i2s 支持同时输出最多2路双声道音频。
+
+- i2s音频接口
+
+ 1. 数据采样率支持8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz,采样精度16/24/32bit。
+
+ 1. 支持2组可配置IO用于输入/输出I2S音频数据,支持全双工模式。
+
+#### 1.2.3 音频链路
+
+- audio codec从模拟麦克风接收到的信号,转变为I2S格式的PCM数据后,输入到audio中的I2S中;I2S输出的PCM数据,经过audio codec后,变为模拟信号发出,该模式不使用数字IO,固定使用I2S的sdi0和sdo0接口。
+
+- I2S的直接与片外的数字麦克风和PA连接。共有两组接口可以选择:sdi0、sdo0及sdi1、sdo1。
+
+- 片外的PDM麦克风,输入最多8路PDM数据到audio的4个输入数据接口。
+
+可供选择得链路包括:
+
+- 3组pdm_in + 1组i2s_in + 2组i2s out,其中1组i2s_in可以使用内置audio codec或片外
+
+- 4组pdm_in + 2组i2s out
+
+- 2组i2s_in + 2组 pdm_in + 2组i2s out
+
+可以使用内置codec或外接设备(音频子板)来测试音频相关功能。使用内置codec可以测试一组I2S音频输入和输出及audio codec相关功能,使用音频子板可以测试2组i2s音频输入输出和4组pdm音频输入功能。
+
+![img](images/b76dc39c5256a09c53be0e7572c2f587.png)
+
+#### 1.2.4 声音质量增强
+
+音频模块支持对音频数据进行声音质量增强处理,实现音频3A功能。目前支持的采样精度为16bit,支持的采样率为16k。
+
+## 2. API 参考
+
+### 2.1 音频输入
+
+该功能模块提供以下API:
+
+- [kd_mpi_ai_set_pub_attr](#211-kd_mpi_ai_set_pub_attr)
+- [kd_mpi_ai_get_pub_attr](#212-kd_mpi_ai_get_pub_attr)
+- [kd_mpi_ai_enable](#213-kd_mpi_ai_enable)
+- [kd_mpi_ai_disable](#214-kd_mpi_ai_disable)
+- [kd_mpi_ai_enable_chn](#215-kd_mpi_ai_enable_chn)
+- [kd_mpi_ai_disable_chn](#215-kd_mpi_ai_enable_chn)
+- [kd_mpi_ai_get_frame](#217-kd_mpi_ai_get_frame)
+- [kd_mpi_ai_release_frame](#218-kd_mpi_ai_release_frame)
+- [kd_mpi_ai_set_vqe_attr](#219-kd_mpi_ai_set_vqe_attr)
+- [kd_mpi_ai_get_vqe_attr](#2110-kd_mpi_ai_get_vqe_attr)
+
+#### 2.1.1 kd_mpi_ai_set_pub_attr
+
+【描述】
+
+设置AI设备属性。
+
+【语法】
+
+k_s32 kd_mpi_ai_set_pub_attr([k_audio_dev](#312-k_audio_dev) ai_dev, const [k_aio_dev_attr](#3112-k_aio_dev_attr) \*attr);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-------------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| attr | AI设备属性指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+【注意】
+
+无
+
+【举例】
+
+```c
+k_aio_dev_attr aio_dev_attr;
+aio_dev_attr.audio_type = KD_AUDIO_INPUT_TYPE_I2S;
+aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = 44100;
+aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16
+aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2;
+aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE;
+aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = 25;
+aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = 44100/25;
+aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC;
+if (K_SUCCESS != kd_mpi_ai_set_pub_attr(0, &aio_dev_attr))
+{
+printf("kd_mpi_ai_set_pub_attr failed\n");
+return K_FAILED;
+}
+if (K_SUCCESS != kd_mpi_ai_enable(0))
+{
+printf("kd_mpi_ai_set_pub_attr failed\n");
+return K_FAILED;
+}
+if (K_SUCCESS != kd_mpi_ai_enable_chn(0, 0))
+{
+printf("kd_mpi_ai_set_pub_attr failed\n");
+return K_FAILED;
+}
+```
+
+#### 2.1.2 kd_mpi_ai_get_pub_attr
+
+【描述】
+
+获取AI设备属性。
+
+【语法】
+
+k_s32 kd_mpi_ai_get_pub_attr([k_audio_dev](#312-k_audio_dev) ai_dev, [k_aio_dev_attr](#3112-k_aio_dev_attr) \*attr);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| attr | AI设备属性指针。 | 输出 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+#### 2.1.3 kd_mpi_ai_enable
+
+【描述】
+
+使能ai设备。
+
+【语法】
+
+k_s32 kd_mpi_ai_enable([k_audio_dev](#312-k_audio_dev) ai_dev);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+#### 2.1.4 kd_mpi_ai_disable
+
+【描述】
+
+禁用ai设备。
+
+【语法】
+
+k_s32 kd_mpi_ai_disable([k_audio_dev](#312-k_audio_dev) ai_dev);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+#### 2.1.5 kd_mpi_ai_enable_chn
+
+【描述】
+
+使能ai通道。
+
+【语法】
+
+k_s32 kd_mpi_ai_enable_chn([k_audio_dev](#312-k_audio_dev) ai_dev,[k_ai_chn](#313-k_ai_chn) ai_chn);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| ai_chn | 音频通道号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+#### 2.1.6 kd_mpi_ai_disable_chn
+
+【描述】
+
+禁用ai通道。
+
+【语法】
+
+k_s32 kd_mpi_ai_disable_chn([k_audio_dev](#312-k_audio_dev) ai_dev,[k_ai_chn](#313-k_ai_chn) ai_chn);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| ai_chn | 音频通道号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+#### 2.1.7 kd_mpi_ai_get_frame
+
+【描述】
+
+获取音频帧。
+
+【语法】
+
+k_s32 kd_mpi_ai_get_frame([k_audio_dev](#312-k_audio_dev) ai_dev,[k_ai_chn](#313-k_ai_chn) ai_chn,[k_audio_frame](#3114-k_audio_frame)\*frame, k_u32 milli_sec);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|-----------|---------------------------------------------------------------------------------------------------------------------------------------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| ai_chn | 音频通道号。 | 输入 |
+| frame | 音频帧数据。 | 输出 |
+| milli_sec | 获取数据的超时时间。 -1表示阻塞模式,无数据时一直等待; 0表示非阻塞模式,无数据时则报错返回; >0表示阻塞milli_sec毫秒,超时则报错返回。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+【注意】
+
+- milli_sec的值必须大于等于-1,等于-1时采用阻塞模式获取数据,等于0时采用非
+
+阻塞模式获取数据,大于0时,阻塞milli_sec毫秒后,没有数据则返回超时并报错。
+
+- 获取音频帧数据前,必须先使能对应的AI通道。
+
+【举例】
+
+```c
+k_audio_frame audio_frame;
+while(true)
+{
+//get frame
+if (K_SUCCESS != kd_mpi_ai_get_frame(dev_num, channel, &audio_frame, 1000))
+{
+printf("=========kd_mpi_ai_get_frame timeout\n");
+continue ;
+}
+//process frame
+process_frame(&audio_frame);
+//release frame
+kd_mpi_ai_release_frame(dev_num, channel, &audio_frame);
+}
+```
+
+#### 2.1.8 kd_mpi_ai_release_frame
+
+【描述】
+
+释放音频帧。
+
+【语法】
+
+k_s32 kd_mpi_ai_release_frame([k_audio_dev](#312-k_audio_dev) ai_dev,[k_ai_chn](#313-k_ai_chn) ai_chn,const [k_audio_frame](#3114-k_audio_frame) *frame);【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| ai_chn | 音频通道号。 | 输入 |
+| frame | 音频帧数据。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+#### 2.1.9 kd_mpi_ai_set_vqe_attr
+
+【描述】
+
+设置AI的声音质量增强功能相关属性。
+
+【语法】
+
+k_s32 kd_mpi_ai_set_vqe_attr([k_audio_dev](#312-k_audio_dev) ai_dev, [k_ai_chn](#313-k_ai_chn) ai_chn, const k_bool \*vqe_enable);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|------------|-----------------------------------------------------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| ai_chn | 音频通道号。 | 输入 |
+| vqe_enable | 声音质量增强使能标志位。 K_TRUE:使能。 K_FALSE:不使能。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+
+库文件:libai.a
+
+【注意】
+
+目前支持的采样精度为16bit,支持的采样率为8k和16k。
+
+#### 2.1.10 kd_mpi_ai_get_vqe_attr
+
+【描述】
+
+获取AI的声音质量增强功能相关属性。
+
+【语法】
+
+k_s32 kd_mpi_ai_get_vqe_attr([k_audio_dev](#312-k_audio_dev) ai_dev, [k_ai_chn](#313-k_ai_chn) ai_chn, k_bool \*vqe_enable);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|------------|---------------------------------------------------------------|-----------|
+| ai_dev | 音频设备号。 | 输入 |
+| ai_chn | 音频通道号。 | 输入 |
+| vqe_enable | 声音质量增强使能标志位指针。 K_TRUE:使能。 K_FALSE:不使能。 | 输出 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+### 2.2 音频输出
+
+该功能模块提供以下API:
+
+- [kd_mpi_ao_set_pub_attr](#221-kd_mpi_ao_set_pub_attr)
+- [kd_mpi_ao_get_pub_attr](#212-kd_mpi_ai_get_pub_attr)
+- [kd_mpi_ao_enable](#223-kd_mpi_ao_enable)
+- [kd_mpi_ao_disable](#224-kd_mpi_ao_disable)
+- [kd_mpi_ao_enable_chn](#225-kd_mpi_ao_enable_chn)
+- [kd_mpi_ao_disable_chn](#226-kd_mpi_ao_disable_chn)
+- [kd_mpi_ao_send_frame](#227-kd_mpi_ao_send_frame)
+
+#### 2.2.1 kd_mpi_ao_set_pub_attr
+
+【描述】
+
+设置AO设备属性。
+
+【语法】
+
+k_s32 kd_mpi_ao_set_pub_attr([k_audio_dev](#312-k_audio_dev) ao_dev, const [k_aio_dev_attr](#3112-k_aio_dev_attr) *attr);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-------------------|-----------|
+| ao_dev | 音频设备号。 | 输入 |
+| attr | AO设备属性指针。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ao_api.h
+- 库文件:libao.a
+
+【注意】
+
+无
+
+【举例】
+
+```c
+k_aio_dev_attr ao_dev_attr;
+ao_dev_attr.audio_type = KD_AUDIO_OUTPUT_TYPE_I2S;
+ao_dev_attr.kd_audio_attr.i2s_attr.sample_rate = 48000;
+ao_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_24;
+ao_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2;
+ao_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_RIGHT_JUSTIFYING_MODE;
+ao_dev_attr.kd_audio_attr.i2s_attr.frame_num = 15;
+ao_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = 48000/25;
+ao_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_EXTERN;
+if (K_SUCCESS != kd_mpi_ao_set_pub_attr(0, &ao_dev_attr))
+{
+printf("kd_mpi_ao_set_pub_attr failed\n");
+return K_FAILED;
+}
+
+if (K_SUCCESS != kd_mpi_ai_enable(0))
+{
+printf("kd_mpi_ai_enable failed\n");
+return K_FAILED;
+}
+
+if (K_SUCCESS != kd_mpi_ai_enable_chn(0,1))
+{
+printf("kd_mpi_ai_enable_chn failed\n");
+return K_FAILED;
+}
+```
+
+#### 2.2.2 kd_mpi_ao_get_pub_attr
+
+【描述】
+
+获取AO设备属性。
+
+【语法】
+
+k_s32 kd_mpi_ao_get_pub_attr([k_audio_dev](#312-k_audio_dev) ao_dev, [k_aio_dev_attr](#3112-k_aio_dev_attr) *attr);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------|-----------|
+| ao_dev | 音频设备号。 | 输入 |
+| attr | AO设备属性指针。 | 输出 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ao_api.h
+- 库文件:libao.a
+
+#### 2.2.3 kd_mpi_ao_enable
+
+【描述】
+
+使能ao设备。
+
+【语法】
+
+k_s32 kd_mpi_ao_enable([k_audio_dev](#312-k_audio_dev) ao_dev);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ao_dev | 音频设备号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ao_api.h
+- 库文件:libao.a
+
+#### 2.2.4 kd_mpi_ao_disable
+
+【描述】
+
+禁用ao设备。
+
+【语法】
+
+k_s32 kd_mpi_ao_disable([k_audio_dev](#312-k_audio_dev) ao_dev);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ao_dev | 音频设备号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ao_api.h
+- 库文件:libao.a
+
+#### 2.2.5 kd_mpi_ao_enable_chn
+
+【描述】
+
+使能ao通道。
+
+【语法】
+
+k_s32 kd_mpi_ao_enable_chn([k_audio_dev](#312-k_audio_dev) ao_dev,[k_ao_chn](#314-k_ao_chn) ao_chn);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ao_dev | 音频设备号。 | 输入 |
+| ao_chn | 音频通道号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ao_api.h
+- 库文件:libao.a
+
+#### 2.2.6 kd_mpi_ao_disable_chn
+
+【描述】
+
+禁用ao通道。
+
+【语法】
+
+k_s32 kd_mpi_ao_disable_chn([k_audio_dev](#312-k_audio_dev) ao_dev,[k_ao_chn](#314-k_ao_chn) ao_chn);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| ao_dev | 音频设备号。 | 输入 |
+| ao_chn | 音频通道号。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ao_api.h
+- 库文件:libao.a
+
+#### 2.2.7 kd_mpi_ao_send_frame
+
+【描述】
+
+发送ao帧数据。
+
+【语法】
+
+k_s32 kd_mpi_ao_send_frame
+
+([k_audio_dev](#312-k_audio_dev) ao_dev,[k_ao_chn](#314-k_ao_chn) ao_chn,const [k_audio_frame](#3114-k_audio_frame)*frame,k_s32 milli_sec);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|-----------|---------------------------------------------------------------------------------------------------------------------------------------------|-----------|
+| ao_dev | 音频设备号。 | 输入 |
+| ao_chn | 音频通道号。 | 输入 |
+| frame | 音频帧数据指针。 | 输入 |
+| milli_sec | 发送数据的超时时间。 -1表示阻塞模式,无数据时一直等待; 0表示非阻塞模式,无数据时则报错返回; >0表示阻塞milli_sec毫秒,超时则报错返回。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_ai_api.h
+- 库文件:libai.a
+
+【注意】
+
+- milli_sec的值必须大于等于-1,等于-1时采用阻塞模式获取数据,等于0时采用非
+
+阻塞模式获取数据,大于0时,阻塞milli_sec毫秒后,没有数据则返回超时并报错。
+
+- 发送音频帧数据前,必须先使能对应的AO通道。
+
+【举例】
+
+```c
+k_audio_frame audio_frame;
+k_s32 ret = 0;
+while (true)
+{
+//get ai frame
+ret = kd_mpi_ai_get_frame(0, 0, &audio_frame, 1000);
+if (K_SUCCESS != ret)
+{
+printf("=========kd_mpi_ai_get_frame timeout\n");
+continue ;
+}
+//send ai frame to ao
+ret = kd_mpi_ao_send_frame(0, 1, &audio_frame, 0);
+if (K_SUCCESS != ret)
+{
+printf("=======kd_mpi_ao_send_frame failed\n");
+}
+//release ai frame
+kd_mpi_ai_release_frame(0, 0, &audio_frame);
+}
+```
+
+### 2.3 音频编码
+
+音频编码主要实现创建编码通道、发送音频帧编码及获取编码码流等功能。音频编码部分,提供g711a/u编码,暂只支持16bit采样精度。
+
+该功能模块提供以下API:
+
+- [kd_mpi_aenc_register_encoder](#231-kd_mpi_aenc_register_encoder):注册编码器。
+- [kd_mpi_aenc_unregister_encoder](#232-kd_mpi_aenc_unregister_encoder):注销编码器。
+- [kd_mpi_aenc_create_chn](#233-kd_mpi_aenc_create_chn):创建编码通道
+- [kd_mpi_aenc_destroy_chn](#234-kd_mpi_aenc_destroy_chn):销毁编码通道
+- [kd_mpi_aenc_send_frame](#235-kd_mpi_aenc_send_frame):发送音频编码音频帧
+- [kd_mpi_aenc_get_stream](#236-kd_mpi_aenc_get_stream):获取音频编码码流
+- [kd_mpi_aenc_release_stream](#237-kd_mpi_aenc_release_stream):释放音频编码码流
+
+#### 2.3.1 kd_mpi_aenc_register_encoder
+
+- 【描述】
+
+注册编码器。
+
+- 【语法】
+
+k_s32 kd_mpi_aenc_register_encoder(k_s32 \*handle, const [k_aenc_encoder](#322-k_aenc_encoder) \*encoder);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------|---------------|
+| handle | 注册句柄。 | 输出 |
+| encoder | 编码器属性结构体。 | 输入 |
+
+- 【说明】
+
+用户通过传入编码器属性结构体,向 AENC 模块注册一个编码器,并返回注册句
+
+柄,用户可以最后通过注册句柄来注销该编码器。
+
+AENC 模块最大可注册 20 个编码器,且自身已注册 G711.a、G711.u
+
+两个编码器。
+
+同一种编码协议不允许重复注册编码器,例如假如已注册 G711 编码器,不允许另
+
+外再注册一个 G711 编码器
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_aenc_api.h
+- 库文件:libaenc.a
+
+#### 2.3.2 kd_mpi_aenc_unregister_encoder
+
+- 【描述】
+
+注销编码器。
+
+- 【语法】
+
+k_s32 kd_mpi_aenc_unregister_encoder(k_s32 handle);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------|---------------|
+| handle | 注销句柄。 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_aenc_api.h
+- 库文件:libaenc.a
+
+#### 2.3.3 kd_mpi_aenc_create_chn
+
+- 【描述】
+
+创建音频编码通道。
+
+- 【语法】
+
+k_s32 kd_mpi_aenc_create_chn([k_aenc_chn](#326-k_aenc_chn) aenc_chn, const [k_aenc_chn_attr](#323-k_aenc_chn_attr) \*attr);
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------------------------------------------------|---------------|
+| aenc_chn | 通道号。 取值范围: [0, [AENC_MAX_CHN_NUM](#324-aenc_max_chn_nums))。 | 输入 |
+| attr | 音频编码通道属性指针。 | 输入 |
+
+- 【说明】
+
+buffer 大小以帧为单位,取值范围是[2, [K_MAX_AUDIO_FRAME_NUM](#315-k_max_audio_frame_num),建议配置 为 10 以上,过小的 buffer 配置可能导致丢帧等异常。每个编码通道都会根据buffer大小来配置队列大小,用以缓存编码帧数据。
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_aenc_api.h
+- 库文件:libaenc.a
+
+#### 2.3.4 kd_mpi_aenc_destroy_chn
+
+- 【描述】
+
+销毁音频编码通道。
+
+- 【语法】
+
+k_s32 kd_mpi_aenc_destroy_chn([k_aenc_chn](#326-k_aenc_chn) aenc_chn);
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------------------------------------------------|---------------|
+| aenc_chn | 通道号。 取值范围: [0, [AENC_MAX_CHN_NUM](#324-aenc_max_chn_nums))。 | 输入 |
+
+- 【说明】
+
+无
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_aenc_api.h
+- 库文件:libaenc.a
+
+#### 2.3.5 kd_mpi_aenc_send_frame
+
+- 【描述】
+
+发送音频编码帧。
+
+- 【语法】
+
+k_s32 kd_mpi_aenc_send_frame([k_aenc_chn](#326-k_aenc_chn) aenc_chn,const [k_audio_frame](#3114-k_audio_frame) \*frame);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|---------------------------------------------------|---------------|
+| aenc_chn | 通道号。 取值范围:[0, AENC_MAX_CHN_NUM)。 输入 | 输入 |
+| frame | 音频帧结构体指针。 | 输入 |
+
+- 【说明】
+
+音频编码发送码流是非阻塞接口,如果音频码流缓存满,则直接返回失败。该接口用于用户主动发送音频帧进行编码,如果 AENC 通道已经通过系统绑定接口与 AI 绑定,不需要也不建议调此接口。调用该接口发送音频编码音频帧时,必须先创建对应的编码通道。
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_aenc_api.h
+- 库文件:libaenc.a
+
+#### 2.3.6 kd_mpi_aenc_get_stream
+
+- 【描述】
+
+获取音频编码码流。
+
+- 【语法】
+
+k_s32 kd_mpi_aenc_get_stream([k_aenc_chn](#326-k_aenc_chn) aenc_chn, [k_audio_stream](#327-k_audio_stream) \*stream, k_s32 milli_sec);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------|---------------|
+| aenc_chn | 通道号。 取值范围:[0, AENC_MAX_CHN_NUM)。 | 输入 |
+| stream | 获取的音频码流。 | 输出 |
+| milli_sec | 获取数据的超时时间 -1 表示阻塞模式,无数据时一直等待; 0 表示非阻塞模式,无数据时则报错返回; \>0 表示阻塞 s32MilliSec 毫秒,超时则报错返回。 | 输入 |
+
+- 【说明】
+
+必须创建通道后才可能获取码流,否则直接返回失败,如果在获取码流过程中销
+
+毁通道则会立刻返回失败。
+
+s32MilliSec 的值必须大于等于-1,等于-1 时采用阻塞模式获取数据,等于 0 时采
+
+用非阻塞模式获取数据,大于 0 时,阻塞 s32MilliSec 毫秒后,没有数据则返回超
+
+时并报错。
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_aenc_api.h
+- 库文件:libaenc.a
+
+#### 2.3.7 kd_mpi_aenc_release_stream
+
+- 【描述】
+
+释放音频编码码流。
+
+- 【语法】
+
+k_s32 kd_mpi_aenc_release_stream([k_aenc_chn](#326-k_aenc_chn) aenc_chn, const [k_audio_stream](#327-k_audio_stream) \*stream);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|----------------------------------------------|---------------|
+| aenc_chn | 通道号。 取值范围:[0, AENC_MAX_CHN_NUM)。 | 输入 |
+| stream | 获取的音频码流。 | 输出 |
+
+- 【说明】
+
+无
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+- 头文件:mpi_aenc_api.h
+- 库文件:libaenc.a
+
+### 2.4 音频解码
+
+音频解码主要实现解码通道、发送音频码流解码及获取解码后音频帧等功能。
+
+音频编解码部分,提供g711a/u解码,暂支持16bit采样精度。
+
+该功能模块提供以下API:
+
+- [kd_mpi_adec_register_decoder](#241-kd_mpi_adec_register_decoder):注册解码器
+- [kd_mpi_adec_unregister_decoder](#242-kd_mpi_adec_unregister_decoder):注销解码器
+- [kd_mpi_adec_create_chn](#243-kd_mpi_adec_create_chn):创建音频解码通道
+- [kd_mpi_adec_destroy_chn](#244-kd_mpi_adec_destroy_chn):销毁音频解码通道
+- [kd_mpi_adec_send_stream](#245-kd_mpi_adec_send_stream):发送音频码流到音频解码通道
+- [kd_mpi_adec_clr_chn_buf](#246-kd_mpi_adec_clr_chn_buf):清除 ADEC 通道中当前的音频数据缓存。
+- [kd_mpi_adec_get_frame](#247-kd_mpi_adec_get_frame):获取音频解码帧数据
+- [kd_mpi_adec_release_frame](#248-kd_mpi_adec_release_frame):释放音频解码帧数据
+
+#### 2.4.1 kd_mpi_adec_register_decoder
+
+- 【描述】
+
+注册解码器。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_register_decoder(k_s32 \*handle, const [k_adec_decoder](#329-k_adec_decoder) \*decoder);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------|---------------|
+| handle | 注册句柄。 | 输出 |
+| decoder | 解码器属性结构体。 | 输入 |
+
+- 【说明】
+
+用户通过传入解码器属性结构体,向 ADEC 模块注册一个解码器,并返回注册句柄,用户可以最后通过注册句柄来注销该解码器。 ADEC 模块最大可注册 20 个解码器,且自身已注册 G711a、G711u两个解码器。 同一种解码协议不允许重复注册解码器,例如假如已注册 G711 解码器,不允许另外再注册一个 G711 解码器。
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+头文件:mpi_adec_api.h
+
+库文件:libadec.a
+
+#### 2.4.2 kd_mpi_adec_unregister_decoder
+
+- 【描述】
+
+注销解码器。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_unregister_decoder(k_s32 handle);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|-------------|---------------|
+| handle | 注销句柄。 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+- 头文件:mpi_adec_api.h
+- 库文件:libadec.a
+
+#### 2.4.3 kd_mpi_adec_create_chn
+
+- 【描述】
+
+创建音频解码通道。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_create_chn([k_adec_chn](#3212-k_adec_chn) adec_chn, const [k_adec_chn_attr](#328-k_adec_chn_attr) \*attr);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|---------------------------------------------------------------------|---------------|
+| adec_chn | 通道号。 取值范围:[0, [ADEC_MAX_CHN_NUM](#3211-adec_max_chn_nums))。 | 输入 |
+| attr | 通道属性指针。 | 输入 |
+
+- 【说明】
+
+协议类型指定了该通道的解码协议,目前支持 G711。音频解码的部分属性需要与输出设备属性相匹配,例如采样率、帧长(每帧采样点数目)等。 buffer 大小以帧为单位,取值范围是[2, [K_MAX_AUDIO_FRAME_NUM](#315-k_max_audio_frame_num),建议配置为 10 以上,过小的 buffer 配置可能导致丢帧等异常。 在通道未创建前(或销毁后)才能使用此接口,如果通道已经被创建,则返回通道已经创建。
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+【需求】
+
+头文件:mpi_adec_api.h
+
+库文件:libadec.a
+
+#### 2.4.4 kd_mpi_adec_destroy_chn
+
+- 【描述】
+
+销毁音频解码通道。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_destroy_chn([k_adec_chn](#3212-k_adec_chn) adec_chn);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------------------------------------------------|---------------|
+| adec_chn | 通道号。 取值范围: [0, [ADEC_MAX_CHN_NUM](#3211-adec_max_chn_nums))。 | 输入 |
+
+- 【说明】
+
+无
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+- 头文件:mpi_adec_api.h
+- 库文件:libadec.a
+
+#### 2.4.5 kd_mpi_adec_send_stream
+
+- 【描述】
+
+发送音频码流到音频解码通道。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_send_stream(k_adec_chn adec_chn,const k_audio_stream \*stream,k_bool block);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------------------------------|---------------|
+| adec_chn | 通道号。 取值范围:[0, [ADEC_MAX_CHN_NUM](#3211-adec_max_chn_nums))。 | 输入 |
+| stream | 音频码流。 | 输入 |
+| block | 阻塞标识。 HI_TRUE:阻塞。 HI_FALSE:非阻塞。 | 输入 |
+
+- 【说明】
+
+发送数据时必须保证通道已经被创建,否则直接返回失败,如果在送数据过程中 销毁通道则会立刻返回失败。 支持阻塞或非阻塞方式发送码流。 当阻塞方式发送码流时,如果用于缓存解码后的音频帧的 Buffer 满,则此接口调用会被阻塞,直至解码后的音频帧数据被取走,或 ADEC 通道被销毁。
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:mpi_adec_api.h
+
+库文件:libadec.a
+
+#### 2.4.6 kd_mpi_adec_clr_chn_buf
+
+- 【描述】
+
+清除ADEC通道中当前的音频数据缓存。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_clr_chn_buf([k_adec_chn](#3212-k_adec_chn) adec_chn);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------------------------------------------------|---------------|
+| adec_chn | 通道号。 取值范围: [0, [ADEC_MAX_CHN_NUM](#3211-adec_max_chn_nums))。 | 输入 |
+
+- 【说明】
+
+要求解码通道已经被创建,如果通道未被创建则返回通道不存在错误码。
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:mpi_adec_api.h
+
+库文件:libadec.a
+
+#### 2.4.7 kd_mpi_adec_get_frame
+
+- 【描述】
+
+获取音频解码帧数据。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_get_frame([k_adec_chn](#3212-k_adec_chn) adec_chn, [k_audio_frame](#3114-k_audio_frame) \*frame, k_s32 milli_sec);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------|---------------|
+| adec_chn | 音频解码通道。 | 输入 |
+| frame_info | 音频帧数据结构体 输出 | 输出 |
+| block | 是否以阻塞方式获取 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:mpi_adec_api.h
+
+库文件:libadec.a
+
+#### 2.4.8 kd_mpi_adec_release_frame
+
+- 【描述】
+
+释放获取到的音频解码帧数据。
+
+- 【语法】
+
+k_s32 kd_mpi_adec_release_frame([k_adec_chn](#326-k_aenc_chn) adec_chn, const [k_audio_frame](#3114-k_audio_frame) \*frame);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+|--------------|--------------------------|---------------|
+| adec_chn | 音频解码通道。 | 输入 |
+| frame_info | 音频帧数据结构体 输出 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:mpi_adec_api.h
+
+库文件:libadec.a
+
+### 2.5 内置Audio Codec
+
+内置Audio Codec主要通过ioctl提供对硬件设备的操作。在提供的ioctl的cmd中,有些
+
+cmd用户可以不需要调用,直接使用模块加载时的默认值即可。ioctl调用实现的是对内置Audio Codec寄存器的读写。
+
+当前版本对audio codec的控制操作主要包含:adc数字和模拟音量,dac数字/模拟音量,adc/dac静音控制。其中采样率,采样精度,i2s对齐模式这些控制操作由用户通过调用ai和ao的api接口内核自动完成(内核代码自动实现对codec硬件设备操作),不再提供ioctl接口来控制。
+
+内置 Audio Codec 标准功能 cmd:
+
+- [k_acodec_set_gain_micl](#251-k_acodec_set_gain_micl):左声道输入模拟增益控制
+- [k_acodec_set_gain_micr](#252-k_acodec_set_gain_micr):右声道输入模拟增益控制
+- [k_acodec_set_adcl_volume](#253-k_acodec_set_adcl_volume):左声道输入数字音量控制
+- [k_acodec_set_adcr_volume](#254-k_acodec_set_adcr_volume):右声道输入数字音量控制
+- [k_acodec_set_alc_gain_micl](#255-k_acodec_set_alc_gain_micl):alc左声道输入的模拟增益控制
+- [k_acodec_set_alc_gain_micr](#256-k_acodec_set_alc_gain_micr):alc右声道输入的模拟增益控制
+- [k_acodec_set_gain_hpoutl](#257-k_acodec_set_gain_hpoutl):左声道输出模拟音量控制
+- [k_acodec_set_gain_hpoutr](#258-k_acodec_set_gain_hpoutr):右声道输出模拟音量控制
+- [k_acodec_set_dacl_volume](#259-k_acodec_set_dacl_volume):左声道输出数字音量控制
+- [k_acodec_set_dacr_volume](#2510-k_acodec_set_dacr_volume):右声道输出数字音量控制
+- [k_acodec_set_micl_mute](#2511-k_acodec_set_micl_mute):左声道输入静音控制
+- [k_acodec_set_micr_mute](#2512-k_acodec_set_micr_mute):右声道输入静音控制
+- [k_acodec_set_dacl_mute](#2513-k_acodec_set_dacl_mute):左声道输出静音控制
+- [k_acodec_set_dacr_mute](#2514-k_acodec_set_dacr_mute):右声道输出静音控制
+- [k_acodec_get_gain_micl](#2515-k_acodec_get_gain_micl):获取左声道输入模拟增益值
+- [k_acodec_get_gain_micr](#2516-k_acodec_get_gain_micr):获取右声道输入模拟增益值
+- [k_acodec_get_adcl_volume](#2518-k_acodec_get_adcl_volume):获取左声道输入数字音量值
+- [k_acodec_get_adcr_volume](#2519-k_acodec_get_adcr_volume):获取右声道输入数字音量值
+- [k_acodec_get_alc_gain_micl](#255-k_acodec_get_alc_gain_micl):获取alc左声道输入的模拟增益值
+- [k_acodec_get_alc_gain_micr](#256-k_acodec_get_alc_gain_micr):获取alc右声道输入的模拟增益值
+- [k_acodec_get_gain_hpoutl](#257-k_acodec_get_gain_hpoutl):获取左声道输出模拟音量值
+- [k_acodec_get_gain_hpoutr](#258-k_acodec_get_gain_hpoutr):获取右声道输出模拟音量值
+- [k_acodec_get_dacl_volume](#259-k_acodec_get_dacl_volume):获取左声道输出数字音量值
+- [k_acodec_get_dacr_volume](#2510-k_acodec_get_dacr_volume):获取右声道输出数字音量值
+- [k_acodec_reset](#2510-k_acodec_reset):音量重置
+
+#### 2.5.1 k_acodec_set_gain_micl
+
+- 【描述】
+
+左声道输入模拟增益控制
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_gain_micl, k_u32 \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_gain_micl | ioctl号 | 输入 |
+| arg | 无符号整型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围为0db,6db,20db,30db。
+
+#### 2.5.2 k_acodec_set_gain_micr
+
+- 【描述】
+
+右声道输入模拟增益控制
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_gain_micr, k_u32 \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_gain_micr | ioctl号 | 输入 |
+| arg | 无符号整型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围为0db,6db,20db,30db。
+
+#### 2.5.3 k_acodec_set_adcl_volume
+
+- 【描述】
+
+左声道输入数字增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_adcl_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_adcl_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-97,30]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.4 k_acodec_set_adcr_volume
+
+- 【描述】
+
+右声道输入数字增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_adcr_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_adcr_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-97,30]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.5 k_acodec_set_alc_gain_micl
+
+- 【描述】
+
+左声道alc输入模拟增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_alc_gain_micl, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| -------------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_alc_gain_micl | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-18,28.5]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.6 k_acodec_set_alc_gain_micr
+
+- 【描述】
+
+右声道alc输入模拟增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_alc_gain_micr, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| -------------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_alc_gain_micr | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-18,28.5]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.7 k_acodec_set_gain_hpoutl
+
+- 【描述】
+
+左声道输出模拟增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_gain_hpoutl, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_gain_hpoutl | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-39,6]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.8 k_acodec_set_gain_hpoutr
+
+- 【描述】
+
+右声道输出模拟增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_gain_hpoutr, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_gain_hpoutr | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-39,6]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.9 k_acodec_set_dacl_volume
+
+- 【描述】
+
+左声道输出数字增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_dacl_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_dacl_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-120,7]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.10 k_acodec_set_dacr_volume
+
+- 【描述】
+
+右声道输出数字增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_dacr_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_dacr_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-120,7]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.11 k_acodec_set_micl_mute
+
+- 【描述】
+
+左声道输入静音控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_micl_mute, k_bool \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_micl_mute | ioctl号 | 输入 |
+| arg | bool型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+取值范围:K_TRUE静音,K_FALSE取消静音。
+
+#### 2.5.12 k_acodec_set_micr_mute
+
+- 【描述】
+
+右声道输入静音控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_micr_mute, k_bool \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_micr_mute | ioctl号 | 输入 |
+| arg | bool型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+取值范围:K_TRUE静音,K_FALSE取消静音。
+
+#### 2.5.13 k_acodec_set_dacl_mute
+
+- 【描述】
+
+左声道输出静音控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_dacl_mute, k_bool \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_dacl_mute | ioctl号 | 输入 |
+| arg | bool型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+取值范围:K_TRUE静音,K_FALSE取消静音。
+
+#### 2.5.14 k_acodec_set_dacr_mute
+
+- 【描述】
+
+右声道输出静音控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_dacr_mute, k_bool \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_set_dacr_mute | ioctl号 | 输入 |
+| arg | bool型指针 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+|--------|----------------------|
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+取值范围:K_TRUE静音,K_FALSE取消静音。
+
+#### 2.5.15 k_acodec_get_gain_micl
+
+- 【描述】
+
+获取左声道输入模拟增益值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_gain_micl, k_u32 \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_gain_micl | ioctl号 | 输入 |
+| arg | 无符号整型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+获取到得模拟增益范围为0db,6db,20db,30db。
+
+#### 2.5.16 k_acodec_get_gain_micr
+
+- 【描述】
+
+获取右声道输入模拟增益值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_gain_micr, k_u32 \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ---------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_gain_micr | ioctl号 | 输入 |
+| arg | 无符号整型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+获取到得模拟增益范围为0db,6db,20db,30db。
+
+#### 2.5.18 k_acodec_get_adcl_volume
+
+- 【描述】
+
+获取左声道输入数字音量值
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_adcl_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_adcl_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-97,30]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.19 k_acodec_get_adcr_volume
+
+- 【描述】
+
+获取右声道输入数字增益控制值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_adcr_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_adcr_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-97,30]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.5 k_acodec_get_alc_gain_micl
+
+- 【描述】
+
+获取左声道alc输入模拟增益值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_set_alc_gain_micl, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| -------------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_alc_gain_micl | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-18,28.5]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.6 k_acodec_get_alc_gain_micr
+
+- 【描述】
+
+获取右声道alc输入模拟增益值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_alc_gain_micr, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| -------------------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_alc_gain_micr | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-18,28.5]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.7 k_acodec_get_gain_hpoutl
+
+- 【描述】
+
+获取左声道输出模拟增益值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_gain_hpoutl, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_gain_hpoutl | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-39,6]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.8 k_acodec_get_gain_hpoutr
+
+- 【描述】
+
+获取右声道输出模拟增益控制。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_gain_hpoutr, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_gain_hpoutr | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-39,6]`,赋值越大,音量越大,按1.5db递增。
+
+#### 2.5.9 k_acodec_get_dacl_volume
+
+- 【描述】
+
+获取左声道输出数字增益值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_dacl_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_dacl_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-120,7]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.10 k_acodec_get_dacr_volume
+
+- 【描述】
+
+获取右声道输出数字增益值。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_get_dacr_volume, float \*arg);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| ------------------------ | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_get_dacr_volume | ioctl号 | 输入 |
+| arg | 有符号浮点型指针 | 输出 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+模拟增益范围`[-120,7]`,赋值越大,音量越大,按0.5db递增。
+
+#### 2.5.10 k_acodec_reset
+
+- 【描述】
+
+音量重置:包括adc、dac、alc数字模拟增益。
+
+- 【语法】
+
+int ioctl (int fd, k_acodec_reset, ...);
+
+- 【参数】
+
+| **参数名称** | **描述** | **输入/输出** |
+| -------------- | ------------------------- | ------------- |
+| fd | Audio Codec设备文件描述符 | 输入 |
+| k_acodec_reset | ioctl号 | 输入 |
+
+- 【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 0 | 成功 |
+| 非0 | 失败,其值参见错误码 |
+
+- 【需求】
+
+头文件:k_acodec_comm.h
+
+库文件:libacodec.a
+
+- 【注意】
+
+无
+
+### 2.6 音频编码MAPI
+
+音频编码功能模块提供以下 MAPI:
+
+- [kd_mapi_aenc_init](#261-kd_mapi_aenc_init):初始化编码通道
+- [kd_mapi_aenc_deinit](#262-kd_mapi_aenc_deinit):去初始化编码通道。
+- [kd_mapi_aenc_start](#263-kd_mapi_aenc_start):启动编码通道。
+- [kd_mapi_aenc_stop](#264-kd_mapi_aenc_stop):停止编码通道。
+- [kd_mapi_aenc_registercallback](#265-kd_mapi_aenc_registercallback):注册编码回调函数。
+- [kd_mapi_aenc_unregistercallback](#266-kd_mapi_aenc_unregistercallback):解注册编码回调函数。
+- [kd_mapi_aenc_bind_ai](#267-kd_mapi_aenc_bind_ai):绑定 ai。
+- [kd_mapi_aenc_unbind_ai](#268-kd_mapi_aenc_unbind_ai):解绑定 ai。
+- [kd_mapi_register_ext_audio_encoder](#269-kd_mapi_register_ext_audio_encoder):注册外部音频编码器。
+- [kd_mapi_unregister_ext_audio_encoder](#2610-kd_mapi_unregister_ext_audio_encoder):解注册外部音频编码器。
+- [kd_mapi_aenc_send_frame](#2611-kd_mapi_aenc_send_frame):发送音频编码音频帧。
+
+#### 2.6.1 kd_mapi_aenc_init
+
+- 【描述】
+
+初始化编码通道。
+
+- 【语法】
+
+kd_mapi_aenc_init([k_handle](#331-k_handle) aenc_hdl,const [k_aenc_chn_attr](#323-k_aenc_chn_attr) \*attr);
+
+#### 2.6.2 kd_mapi_aenc_deinit
+
+- 【描述】
+
+去初始化编码通道。
+
+- 【语法】
+
+kd_mapi_aenc_deinit([k_handle](#331-k_handle) aenc_hdl);
+
+#### 2.6.3 kd_mapi_aenc_start
+
+- 【描述】
+
+启动编码通道。
+
+- 【语法】
+
+kd_mapi_aenc_start([k_handle](#331-k_handle) aenc_hdl);
+
+#### 2.6.4 kd_mapi_aenc_stop
+
+- 【描述】
+
+停止编码通道。
+
+- 【语法】
+
+kd_mapi_aenc_stop([k_handle](#331-k_handle) aenc_hdl);
+
+#### 2.6.5 kd_mapi_aenc_registercallback
+
+- 【描述】
+
+注册编码回调函数。
+
+- 【语法】
+
+k_s32 kd_mapi_aenc_registercallback([k_handle](#331-k_handle) aenc_hdl,k_aenc_callback_s \*aenc_cb);
+
+#### 2.6.6 kd_mapi_aenc_unregistercallback
+
+- 【描述】
+
+注册编码回调函数。
+
+- 【语法】
+
+k_s32 kd_mapi_aenc_unregistercallback([k_handle](#331-k_handle) aenc_hdl);
+
+#### 2.6.7 kd_mapi_aenc_bind_ai
+
+- 【描述】
+
+绑定ai。
+
+- 【语法】
+
+k_s32 kd_mapi_aenc_bind_ai([k_handle](#331-k_handle) ai_hdl,[k_handle](#331-k_handle) aenc_hdl);
+
+#### 2.6.8 kd_mapi_aenc_unbind_ai
+
+- 【描述】
+
+解绑定ai。
+
+- 【语法】
+
+k_s32 kd_mapi_aenc_unbind_ai([k_handle](#331-k_handle) ai_hdl,[k_handle](#331-k_handle) aenc_hdl);
+
+#### 2.6.9 kd_mapi_register_ext_audio_encoder
+
+- 【描述】
+
+注册外置编码器。
+
+- 【语法】
+
+k_s32 kd_mapi_register_ext_audio_encoder(const [k_aenc_encoder](#322-k_aenc_encoder) \*encoder,[k_handle](#331-k_handle) \* aencoder_hdl);
+
+#### 2.6.10 kd_mapi_unregister_ext_audio_encoder
+
+- 【描述】
+
+解注册外部音频编码器。
+
+- 【语法】
+
+k_s32 kd_mapi_unregister_ext_audio_encoder( [k_handle](#331-k_handle) aencoder_hdl);
+
+#### 2.6.11 kd_mapi_aenc_send_frame
+
+- 【描述】
+
+发送音频编码音频帧
+
+- 【语法】
+
+k_s32 kd_mapi_aenc_send_frame([k_handle](#331-k_handle) ai_hdl,const [k_audio_frame](#3114-k_audio_frame) \*frame);
+
+### 2.7 音频解码MAPI
+
+音频解码功能模块提供以下 MAPI:
+
+- [kd_mapi_adec_init](#261-kd_mapi_aenc_init):初始化解码通道
+- [kd_mapi_adec_deinit](#271-kd_mapi_adec_init):去初始化解码通道。
+- [kd_mapi_adec_start](#273-kd_mapi_adec_start):启动解码通道。
+- [kd_mapi_adec_stop](#274-kd_mapi_adec_stop):停止解码通道。
+- [kd_mapi_adec_registercallback](#275-kd_mapi_adec_registercallback):注册解码回调函数。
+- [kd_mapi_adec_unregistercallback](#276-kd_mapi_adec_unregistercallback):解注册解码回调函数。
+- [kd_mapi_adec_bind_ao](#277-kd_mapi_adec_bind_ao):绑定 ao。
+- [kd_mapi_adec_unbind_ao](#278-kd_mapi_adec_unbind_ao):解绑定 ao。
+- [kd_mapi_register_ext_audio_decoder](#279-kd_mapi_register_ext_audio_decoder):注册外部音频解码器。
+- [kd_mapi_unregister_ext_audio_decoder](#2710-kd_mapi_unregister_ext_audio_decoder):解注册外部音频解码器。
+- [kd_mapi_adec_send_stream](#2711-kd_mapi_adec_send_stream):发送音频解码音频帧。
+
+#### 2.7.1 kd_mapi_adec_init
+
+- 【描述】
+
+初始化解码通道。
+
+- 【语法】
+
+kd_mapi_adec_init([k_handle](#331-k_handle) adec_hdl,const [k_adec_chn_attr](#323-k_aenc_chn_attr) \*attr);
+
+#### 2.7.2 kd_mapi_adec_deinit
+
+- 【描述】
+
+去初始化解码通道。
+
+- 【语法】
+
+kd_mapi_adec_deinit([k_handle](#331-k_handle) adec_hdl);
+
+#### 2.7.3 kd_mapi_adec_start
+
+- 【描述】
+
+启动解码通道。
+
+- 【语法】
+
+kd_mapi_adec_start([k_handle](#331-k_handle) adec_hdl);
+
+#### 2.7.4 kd_mapi_adec_stop
+
+- 【描述】
+
+停止解码通道。
+
+- 【语法】
+
+kd_mapi_adec_stop([k_handle](#331-k_handle) adec_hdl);
+
+#### 2.7.5 kd_mapi_adec_registercallback
+
+- 【描述】
+
+注册解码回调函数。
+
+- 【语法】
+
+k_s32 kd_mapi_adec_registercallback([k_handle](#331-k_handle) adec_hdl,k_adec_callback_s \*adec_cb);
+
+#### 2.7.6 kd_mapi_adec_unregistercallback
+
+- 【描述】
+
+注册解码回调函数。
+
+- 【语法】
+
+k_s32 kd_mapi_adec_unregistercallback([k_handle](#331-k_handle) adec_hdl);
+
+#### 2.7.7 kd_mapi_adec_bind_ao
+
+- 【描述】
+
+绑定ao.
+
+- 【语法】
+
+k_s32 kd_mapi_adec_bind_ao([k_handle](#331-k_handle) ao_hdl,[k_handle](#331-k_handle) adec_hdl);
+
+#### 2.7.8 kd_mapi_adec_unbind_ao
+
+- 【描述】
+
+解绑定ao。
+
+- 【语法】
+
+k_s32 kd_mapi_adec_unbind_ao([k_handle](#331-k_handle) ao_hdl,[k_handle](#331-k_handle) adec_hdl);
+
+#### 2.7.9 kd_mapi_register_ext_audio_decoder
+
+- 【描述】
+
+注册外置解码器。
+
+- 【语法】
+
+k_s32 kd_mapi_register_ext_audio_decoder(const [k_adec_decoder](#329-k_adec_decoder) \*decoder,[k_handle](#331-k_handle) \* adecoder_hdl);
+
+#### 2.7.10 kd_mapi_unregister_ext_audio_decoder
+
+- 【描述】
+
+解注册外部音频解码器。
+
+- 【语法】
+
+k_s32 kd_mapi_unregister_ext_audio_decoder( [k_handle](#331-k_handle) adecoder_hdl);
+
+#### 2.7.11 kd_mapi_adec_send_stream
+
+- 【描述】
+
+发送音频解码音频帧。
+
+- 【语法】
+
+k_s32 kd_mapi_adec_send_stream([k_handle](#331-k_handle) ai_hdl,const [k_audio_stream](#327-k_audio_stream) \*stream);
+
+## 3. 数据类型
+
+### 3.1 音频输入输出
+
+音频输入输出相关数据类型、数据结构定义如下:
+
+- [k_audio_type](#311-k_audio_type):定义音频输入输出类型。
+- [k_audio_dev](#312-k_audio_dev):定义音频设备。
+- [k_ai_chn](#313-k_ai_chn):定义ai通道。
+- [k_ao_chn](#314-k_ao_chn):定义ao通道。
+- [K_MAX_AUDIO_FRAME_NUM](#315-k_max_audio_frame_num):定义最大音频解码缓存帧数。
+- [k_audio_bit_width](#316-k_audio_bit_width):定义音频采样精度。
+- [k_audio_snd_mode](#317-k_audio_snd_mode):定义音频声道模式。
+- [k_audio_pdm_oversample](#318-k_audio_pdm_oversample):定义pdm过采样。
+- [k_aio_dev_attr](#3112-k_aio_dev_attr):定义音频输入输出设备属性结构体。
+- [k_audio_pdm_attr](#319-k_audio_pdm_attr):定义pdm音频输入属性。
+- [k_i2s_work_mode](#3111-k_i2s_work_mode):定义i2s工作模式。
+- [k_audio_i2s_attr](#3110-k_audio_i2s_attr):定义i2s音频输入属性。
+- [k_aio_i2s_type](#3113-k_aio_i2s_type):定义i2s对接设备类型。
+- [k_audio_frame](#3114-k_audio_frame):定义音频帧结构体。
+- [k_audio_anr_cfg](#3115-k_audio_anr_cfg):定义音频语音降噪功能配置信息结构体。
+- [k_audio_agc_cfg](#3116-k_audio_agc_cfg):定义音频自动增益功能配置信息结构体。
+- [k_ai_vqe_cfg](#3117-k_ai_vqe_cfg):定义音频输入声音质量增强配置信息结构体。
+
+#### 3.1.1 k_audio_type
+
+【说明】
+
+定义音频输入输出类型。
+
+【定义】
+
+```c
+typedef enum {
+KD_AUDIO_INPUT_TYPE_I2S = 0,//i2s in
+KD_AUDIO_INPUT_TYPE_PDM = 1,//pdm in
+KD_AUDIO_OUTPUT_TYPE_I2S = 2,//i2s out
+} k_audio_type;
+```
+
+【注意事项】
+
+音频输入包括i2s和pdm两种,音频输出只有i2s。
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.2 k_audio_dev
+
+【说明】
+
+定义音频设备。
+
+【定义】
+
+**typedef k_u32 k_audio_dev;**
+
+【注意事项】
+
+ai模块,k_audio_dev取值为0和1,其中0为i2s音频输入,1为pdm音频输入。
+
+ao模块,k_audio_dev取值固定为0,即i2s音频输出。
+
+#### 3.1.3 k_ai_chn
+
+【说明】
+
+定义ai音频通道。
+
+【定义】
+
+**typedef k_u32 k_ai_chn;**
+
+【注意事项】
+
+I2s音频输入,共有2组,取值范围为`[0,1]`。
+
+pdm音频输入,共有4组,取值范围为`[0,3]`。
+
+#### 3.1.4 k_ao_chn
+
+【说明】
+
+定义ao音频通道。
+
+【定义】
+
+**typedef k_u32 k_ao_chn;**
+
+【注意事项】
+
+I2s音频输出,共有2组,取值范围为`[0,1]`。
+
+#### 3.1.5 K_MAX_AUDIO_FRAME_NUM
+
+【说明】
+
+定义最大音频解码缓存帧数。
+
+【定义】
+
+\#define K_MAX_AUDIO_FRAME_NUM 50
+
+#### 3.1.6 k_audio_bit_width
+
+【说明】
+
+- 定义音频采样精度。
+
+【定义】
+
+```c
+typedef enum {
+KD_AUDIO_BIT_WIDTH_16 = 0, /* 16bit width */
+KD_AUDIO_BIT_WIDTH_24 = 1, /* 24bit width */
+KD_AUDIO_BIT_WIDTH_32 = 2, /* 32bit width */
+} k_audio_bit_width;
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.7 k_audio_snd_mode
+
+【说明】
+
+- 定义声道模式。
+
+【定义】
+
+```c
+typedef enum {
+KD_AUDIO_SOUND_MODE_MONO = 0, /* mono */
+KD_AUDIO_SOUND_MODE_STEREO = 1, /* stereo */
+} k_audio_snd_mode;
+```
+
+#### 3.1.8 k_audio_pdm_oversample
+
+【说明】
+
+定义pdm过采样。
+
+【定义】
+
+```c
+typedef enum
+{
+KD_AUDIO_PDM_INPUT_OVERSAMPLE_32 = 0,
+KD_AUDIO_PDM_INPUT_OVERSAMPLE_64 ,
+KD_AUDIO_PDM_INPUT_OVERSAMPLE_128 ,
+} k_audio_pdm_oversample;
+```
+
+#### 3.1.9 k_audio_pdm_attr
+
+【说明】
+
+定义pdm音频输入属性。
+
+【定义】
+
+```c
+typedef struct {
+k_u32 chn_cnt; /* channle number on FS,i2s valid value:1/2,pdm valid value:1/2/3/4*/
+k_audio_sample_rate rate;
+k_audio_bit_width width;
+k_audio_snd_mode mode;
+k_audio_pdm_oversample oversample;
+k_u32 frame_num; /* frame num in buf[2,K_MAX_AUDIO_FRAME_NUM] */
+k_u32 point_num_per_frame;
+} k_audio_pdm_attr;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------------|-----------------------------------------------------|
+| chn_cnt | 支持的通道数目。 支持1-4个通道,通道使能需要连续。 |
+| sample_rate | 采样率:支持8k\~192k |
+| bit_width | 采样精度:支持16/24/32 |
+| snd_mode | 音频声道模式。支持单声道和双声道。 |
+| pdm_oversample | 过采样:支持32、64、128倍过采样。 |
+| frame_num | 缓存帧数目`[2,K_MAX_AUDIO_FRAME_NUM]`。 |
+| point_num_per_frame | 每帧的采样点个数。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.10 k_audio_i2s_attr
+
+【说明】
+
+定义i2s音频输入属性。
+
+【定义】
+
+```c
+typedef struct
+{
+k_u32 chn_cnt; /* channle number on FS,i2s valid value:1/2,pdm valid value:1/2/3/4 */
+k_u32 sample_rate; /* sample rate 8k ~192k */
+k_audio_bit_width bit_width;
+k_audio_snd_mode snd_mode; /* momo or stereo */
+k_i2s_work_mode i2s_mode; /*i2s work mode*/
+k_u32 frame_num; /* frame num in buf[2,K_MAX_AUDIO_FRAME_NUM] */
+k_u32 point_num_per_frame;
+k_aio_i2s_type type;
+} k_audio_i2s_attr;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+| ------------------- | ---------------------------------------------------- |
+| chn_cnt | 支持的通道数目。 支持1-2个通道。 |
+| sample_rate | 采样率:支持8k~192k |
+| bit_width | 采样精度:支持16/24/32 |
+| snd_mode | 音频声道模式。支持单声道和双声道。 |
+| I2s_mode | I2s工作模式:支持飞利浦模式,左对齐模式,右对齐模式。 |
+| frame_num | 缓存帧数目`[2,K_MAX_AUDIO_FRAME_NUM]`。 |
+| point_num_per_frame | 每帧的采样点个数`[sample_rate/100,sample_rate]`。 |
+| i2s_type | i2s对接设备类型:内置codec或外接设备。 |
+
+【注意事项】
+
+每帧的采样点个数point_num_per_frame和采样率sample_rate的取值决定了硬件产生
+
+中断的频率,频率过高会影响系统的性能,跟其他业务也会相互影响,建议这两个参
+
+数的取值满足算式:(point_num_per_frame *1000)/ sample_rate >=10(中断100次),比如在采样
+
+率为16000Hz时,建议设置采样点个数大于或者等于160。
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.11 k_i2s_work_mode
+
+【说明】
+
+定义i2s工作模式。
+
+【定义】
+
+```c
+typedef enum
+{
+K_STANDARD_MODE = 1,
+K_RIGHT_JUSTIFYING_MODE = 2,
+K_LEFT_JUSTIFYING_MODE = 4
+} k_i2s_work_mode;
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.12 k_aio_dev_attr
+
+【说明】
+
+定义音频输入输出设备属性结构体。
+
+【定义】
+
+```c
+typedef struct {
+k_audio_type type;
+union
+{
+k_audio_pdm_attr pdm_attr;
+k_audio_i2s_attr i2s_attr;
+} kd_audio_attr;
+} k_aio_dev_attr;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------|--------------|
+| audio_type | 音频类型。 |
+| kd_audio_attr | 音频属性设置 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.13 k_aio_i2s_type
+
+【说明】
+
+定义i2s对接设备类型。
+
+【定义】
+
+```c
+typedef enum
+{
+K_AIO_I2STYPE_INNERCODEC = 0, /* AIO I2S connect inner audio CODEC */
+K_AIO_I2STYPE_EXTERN,/* AIO I2S connect extern hardware */
+} k_aio_i2s_type;
+```
+
+【注意事项】
+
+内置audio codec固定使用第0组i2s 通路,第1组i2s通路仍使用外部codec。
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.14 k_audio_frame
+
+【说明】
+
+定义音频帧结构体。
+
+【定义】
+
+```c
+typedef struct {
+k_audio_bit_width bit_width;
+k_audio_snd_mode snd_mode;
+void* virt_addr;
+k_u64 phys_addr;
+k_u64 time_stamp; /* audio frame time stamp */
+k_u32 seq; /* audio frame seq */
+k_u32 len; /* data lenth per channel in frame */
+k_u32 pool_id;
+} k_audio_frame;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|------------|----------------------------|
+| bit_width | 采样精度。 |
+| snd_mode | 音频声道模式。 |
+| virt_addr | 音频帧数据虚拟地址。 |
+| phys_addr | 音频帧数据物理地址。 |
+| time_stamp | 音频帧时间戳,以μs为单位。 |
+| seq | 音频帧序号。 |
+| len | 音频帧长度,以byte为单位。 |
+| pool_id | 音频帧缓存池ID。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.15 k_audio_anr_cfg
+
+【说明】
+
+定义音频语音降噪功能配置信息结构体。
+
+【定义】
+
+```c
+typedef struct
+
+{
+k_bool anr_switch;
+} k_audio_anr_cfg;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|------------|------------------------|
+| anr_switch | 音频语音降噪功能使能。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.16 k_audio_agc_cfg
+
+【说明】
+
+定义音频自动增益功能配置信息结构体。
+
+【定义】
+
+```c
+typedef struct
+{
+k_bool agc_switch;
+} k_audio_agc_cfg;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|------------|------------------------|
+| agc_switch | 音频自动增益功能使能。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.1.17 k_ai_vqe_cfg
+
+【说明】
+
+定义音频输入声音质量增强配置信息结构体。
+
+【定义】
+
+typedef struct
+{
+k_audio_anr_cfg anr_cfg;
+k_audio_agc_cfg agc_cfg;
+} k_ai_vqe_cfg;
+
+【成员】
+
+| 成员名称 | 描述 |
+|----------|----------------------------|
+| anr_cfg | 音频语音降噪功能配置参数。 |
+| agc_cfg | 音频自动增益控制配置参数。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+### 3.2 音频编解码
+
+音频编解码相关数据类型、数据结构定义如下:
+
+[k_payload_type](#321-k_payload_type)
+
+[k_aenc_encoder](#322-k_aenc_encoder)
+
+[k_aenc_chn_attr](#323-k_aenc_chn_attr)
+
+[AENC_MAX_CHN_NUMS](#324-aenc_max_chn_nums)
+
+[K_MAX_ENCODER_NAME_LEN](#325-k_max_encoder_name_len)
+
+[k_aenc_chn](#326-k_aenc_chn)
+
+[k_audio_stream](#327-k_audio_stream)
+
+[k_adec_chn_attr](#328-k_adec_chn_attr)
+
+[k_adec_decoder](#329-k_adec_decoder)
+
+[K_MAX_DECODER_NAME_LEN](#3210-k_max_decoder_name_len)
+
+[ADEC_MAX_CHN_NUMS](#3211-adec_max_chn_nums)
+
+#### 3.2.1 k_payload_type
+
+【说明】
+
+定义音视频净荷类型枚举。
+
+【定义】
+
+```c
+typedef enum {
+K_PT_PCMU = 0,
+K_PT_1016 = 1,
+K_PT_G721 = 2,
+K_PT_GSM = 3,
+K_PT_G723 = 4,
+K_PT_DVI4_8K = 5,
+K_PT_DVI4_16K = 6,
+K_PT_LPC = 7,
+K_PT_PCMA = 8,
+K_PT_G722 = 9,
+K_PT_S16BE_STEREO = 10,
+K_PT_S16BE_MONO = 11,
+K_PT_QCELP = 12,
+K_PT_CN = 13,
+K_PT_MPEGAUDIO = 14,
+K_PT_G728 = 15,
+K_PT_DVI4_3 = 16,
+K_PT_DVI4_4 = 17,
+K_PT_G729 = 18,
+K_PT_G711A = 19,
+K_PT_G711U = 20,
+K_PT_G726 = 21,
+K_PT_G729A = 22,
+K_PT_LPCM = 23,
+K_PT_CelB = 25,
+K_PT_JPEG = 26,
+K_PT_CUSM = 27,
+K_PT_NV = 28,
+K_PT_PICW = 29,
+K_PT_CPV = 30,
+K_PT_H261 = 31,
+K_PT_MPEGVIDEO = 32,
+K_PT_MPEG2TS = 33,
+K_PT_H263 = 34,
+K_PT_SPEG = 35,
+K_PT_MPEG2VIDEO = 36,
+K_PT_AAC = 37,
+K_PT_WMA9STD = 38,
+K_PT_HEAAC = 39,
+K_PT_PCM_VOICE = 40,
+K_PT_PCM_AUDIO = 41,
+K_PT_MP3 = 43,
+K_PT_ADPCMA = 49,
+K_PT_AEC = 50,
+K_PT_X_LD = 95,
+K_PT_H264 = 96,
+K_PT_D_GSM_HR = 200,
+K_PT_D_GSM_EFR = 201,
+K_PT_D_L8 = 202,
+K_PT_D_RED = 203,
+K_PT_D_VDVI = 204,
+K_PT_D_BT656 = 220,
+K_PT_D_H263_1998 = 221,
+K_PT_D_MP1S = 222,
+K_PT_D_MP2P = 223,
+K_PT_D_BMPEG = 224,
+K_PT_MP4VIDEO = 230,
+K_PT_MP4AUDIO = 237,
+K_PT_VC1 = 238,
+K_PT_JVC_ASF = 255,
+K_PT_D_AVI = 256,
+K_PT_DIVX3 = 257,
+K_PT_AVS = 258,
+K_PT_REAL8 = 259,
+K_PT_REAL9 = 260,
+K_PT_VP6 = 261,
+K_PT_VP6F = 262,
+K_PT_VP6A = 263,
+K_PT_SORENSON = 264,
+K_PT_H265 = 265,
+K_PT_VP8 = 266,
+K_PT_MVC = 267,
+K_PT_PNG = 268,
+K_PT_AMR = 1001,
+K_PT_MJPEG = 1002,
+K_PT_AMRWB = 1003,
+K_PT_PRORES = 1006,
+K_PT_OPUS = 1007,
+K_PT_BUTT
+} k_payload_type;
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.2 k_aenc_encoder
+
+【说明】
+
+定义编码器属性结构体。
+
+【定义】
+
+```c
+typedef struct {
+k_payload_type k_u32 max_frame_len;
+k_char name[K_MAX_ENCODER_NAME_LEN];
+k_s32 (func_open_encoder)(void encoder_attr,void *encoder);
+k_s32 (func_enc_frame)(void *encoder,const k_audio_frame *data,k_u8 *outbuf, k_u32 *out_len);
+k_s32 (*func_close_encoder)(void *encoder);
+} k_aenc_encoder;
+
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|--------------------|-------------------------|
+| type | 编码协议类型。 |
+| max_frame_len | 最大码流长度。 |
+| name | 编码器名称。 |
+| func_open_encoder | 打开编码器的函数指针。 |
+| func_enc_frame | 进行编码的函数指针。 |
+| func_close_encoder | 关闭编码器的函数指针。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.3 k_aenc_chn_attr
+
+【说明】
+
+定义编码器通道属性结构体。
+
+【定义】
+
+```c
+typedef struct {
+k_payload_type type;
+k_u32 point_num_per_frame;
+k_u32 buf_size; // buf size[2,K_MAX_AUDIO_FRAME_NUM]
+} k_aenc_chn_attr;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------------|---------------------------------------------------------------------------------------------------------|
+| type | 音频编码协议类型。 |
+| point_num_per_frame | 音频编码协议对应的帧长(编码时收到的音频帧长小于等 于该帧长都可以进行编码)。 |
+| buf_size | 音频编码缓存大小。 取值范围:`[2, K_MAX_AUDIO_FRAME_NUM]`,以帧为 单位。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.4 AENC_MAX_CHN_NUMS
+
+【说明】
+
+定义最大编码通道数。
+
+【定义】
+
+\#define AENC_MAX_CHN_NUMS 4
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.5 K_MAX_ENCODER_NAME_LEN
+
+【说明】
+
+定义音频编码器名称最大长度。
+
+【定义】
+
+\#define K_MAX_ENCODER_NAME_LEN 25
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.6 k_aenc_chn
+
+【说明】
+
+定义编码通道类型。
+
+【定义】
+
+typedef k_u32 k_aenc_chn;
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.7 k_audio_stream
+
+【说明】
+
+定义码流结构体。
+
+【定义】
+
+```c
+typedef struct {
+void *stream; /* the virtual address of stream */
+k_u64 phys_addr; /* the physics address of stream */
+k_u32 len; /* stream lenth, by bytes */
+k_u64 time_stamp; /* frame time stamp */
+k_u32 seq; /* frame seq, if stream is not a valid frame,seq is 0 */
+} k_audio_stream;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|------------|------------------------------|
+| stream | 音频码流数据指针 |
+| phys_addr | 音频码流的物理地址。 |
+| len | 音频码流长度。以byte为单位。 |
+| time_stamp | 音频码流时间戳。 |
+| seq | 音频码流序号。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.8 k_adec_chn_attr
+
+【说明】
+
+定义解码器通道属性结构体。
+
+【定义】
+
+```c
+typedef struct {
+k_payload_type payload_type;
+k_u32 point_num_per_frame;
+k_u32 buf_size; /* buf size[2~K_MAX_AUDIO_FRAME_NUM] */
+} k_adec_chn_attr;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------------|---------------------------------------------------------------------------------------------------------|
+| type | 音频解码协议类型。 |
+| point_num_per_frame | 音频解码协议对应的帧长 |
+| buf_size | 音频编码缓存大小。 取值范围:`[2, K_MAX_AUDIO_FRAME_NUM]`,以帧为 单位。 |
+
+【注意事项】
+
+音频解码的部分属性需要与输出设备属性相匹配,例如采样率、帧长(每帧采样
+
+点数目)等。
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.9 k_adec_decoder
+
+【说明】
+
+定义解码器属性结构体。
+
+【定义】
+
+```c
+typedef struct {
+k_payload_type payload_type;
+k_char name[K_MAX_DECODER_NAME_LEN];
+k_s32 (func_open_decoder)(void *decoder_attr, void **decoder);
+k_s32 (*func_dec_frame)(void *decoder, k_u8 **inbuf, k_s32 *left_byte, k_u16*outbuf, k_u32 *out_len, k_u32 *chns);
+k_s32 (*func_get_frame_info)(void *decoder, void *info);
+k_s32 (*func_close_decoder)(void *decoder);
+k_s32 (*func_reset_decoder)(void *decoder);
+} k_adec_decoder;
+```
+
+【成员】
+
+| 成员名称 | 描述 |
+|---------------------|-----------------------------------------|
+| type | 解码协议类型。 |
+| name | 解码器名称。 |
+| func_open_decoder | 打开解码器的函数指针。 |
+| func_get_frame_info | 获取音频帧信息的函数指针。 |
+| func_close_decoder | 关闭解码器的函数指针。 |
+| func_reset_decoder | 清空缓存buffer,复位解码器的函数指针。 |
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.10 K_MAX_DECODER_NAME_LEN
+
+【说明】
+
+定义音频解码器名称最大长度。
+
+【定义】
+
+\#define K_MAX_DECODER_NAME_LEN 25
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.11 ADEC_MAX_CHN_NUMS
+
+【说明】
+
+定义最大解码通道数。
+
+【定义】
+
+\#define ADEC_MAX_CHN_NUMS 4
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+#### 3.2.12 k_adec_chn
+
+【说明】
+
+定义解码通道类型。
+
+【定义】
+
+typedef k_u32 k_adec_chn;
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+### 3.3 MAPI
+
+音频mapi相关数据类型、数据结构定义如下
+
+[k_handle](#331-k_handle)
+
+#### 3.3.1 k_handle
+
+【说明】
+
+定义操作句柄。
+
+【定义】
+
+typedef k_u32 k_handle;
+
+【相关数据类型及接口】
+
+无
+
+## 4. 错误码
+
+### 4.1 音频输入API 错误码
+
+| 错误代码 | 宏定义 | 描述 |
+|----------|------------------------|-----------------------------|
+| | K_ERR_AI_INVALID_DEVID | 音频输入设备号无效 |
+| | K_ERR_AI_INVALID_CHNID | 音频输入通道号无效 |
+| | K_ERR_AI_ILLEGAL_PARAM | 音频输入参数设置无效 |
+| | K_ERR_AI_NOT_ENABLED | 音频输入设备或通道没有使 能 |
+| | K_ERR_AI_NULL_PTR | 输入参数空指针错误 |
+| | K_ERR_AI_NOT_CFG | 音频输入设备属性未设置 |
+| | K_ERR_AI_NOT_SUPPORT | 操作不支持 |
+| | K_ERR_AI_NOT_PERM | 操作不允许 |
+| | K_ERR_AI_NO_MEM | 分配内存失败 |
+| | K_ERR_AI_NO_BUF | 音频输入缓存不足 |
+| | K_ERR_AI_BUF_EMPTY | 音频输入缓存为空 |
+| | K_ERR_AI_BUF_FULL | 音频输入缓存为满 |
+| | K_ERR_AI_NOT_READY | 音频输入系统未初始化 |
+| | K_ERR_AI_BUSY | 音频输入系统忙 |
+
+### 4.2 音频输出API 错误码
+
+| 错误代码 | 宏定义 | 描述 |
+|----------|-------------------------|---------------------------|
+| | K_ERR_AO_INVALID_DEV_ID | 音频输出设备号无效 |
+| | K_ERR_AO_INVALID_CHN_ID | 音频输出通道号无效 |
+| | K_ERR_AO_ILLEGAL_PARAM | 音频输出参数设置无效 |
+| | K_ERR_AO_NOT_ENABLED | 音频输出设备或通道没使能 |
+| | K_ERR_AO_NULL_PTR | 输出空指针错误 |
+| | K_ERR_AO_NOT_CFG | 音频输出设备属性未设置 |
+| | K_ERR_AO_NOT_SUPPORT | 操作不被支持 |
+| | K_ERR_AO_NOT_PERM | 操作不允许 |
+| | K_ERR_AO_NO_MEM | 系统内存不足 |
+| | K_ERR_AO_NO_BUF | 音频输出缓存不足 |
+| | K_ERR_AO_BUF_EMPTY | 音频输出缓存为空 |
+| | K_ERR_AO_BUF_FULL | 音频输出缓存为满 |
+| | K_ERR_AO_NOT_READY | 音频输出系统未初始化 |
+| | K_ERR_AO_BUSY | 音频输出系统忙 |
diff --git a/zh/01_software/board/mpp/images/01cabbb3d5c1dc60d0baa95a0f87104f.png b/zh/01_software/board/mpp/images/01cabbb3d5c1dc60d0baa95a0f87104f.png
new file mode 100644
index 0000000..cb04f48
Binary files /dev/null and b/zh/01_software/board/mpp/images/01cabbb3d5c1dc60d0baa95a0f87104f.png differ
diff --git a/zh/01_software/board/mpp/images/174b1b96f4a280ab5350f4ed5452d43f.png b/zh/01_software/board/mpp/images/174b1b96f4a280ab5350f4ed5452d43f.png
new file mode 100644
index 0000000..3b1f82c
Binary files /dev/null and b/zh/01_software/board/mpp/images/174b1b96f4a280ab5350f4ed5452d43f.png differ
diff --git a/zh/01_software/board/mpp/images/22628c5b4acf510370e51188734fe172.png b/zh/01_software/board/mpp/images/22628c5b4acf510370e51188734fe172.png
new file mode 100644
index 0000000..31e715b
Binary files /dev/null and b/zh/01_software/board/mpp/images/22628c5b4acf510370e51188734fe172.png differ
diff --git a/zh/01_software/board/mpp/images/250b6c36cbd4447bd8c734548fc3b890.png b/zh/01_software/board/mpp/images/250b6c36cbd4447bd8c734548fc3b890.png
new file mode 100644
index 0000000..7335a66
Binary files /dev/null and b/zh/01_software/board/mpp/images/250b6c36cbd4447bd8c734548fc3b890.png differ
diff --git a/zh/01_software/board/mpp/images/25246d8f3ff85d6e9b1de1b03369fbb3.png b/zh/01_software/board/mpp/images/25246d8f3ff85d6e9b1de1b03369fbb3.png
new file mode 100644
index 0000000..39d28ca
Binary files /dev/null and b/zh/01_software/board/mpp/images/25246d8f3ff85d6e9b1de1b03369fbb3.png differ
diff --git a/zh/01_software/board/mpp/images/458c9a7b50ccf347bf7ed5e8c4c5b7a8.png b/zh/01_software/board/mpp/images/458c9a7b50ccf347bf7ed5e8c4c5b7a8.png
new file mode 100644
index 0000000..c02f8a9
Binary files /dev/null and b/zh/01_software/board/mpp/images/458c9a7b50ccf347bf7ed5e8c4c5b7a8.png differ
diff --git a/zh/01_software/board/mpp/images/4a233637850b4e84b5208317666c4314.png b/zh/01_software/board/mpp/images/4a233637850b4e84b5208317666c4314.png
new file mode 100644
index 0000000..2c36d21
Binary files /dev/null and b/zh/01_software/board/mpp/images/4a233637850b4e84b5208317666c4314.png differ
diff --git a/zh/01_software/board/mpp/images/4c6fbf213dcaf35f8d035d69fcc43750.png b/zh/01_software/board/mpp/images/4c6fbf213dcaf35f8d035d69fcc43750.png
new file mode 100644
index 0000000..c23f38e
Binary files /dev/null and b/zh/01_software/board/mpp/images/4c6fbf213dcaf35f8d035d69fcc43750.png differ
diff --git a/zh/01_software/board/mpp/images/507a7bd277508dc177ebb0c4cfb49b9e.png b/zh/01_software/board/mpp/images/507a7bd277508dc177ebb0c4cfb49b9e.png
new file mode 100644
index 0000000..537f8b0
Binary files /dev/null and b/zh/01_software/board/mpp/images/507a7bd277508dc177ebb0c4cfb49b9e.png differ
diff --git a/zh/01_software/board/mpp/images/5405a8e58a3314ae95f2d737dd0c01d9.png b/zh/01_software/board/mpp/images/5405a8e58a3314ae95f2d737dd0c01d9.png
new file mode 100644
index 0000000..3a98d83
Binary files /dev/null and b/zh/01_software/board/mpp/images/5405a8e58a3314ae95f2d737dd0c01d9.png differ
diff --git a/zh/01_software/board/mpp/images/5eb26853f9444bbda3a54cdb33688a12.png b/zh/01_software/board/mpp/images/5eb26853f9444bbda3a54cdb33688a12.png
new file mode 100644
index 0000000..9d96aa9
Binary files /dev/null and b/zh/01_software/board/mpp/images/5eb26853f9444bbda3a54cdb33688a12.png differ
diff --git a/zh/01_software/board/mpp/images/659e3d039a5c3c623b3ffd6fb24ee777.png b/zh/01_software/board/mpp/images/659e3d039a5c3c623b3ffd6fb24ee777.png
new file mode 100644
index 0000000..c0859e0
Binary files /dev/null and b/zh/01_software/board/mpp/images/659e3d039a5c3c623b3ffd6fb24ee777.png differ
diff --git a/zh/01_software/board/mpp/images/69dbfc0ef3144c90f5978f1019482030.png b/zh/01_software/board/mpp/images/69dbfc0ef3144c90f5978f1019482030.png
new file mode 100644
index 0000000..a3dde64
Binary files /dev/null and b/zh/01_software/board/mpp/images/69dbfc0ef3144c90f5978f1019482030.png differ
diff --git a/zh/01_software/board/mpp/images/745a46d8e083d93521d0c5233bdaccdd.png b/zh/01_software/board/mpp/images/745a46d8e083d93521d0c5233bdaccdd.png
new file mode 100644
index 0000000..1f488d0
Binary files /dev/null and b/zh/01_software/board/mpp/images/745a46d8e083d93521d0c5233bdaccdd.png differ
diff --git a/zh/01_software/board/mpp/images/8e1970bbd7ffb862547feaf8a59cab48.png b/zh/01_software/board/mpp/images/8e1970bbd7ffb862547feaf8a59cab48.png
new file mode 100644
index 0000000..d99e373
Binary files /dev/null and b/zh/01_software/board/mpp/images/8e1970bbd7ffb862547feaf8a59cab48.png differ
diff --git a/zh/01_software/board/mpp/images/8ff8dac9c9f9b815001733e37e44e4cc.png b/zh/01_software/board/mpp/images/8ff8dac9c9f9b815001733e37e44e4cc.png
new file mode 100644
index 0000000..2369a34
Binary files /dev/null and b/zh/01_software/board/mpp/images/8ff8dac9c9f9b815001733e37e44e4cc.png differ
diff --git a/zh/01_software/board/mpp/images/95941399975cca1c16253927129d8e19.png b/zh/01_software/board/mpp/images/95941399975cca1c16253927129d8e19.png
new file mode 100644
index 0000000..f79638b
Binary files /dev/null and b/zh/01_software/board/mpp/images/95941399975cca1c16253927129d8e19.png differ
diff --git a/zh/01_software/board/mpp/images/9cd0c8d3bd975f1f19a5eec9b846d00b.png b/zh/01_software/board/mpp/images/9cd0c8d3bd975f1f19a5eec9b846d00b.png
new file mode 100644
index 0000000..0e56c24
Binary files /dev/null and b/zh/01_software/board/mpp/images/9cd0c8d3bd975f1f19a5eec9b846d00b.png differ
diff --git a/zh/01_software/board/mpp/images/9f7f41ea96a97ae9bf514535f6af1622.jpeg b/zh/01_software/board/mpp/images/9f7f41ea96a97ae9bf514535f6af1622.jpeg
new file mode 100644
index 0000000..d965eb5
Binary files /dev/null and b/zh/01_software/board/mpp/images/9f7f41ea96a97ae9bf514535f6af1622.jpeg differ
diff --git a/zh/01_software/board/mpp/images/b76dc39c5256a09c53be0e7572c2f587.png b/zh/01_software/board/mpp/images/b76dc39c5256a09c53be0e7572c2f587.png
new file mode 100644
index 0000000..3df7a4e
Binary files /dev/null and b/zh/01_software/board/mpp/images/b76dc39c5256a09c53be0e7572c2f587.png differ
diff --git a/zh/01_software/board/mpp/images/b85b814d3911bf8b3802ba97751ff941.png b/zh/01_software/board/mpp/images/b85b814d3911bf8b3802ba97751ff941.png
new file mode 100644
index 0000000..4704df5
Binary files /dev/null and b/zh/01_software/board/mpp/images/b85b814d3911bf8b3802ba97751ff941.png differ
diff --git a/zh/01_software/board/mpp/images/b96e2ea6fe9536e76af33afe46b2069e.png b/zh/01_software/board/mpp/images/b96e2ea6fe9536e76af33afe46b2069e.png
new file mode 100644
index 0000000..065bad0
Binary files /dev/null and b/zh/01_software/board/mpp/images/b96e2ea6fe9536e76af33afe46b2069e.png differ
diff --git a/zh/01_software/board/mpp/images/camera_sensor_arch.png b/zh/01_software/board/mpp/images/camera_sensor_arch.png
new file mode 100755
index 0000000..309a1d6
Binary files /dev/null and b/zh/01_software/board/mpp/images/camera_sensor_arch.png differ
diff --git a/zh/01_software/board/mpp/images/canaan-cover.png b/zh/01_software/board/mpp/images/canaan-cover.png
new file mode 100644
index 0000000..0319765
Binary files /dev/null and b/zh/01_software/board/mpp/images/canaan-cover.png differ
diff --git a/zh/01_software/board/mpp/images/cfd696fc1b6157fbf0220a4f1545a963.png b/zh/01_software/board/mpp/images/cfd696fc1b6157fbf0220a4f1545a963.png
new file mode 100644
index 0000000..6cd9636
Binary files /dev/null and b/zh/01_software/board/mpp/images/cfd696fc1b6157fbf0220a4f1545a963.png differ
diff --git a/zh/01_software/board/mpp/images/d71726ec1aa4be0868689b0b36beaa4f.png b/zh/01_software/board/mpp/images/d71726ec1aa4be0868689b0b36beaa4f.png
new file mode 100644
index 0000000..2af6e34
Binary files /dev/null and b/zh/01_software/board/mpp/images/d71726ec1aa4be0868689b0b36beaa4f.png differ
diff --git a/zh/01_software/board/mpp/images/d7197713d3821fdd3e5c0f2b10dfd5b1.png b/zh/01_software/board/mpp/images/d7197713d3821fdd3e5c0f2b10dfd5b1.png
new file mode 100644
index 0000000..216b6f7
Binary files /dev/null and b/zh/01_software/board/mpp/images/d7197713d3821fdd3e5c0f2b10dfd5b1.png differ
diff --git a/zh/01_software/board/mpp/images/d8ea12750bef3150afebf98c8a4563fd.jpeg b/zh/01_software/board/mpp/images/d8ea12750bef3150afebf98c8a4563fd.jpeg
new file mode 100644
index 0000000..0b8d93c
Binary files /dev/null and b/zh/01_software/board/mpp/images/d8ea12750bef3150afebf98c8a4563fd.jpeg differ
diff --git a/zh/01_software/board/mpp/images/dca3cfa887a526c493abced31b59afd2.png b/zh/01_software/board/mpp/images/dca3cfa887a526c493abced31b59afd2.png
new file mode 100644
index 0000000..bb8f917
Binary files /dev/null and b/zh/01_software/board/mpp/images/dca3cfa887a526c493abced31b59afd2.png differ
diff --git a/zh/01_software/board/mpp/images/e0df5cfd79b26cd1c688cb8f82000188.png b/zh/01_software/board/mpp/images/e0df5cfd79b26cd1c688cb8f82000188.png
new file mode 100644
index 0000000..d258e48
Binary files /dev/null and b/zh/01_software/board/mpp/images/e0df5cfd79b26cd1c688cb8f82000188.png differ
diff --git a/zh/01_software/board/mpp/images/e20100e34c268ad615e69966cb28e5a6.png b/zh/01_software/board/mpp/images/e20100e34c268ad615e69966cb28e5a6.png
new file mode 100644
index 0000000..3273784
Binary files /dev/null and b/zh/01_software/board/mpp/images/e20100e34c268ad615e69966cb28e5a6.png differ
diff --git a/zh/01_software/board/mpp/images/e49f8a05613f3b2524e3dc075009146e.jpeg b/zh/01_software/board/mpp/images/e49f8a05613f3b2524e3dc075009146e.jpeg
new file mode 100644
index 0000000..76f56fa
Binary files /dev/null and b/zh/01_software/board/mpp/images/e49f8a05613f3b2524e3dc075009146e.jpeg differ
diff --git a/zh/01_software/board/mpp/images/e57bfe4e5657980663f22e7cdef1f182.jpeg b/zh/01_software/board/mpp/images/e57bfe4e5657980663f22e7cdef1f182.jpeg
new file mode 100644
index 0000000..edf81ef
Binary files /dev/null and b/zh/01_software/board/mpp/images/e57bfe4e5657980663f22e7cdef1f182.jpeg differ
diff --git a/zh/01_software/board/mpp/images/e99b3eec46b58875ae936ea4ab23d86b.png b/zh/01_software/board/mpp/images/e99b3eec46b58875ae936ea4ab23d86b.png
new file mode 100644
index 0000000..3806d29
Binary files /dev/null and b/zh/01_software/board/mpp/images/e99b3eec46b58875ae936ea4ab23d86b.png differ
diff --git a/zh/01_software/board/mpp/images/fb853b016887c1d58cc45f4507d9276c.png b/zh/01_software/board/mpp/images/fb853b016887c1d58cc45f4507d9276c.png
new file mode 100644
index 0000000..f5c14e0
Binary files /dev/null and b/zh/01_software/board/mpp/images/fb853b016887c1d58cc45f4507d9276c.png differ
diff --git a/zh/01_software/board/mpp/images/logo.png b/zh/01_software/board/mpp/images/logo.png
new file mode 100644
index 0000000..aa48558
Binary files /dev/null and b/zh/01_software/board/mpp/images/logo.png differ
diff --git a/zh/01_software/board/mpp/images/osd_formula.png b/zh/01_software/board/mpp/images/osd_formula.png
new file mode 100755
index 0000000..fc80238
Binary files /dev/null and b/zh/01_software/board/mpp/images/osd_formula.png differ
diff --git a/zh/01_software/board/mpp/images/sha256.png b/zh/01_software/board/mpp/images/sha256.png
new file mode 100755
index 0000000..601b89e
Binary files /dev/null and b/zh/01_software/board/mpp/images/sha256.png differ
diff --git "a/zh/01_software/board/osdrv/K230_DRM_API\345\217\202\350\200\203.md" "b/zh/01_software/board/osdrv/K230_DRM_API\345\217\202\350\200\203.md"
new file mode 100644
index 0000000..0f33b31
--- /dev/null
+++ "b/zh/01_software/board/osdrv/K230_DRM_API\345\217\202\350\200\203.md"
@@ -0,0 +1,425 @@
+# K230 DRM使用指南
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍DRM驱动及其用户态接口libdrm库
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| --- | --- |
+| DRM | Direct Rendering Manager |
+| KMS | Kernel Mode Setting
+| GEM | Graphics Execution Manager
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| --- | --- | --- | --- |
+| V1.0 | 初版 | 王权 | 2023/06/29 |
+
+## 1. DRM简介
+
+DRM是linux内核中负责与显卡交互的管理架构,用户程序可以很方便的利用DRM提供的API,实现显示控制、3D渲染、视频编解码、GPU计算等工作
+
+### 1.1 DRM架构特点
+
+DRM是当前Linux内核中主流的图形显示框架,相比于传统的FB架构,具有如下特点:
+
+1. DRM架构原生支持多图层合成,FB架构原生不支持多图层合成
+1. DRM架构原生支持VSYNC、DMA_BUF、Fence机制
+1. DRM架构统一管理渲染和显示驱动,让软件开发和维护更简单
+
+### 1.2 DRM架构组成
+
+从整体架构来说,DRM主要分成三个部分:
+
+- libdrm
+
+ libdrm会对底层接口进行封装,向用户态提供通用的API接口
+
+ libdrm内部还提供modetest程序,用于查询DRM设备的详细信息,同时还可以进行基本的显示测试
+- KMS
+
+ KMS表示内核模式设置,主要设置显示分辨率、颜色空间、刷新率以及显示buffer切换和多图层合成
+- GEM
+
+ 显存管理,负责显存分配和释放
+
+## 2. modetest使用说明
+
+modetest是由libdrm提供的测试程序,可以查询DRM设备的详细信息,同时还可以进行基本的显示测试
+
+### 2.1 查询K230 DRM详细信息
+
+具体指令如下所示:
+
+```sh
+[root@canaan ~ ]#modetest -M canaan-drm
+Encoders:
+id crtc type possible crtcs possible clones
+37 36 DSI 0x00000001 0x00000001
+
+Connectors:
+id encoder status name size (mm) modes encoders
+38 37 connected DSI-1 68x120 1 37
+ modes:
+ index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
+ #0 1080x1920 30.00 1080 1310 1330 1350 1920 1925 1931 1939 78529 flags: ; type: preferred, driver
+ props:
+ 1 EDID:
+ flags: immutable blob
+ blobs:
+
+ value:
+ 2 DPMS:
+ flags: enum
+ enums: On=0 Standby=1 Suspend=2 Off=3
+ value: 0
+ 5 link-status:
+ flags: enum
+ enums: Good=0 Bad=1
+ value: 0
+ 6 non-desktop:
+ flags: immutable range
+ values: 0 1
+ value: 0
+ 4 TILE:
+ flags: immutable blob
+ blobs:
+
+ value:
+
+CRTCs:
+id fb pos size
+36 0 (0,0) (1080x1920)
+ #0 1080x1920 30.00 1080 1310 1330 1350 1920 1925 1931 1939 78529 flags: ; type: preferred, driver
+ props:
+ 24 VRR_ENABLED:
+ flags: range
+ values: 0 1
+ value: 0
+ 28 GAMMA_LUT:
+ flags: blob
+ blobs:
+
+ value:
+ 29 GAMMA_LUT_SIZE:
+ flags: immutable range
+ values: 0 4294967295
+ value: 256
+
+Planes:
+id crtc fb CRTC x,y x,y gamma size possible crtcs
+31 0 0 0,0 0,0 0 0x00000001
+ formats: NV12 NV21 NV16 NV61
+ props:
+ 8 type:
+ flags: immutable enum
+ enums: Overlay=0 Primary=1 Cursor=2
+ value: 0
+32 0 0 0,0 0,0 0 0x00000001
+ formats: AR24 AR12 AR15 RG24 RG16
+ props:
+ 8 type:
+ flags: immutable enum
+ enums: Overlay=0 Primary=1 Cursor=2
+ value: 1
+33 0 0 0,0 0,0 0 0x00000001
+ formats: AR24 AR12 AR15 RG24 RG16
+ props:
+ 8 type:
+ flags: immutable enum
+ enums: Overlay=0 Primary=1 Cursor=2
+ value: 2
+34 0 0 0,0 0,0 0 0x00000001
+ formats: AR24 AR12 AR15 RG24 RG16
+ props:
+ 8 type:
+ flags: immutable enum
+ enums: Overlay=0 Primary=1 Cursor=2
+ value: 0
+35 0 0 0,0 0,0 0 0x00000001
+ formats: AR24 AR12 AR15 RG24 RG16
+ props:
+ 8 type:
+ flags: immutable enum
+ enums: Overlay=0 Primary=1 Cursor=2
+ value: 0
+
+Frame buffers:
+id size pitch
+
+[root@canaan ~ ]#
+
+```
+
+上述信息即K230 DRM详细信息,以下是简要说明:
+
+| 模块ID | 模块名称 | 模块说明 |
+| --- | --- | --- |
+| 37 | Encoder | 无 |
+| 38 | Connector | 无 |
+| 36 | CRTC | 分辨率支持:1080x1920 |
+| 31 | video图层 | 颜色空间支持:NV12、NV21、NV16、NV61 |
+| 32 | OSD图层 | 颜色空间支持:AR24、AR12、AR15、RG24、RG16 |
+| 33 | OSD图层 | 颜色空间支持:AR24、AR12、AR15、RG24、RG16 |
+| 34 | OSD图层 | 颜色空间支持:AR24、AR12、AR15、RG24、RG16 |
+| 35 | OSD图层 | 颜色空间支持:AR24、AR12、AR15、RG24、RG16 |
+
+AR24表示ARGB8888
+
+AR12表示ARGB4444
+
+AR15表示ARGB1555
+
+RG24表示RGB888
+
+RG16表示RGB565
+
+### 2.2 video图层输出smpte彩条,颜色空间为NV12
+
+具体指令如下所示:
+
+```sh
+modetest -M canaan-drm -D 0 -a -s 38@36:1080x1920-30 -P 31@36:1080x1920@NV12 -v -F smpte
+```
+
+下图所示为LCD显示内容:
+
+![显示内容](images/modetest_video_nv12_smpte.png)
+
+### 2.3 OSD图层输出tiles彩条,颜色空间为AR24,即ARGB8888
+
+具体指令如下
+
+```sh
+modetest -M canaan-drm -D 0 -a -s 38@36:1080x1920-30 -P 32@36:1080x1920@AR24 -v -F tiles
+```
+
+下图所示为LCD显示内容:
+
+![显示内容](images/modetest_osd_ar24_tiles.png)
+
+### 2.4 OSD图层输出tiles彩条,颜色空间为RG16,即RGB565
+
+具体指令如下所示:
+
+```sh
+modetest -M canaan-drm -D 0 -a -s 38@36:1080x1920-30 -P 32@36:1080x1920@RG16 -v -F tiles
+```
+
+下图所示为LCD显示内容:
+
+![显示内容](images/modetest_osd_rg16_tiles.png)
+
+## 3. DRM API介绍
+
+### 3.1 打开DRM设备
+
+```c
+ fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
+ if (fd < 0) {
+ fprintf(stderr, "open card0 error \n");
+ return -1;
+ }
+
+```
+
+### 3.2 检索DRM资源
+
+```c
+drmModeResPtr drmModeGetResources(int fd);
+
+typedef struct _drmModeRes {
+
+ int count_fbs;
+ uint32_t *fbs;
+
+ int count_crtcs;
+ uint32_t *crtcs;
+
+ int count_connectors;
+ uint32_t *connectors;
+
+ int count_encoders;
+ uint32_t *encoders;
+
+ uint32_t min_width, max_width;
+ uint32_t min_height, max_height;
+} drmModeRes, *drmModeResPtr;
+
+```
+
+代码调用实例如下:
+
+```c
+ res = drmModeGetResources(fd);
+ if (res == NULL) {
+ fprintf(stderr, "drmModeGetResources error \n");
+ return -1;
+ }
+ conn_id = res->connectors[0];
+ crtc_id = res->crtcs[0];
+
+```
+
+### 3.3 使能或者禁止DRM相关特性
+
+```c
+int drmSetClientCap(int fd, uint64_t capability, uint64_t value);
+```
+
+代码调用实例如下:
+
+```c
+ ret = drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+ if (ret) {
+ fprintf(stderr, "drmSetClientCap DRM_CLIENT_CAP_UNIVERSAL_PLANES error \n");
+ return -1;
+ }
+
+ ret = drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1);
+ if (ret) {
+ fprintf(stderr, "drmSetClientCap DRM_CLIENT_CAP_ATOMIC error \n");
+ return -1;
+ }
+```
+
+### 3.4 检索图层资源
+
+```c
+drmModePlaneResPtr drmModeGetPlaneResources(int fd);
+
+typedef struct _drmModePlaneRes {
+ uint32_t count_planes;
+ uint32_t *planes;
+} drmModePlaneRes, *drmModePlaneResPtr;
+
+```
+
+代码调用实例如下:
+
+```c
+ plane_res = drmModeGetPlaneResources(fd);
+ if (plane_res == NULL) {
+ fprintf(stderr, "drmModeGetPlaneResources error \n");
+ return -1;
+ }
+ plane_id = plane_res->planes[1];
+
+```
+
+K230 DRM中,图层对应关系如下所示:
+
+plane_res->planes[0] 表示Video层
+
+plane_res->planes[1] ~ plane_res->planes[4] 表示OSD层
+
+### 3.5 获得Connector
+
+```c
+drmModeConnectorPtr drmModeGetConnector(int fd, uint32_t connector_id);
+
+typedef struct _drmModeConnector {
+ uint32_t connector_id;
+ uint32_t encoder_id; /**< Encoder currently connected to */
+ uint32_t connector_type;
+ uint32_t connector_type_id;
+ drmModeConnection connection;
+ uint32_t mmWidth, mmHeight; /**< HxW in millimeters */
+ drmModeSubPixel subpixel;
+
+ int count_modes;
+ drmModeModeInfoPtr modes;
+
+ int count_props;
+ uint32_t *props; /**< List of property ids */
+ uint64_t *prop_values; /**< List of property values */
+
+ int count_encoders;
+ uint32_t *encoders; /**< List of encoder ids */
+} drmModeConnector, *drmModeConnectorPtr;
+
+```
+
+代码调用实例如下:
+
+```c
+ conn = drmModeGetConnector(fd, conn_id);
+ if (conn == NULL) {
+ fprintf(stderr, "drmModeGetConnector error \n");
+ return -1;
+ }
+
+```
+
+### 3.6 申请DRM DUMB缓冲区
+
+代码调用实例如下:
+
+```c
+ creq.width = 1080;
+ creq.height = 1920;
+ creq.bpp = 32;
+ creq.fourcc = DRM_FORMAT_ARGB8888;
+ ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
+ if (ret < 0) {
+ fprintf(stderr, "cannot create dumb buffer (%d): %m\n",
+ errno);
+ return -errno;
+ }
+
+```
+
+### 3.7 提交DRM请求
+
+代码调用实例如下:
+
+```c
+int drmModeAtomicCommit(int fd,
+ drmModeAtomicReqPtr req,
+ uint32_t flags,
+ void *user_data);
+
+```
+
+## 4. 注意事项
+
+1. K230 DRM开发测试依赖LCD屏幕
+
+1. K230 DRM内部各个模块ID并不是一成不变的,请根据各模块实际ID进行开发和测试
diff --git "a/zh/01_software/board/osdrv/K230_PMU_\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/zh/01_software/board/osdrv/K230_PMU_\344\275\277\347\224\250\346\214\207\345\215\227.md"
new file mode 100644
index 0000000..bc30adf
--- /dev/null
+++ "b/zh/01_software/board/osdrv/K230_PMU_\344\275\277\347\224\250\346\214\207\345\215\227.md"
@@ -0,0 +1,283 @@
+# K230 PMU使用指南
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要描述PMU模块具体使用方法及SDK配置编译方法,其中包括软硬件环境搭建,并对控制接口进行介绍。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| --- | --- |
+| PMU | Power Management Unit |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| --- | --- | --- | --- |
+| V1.0 | 初版 | 张涛 | 2023/05/19 |
+
+## 1. 功能介绍
+
+PMU模块提供了6个输入和2个输出端口,每个端口功能如下:
+
+1. INT0被默认用作开关机按键,支持长按开机、长按关机事件上报、超长按强制关机、电平或边沿事件上报,支持去抖动,两种长按时间可配
+1. INT1支持电平或边沿检测、边沿计数检测,均支持触发开机和上报事件,支持去抖动,边沿计数值可配(建议不要同时打开两种检测模式,边沿检测功能会被覆盖)
+1. INT2支持电平或边沿检测,支持触发开机和上报事件,支持去抖动
+1. INT3支持电平或边沿检测,支持触发开机和上报事件,支持去抖动
+1. INT4支持电平或边沿检测,支持触发开机和上报事件(建议使用边沿检测)
+1. INT5支持电平或边沿检测,支持触发开机和上报事件(建议使用边沿检测)
+1. OUTPUT0用于控制PMIC
+1. OUTPUT1暂未使用
+
+PMU模块还提供了64Byte的log存储功能,其中最后4Byte被驱动使用,剩余60Byte留给用户
+
+## 2. 用户控制
+
+用户可通过设备树和sysfs来控制PMU,系统启动时通过设备树来配置PMU,启动后用户还可通过sysfs动态配置PMU
+
+### 2.1 PMU设备树配置
+
+```c
+pmu: pmu@0x91000000 {
+ compatible = "kendryte, k230-pmu";
+ reg = <0x0 0x91000000 0x0 0xb0>;
+ interrupt-parent = <&intc>;
+ interrupts = <175>;
+ status = "disabled";
+ /*
+ int0 {
+ force-powerdown-value = <320000>;
+ power-event-value = <96000>;
+ debounce-value = <256>;
+ type = ;
+ wakeup;
+ event;
+ };
+ int1 {
+ debounce-value = <256>;
+ edge-cnt-type = ;
+ edge-cnt-value = <1>;
+ edge-cnt-wakeup;
+ edge-cnt-event;
+ type = ;
+ wakeup;
+ event;
+ };
+ int2 {
+ debounce-value = <256>;
+ type = ;
+ wakeup;
+ event;
+ };
+ int3 {
+ debounce-value = <256>;
+ type = ;
+ wakeup;
+ event;
+ };
+ int4 {
+ type = ;
+ wakeup;
+ event;
+ };
+ int5 {
+ type = ;
+ wakeup;
+ event;
+ };
+ rtc {
+ alarm-wakeup;
+ alarm-event;
+ tick-wakeup;
+ tick-event;
+ };
+ */
+};
+```
+
+主要字段含义:
+
+- `force-powerdown-value` 超长按强制关机时间
+- `power-event-value` 长按开机及长按关机事件时间
+- `debounce-value` 去抖动时间
+- `type` 检测类型,支持上升沿、下降沿、高电平、低电平
+- `wakeup` 使能开机唤醒红能
+- `event` 使能事件上报功能
+- `edge-cnt-type` 检测类型,支持上升沿、下降沿
+- `edge-cnt-value` 边沿计数值
+
+所有时间以(1/32768)秒为单位,例如327680代表10秒
+
+### 2.2 PMU文件控制
+
+PMU sysfs位于`/sys/devices/platform/soc/91000000.pmu`目录下,文件结构如下:
+
+```sh
+.
+|-- driver -> ../../../../bus/platform/drivers/k230-pmu
+|-- driver_override
+|-- int0
+| |-- debounce_value
+| |-- event
+| |-- force_powerdown_value
+| |-- power_event_value
+| |-- type
+| `-- wakeup
+|-- int1
+| |-- debounce_value
+| |-- edge_cnt_event
+| |-- edge_cnt_type
+| |-- edge_cnt_value
+| |-- edge_cnt_wakeup
+| |-- event
+| |-- type
+| `-- wakeup
+|-- int2
+| |-- debounce_value
+| |-- event
+| |-- type
+| `-- wakeup
+|-- int3
+| |-- debounce_value
+| |-- event
+| |-- type
+| `-- wakeup
+|-- int4
+| |-- event
+| |-- type
+| `-- wakeup
+|-- int5
+| |-- event
+| |-- type
+| `-- wakeup
+|-- modalias
+|-- of_node -> ../../../../firmware/devicetree/base/soc/pmu@0x91000000
+|-- pmu
+| |-- pmu_logs
+| |-- pmu_regs
+| |-- pmu_status
+| `-- wakeup_source
+|-- rtc
+| |-- alarm_event
+| |-- alarm_wakeup
+| |-- tick_event
+| `-- tick_wakeup
+|-- subsystem -> ../../../../bus/platform
+`-- uevent
+```
+
+主要文件功能:
+
+- `pmu/pmu_status` PMU状态(只读)
+ - `PMU_RESET` PMU被断电
+ - `SOC_FORCE_PD` SoC被强制断电
+ - `SOC_NORMAL_PD` SoC被正常断电
+ - `SOC_RESET` SoC被复位
+- `pmu/wakeup_source` 系统唤醒源(只读)
+ INT0,INT1,INT2,INT3,INT4,INT5,RTC_ALARM,RTC_TICK
+- `pmu/pmu_logs` 用户LOG文件(二进制文件,读写需要4字节对齐)
+- `pmu/pmu_regs` PMU调试(二进制文件,读写需要4字节对齐)
+- `int0/force_powerdown_value` 超长按强制关机时间
+- `int0/power_event_value` 长按开机及长按关机事件时间
+- `int1/edge_cnt_type` 检测类型,有效值"rising"、"falling"
+- `int1/edge_cnt_value` 边沿计数值
+- `*/debounce_value` 去抖动时间
+- `*/type` 检测类型,有效值"rising"、"falling"、"low"、"high"
+- `*/*wakeup` 开机唤醒,有效值"enabled"、"disabled"
+- `*/*event` 事件上报,有效值"enabled"、"disabled"
+
+例如使能INT1上升沿开机唤醒:
+
+```sh
+cd /sys/devices/platform/soc/91000000.pmu/int1
+echo rising > type
+echo enabled > wakeup
+```
+
+例如使能INT2下降沿事件上报:
+
+```sh
+cd /sys/devices/platform/soc/91000000.pmu/int2
+echo falling > type
+echo enabled > event
+```
+
+### 2.3 PMU事件上报
+
+PMU上报事件使用input子系统,上报事件码为`EV_KEY`,用户可在收到相应事件后进行业务处理。例如收到`KEY_POWER`键值,用户可以执行关机准备和调用`poweroff`命令关机
+
+可以使用`evtest`工具进行测试,事件表如下:
+| 动作 | 按键值 |
+| :-: | :-: |
+| INT0长按关机 | KEY_POWER |
+| INT0电平或边沿 | BTN_0 |
+| INT1电平或边沿或边沿计数 | BTN_1 |
+| INT2电平或边沿 | BTN_2 |
+| INT3电平或边沿 | BTN_3 |
+| INT4电平或边沿 | BTN_4 |
+| INT5电平或边沿 | BTN_5 |
+| RTC_ALARM | BTN_6 |
+| RTC_TICK | BTN_7 |
+
+### 2.4 PMU关机控制
+
+1. 使用`poweroff`命令关机
+1. 通过超长按INT0按键来强制关机(不推荐,除非系统宕机。*系统宕机后强制关机,会导致不能PMU唤醒*)
+
+## 3. 硬件连接
+
+使用PMU时需要按照以下方式设置EVB板
+
+1. 使用跳线帽连接J1接口的PIN13(OUT0)和PIN14(PW_EN),注意要断开PIN15(SYS_SW)和PIN16(PW_EN)
+1. 根据使用不同的唤醒源使用跳线连接PIN2(SYS_ON_OFF)与对应的PIN,这时按键K1可控制INT的状态,按下按键为高电平,松开为低电平
+ | 唤醒源 | PIN | 标签 |
+ | :-: | :-: | :-: |
+ | INT0 | 1 | INT0 |
+ | INT1 | 3 | INT1 |
+ | INT2 | 5 | INT2 |
+ | INT3 | 7 | INT3 |
+ | INT4 | 9 | INT4 |
+ | INT5 | 11 | INT5 |
+
+使用INT0用作唤醒源的连接示意图:
+![top_view](images/pmu_hw_top_view.jpg)
+![bottom_view](images/pmu_hw_bottom_view.jpg)
+
+## 4. 注意事项
+
+1. PMU模块在设备树中默认是未使能的,如果需要使用请在设备树中使能
+1. 使用PMU模块时一定要通过任意INT唤醒PMU模块,否则kernel初始化驱动时会卡死
diff --git "a/zh/01_software/board/osdrv/K230_SDK_IoT_WiFi_AiW4211LV10_\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/zh/01_software/board/osdrv/K230_SDK_IoT_WiFi_AiW4211LV10_\344\275\277\347\224\250\346\214\207\345\215\227.md"
new file mode 100755
index 0000000..89ffb15
--- /dev/null
+++ "b/zh/01_software/board/osdrv/K230_SDK_IoT_WiFi_AiW4211LV10_\344\275\277\347\224\250\346\214\207\345\215\227.md"
@@ -0,0 +1,530 @@
+# K230 SDK IoT WiFi AiW4211LV10使用指南
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要描述IoT WiFi AiW4211LV10具体使用方法及SDK配置编译方法,其中包括软硬件环境搭建,驱动加载及配置工具使用等信息,并对WiFi控制接口进行介绍。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|------|
+| | |
+| | |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|----------|--------|------------|
+| V1.0 | 初版 | 徐百坤 | 2023/04/24 |
+
+## 1. 功能介绍
+
+AiW4211LV10是一款低功耗IoT WiFi芯片,我司采用该芯片平台设计了一款AiW4211LV10开发板,该开发板可通过TF卡插槽接入K230 EVB板。K230 EVB加载AiW4211LV10驱动之后,可以生成wlan0无线网卡,实现网络数据通信。
+
+![WiFi子板](images/907ec0b9b9b7bafdd715a7e6a293fe33.jpeg)
+
+图1-1 AiW4211LV10开发板
+
+WiFi主要功能如图1-1所示:
+
+![WiFi功能框图](images/f09a29152cf3ccca9d2e2602a62f6d64.png)
+
+图1-1 WiFi功能框图
+
+WiFi主要功能简介:
+
+- 消息通信:WiFi接收并解析Host端发送的消息指令及指令参数,触发相应事件执行
+- 网络通信:网络数据透传
+- 参数配置:建立SoftAP,接收配置参数,并触发配置事件
+- 配置存取:管理配置数据形成的配置文件,存储在flash上
+- AP接入:接入指定AP,监控接入状态并进行相应处理
+- 保活链路:建立维护与远程服务器之间的保活链路
+- 休眠:设置软硬件环境,给Host下电(依据平台特性,K230自下电),WiFi进入休眠模式
+- IO唤醒:处理button或PIR唤醒信号,恢复软硬件环境,给Host上电
+- 网络唤醒:处理来自保活链路的唤醒数据包,恢复软硬件环境,给Host上电
+
+## 2. 模块依赖
+
+硬件上依赖AiW4211LV10开发板,依赖K230 EVB开发板。软件上依赖于K230 SDK。
+
+### 2.1 软件环境
+
+K230 SDK V0.5.1及后续版本。
+AiW4211LV10 SDK。
+
+### 2.2 硬件环境
+
+K230 EVB开发板设置emmc启动,空出TF卡插槽用于AiW4211LV10开发板接入。
+开发板硬件版本及跳线见表2-1:
+
+表2-1开发板版本
+
+| **开发板** | **硬件版本** | **设置** |
+|-------------|--------------|---------------------------------------------------------------------------|
+| K230 EVB | V1.1 | POWER BY BUTTON启动模式,跳线关系: 1.JUMPER J1 1----2 2.JUMPER J1 13--14 |
+| AiW4211LV10 | V1.1 | |
+
+K230 EVB开发板飞线到AiW4211LV10开发板排针,连接关系见表2-2:
+
+表2-2 飞线关系
+
+| | **Link1** | **Link2** | **Link3** | **Link4** | **Link5** | **Link6** | **Link7** |
+|-------------------|--------------|------------------------|--------------------|------------------|--------------|--------------|---------------|
+| **K230** **排针** | TP21 (5V) | J8.PIN9 (GPIO34) | J1.PIN9 (RTC_INT4) | J1.PIN14 (PW_EN) | | | |
+| **WiFi** **排针** | J6.PIN1 (5V) | J2.PIN3 (SDIO_INT_OUT) | J6.PIN3 (WH) | J2.PIN2 (GPIO2) | J2.PIN4 (TX) | J2.PIN5 (RX) | J2.PIN6 (GND) |
+| **TTL-USB** | | | | | RX | TX | GND |
+| **说明** | 5V供电线 | WiFi数据中断线 | WiFi唤醒K230中断线 | WiFi监控K230电平 | com口收发 | com口收发 | com口GND |
+
+连接说明:
+
+- TP21是5V电压测试点,需要焊接一个插针,如果K230 EVB版本为V1.0则需要连接到J5 PIN16
+- 如果使用不涉及WiFi唤醒K230 EVB则无需建立Link3
+- 如果WiFi配置成通过监控K230 core的电源状态进入休眠则建立Link4,否则不需要。
+- TTL-USB与WiFi的连线主要是为了观察WiFi的固件输出,无需要可以不连接
+- AiW4211LV10开发板排针说明见表2-3
+
+表2-3 WiFi开发板排针说明
+
+| **WIFI子板** **接口** | **信号定义** | **描述** | **电平** | **必要性** | **K230 USIP LP3 EVB** **接口** | |
+|-----------------------|--------------|-------------------|----------------------|------------|--------------------------------|-----------------------------|
+| J4 | 金手指 | SDIO_CLK/CMD/DATA | SDIO信号及GND | 3.3V | 必连 | TF卡槽 |
+| J6 | PIN1 | VDD_5V_WIFI | 供电输入_5V | POWER | 必连 | TP21(V1.1) 或J5.PIN16(V1.0) |
+| | PIN2 | GND | GND | GND | 预留 | |
+| | PIN3 | WIFI_WAKE_HOST | WIFI唤醒K230 | 1.8V | 功能信号 | J1.PIN9 |
+| | PIN4 | WIFI_UART0_TX | 串口TX,可连接K230 | 1.8V | 预留 | J8.PIN15,目前无连接需求 |
+| | PIN5 | WIFI_UART0_RX | 串口RX,可连接K230 | 1.8V | 预留 | J8.PIN13,目前无连接需求 |
+| | PIN6 | HOST_WAKE_WIFI | K230唤醒WIFI | 1.8V | 功能信号 | J8.PIN11, 目前无连接需求 |
+| J2 | PIN1 | WIFI_POWER_EN | WIFI使能,预留 | 3.3V | 预留 | |
+| | PIN2 | GPIO2 | 监控K230电平 | 3.3V | 功能信号 | J1.PIN14 |
+| | PIN3 | SDIO_INT_OUT | SDIO中断 | 1.8V | 功能信号 | J8.PIN9 |
+| | PIN4 | UART0_TXD | 调试串口TXD | 3.3V | 调试串口 | 连PC |
+| | PIN5 | UART0_RXD | 调试串口RXD | 3.3V | 调试串口 | 连PC |
+| | PIN6 | GND | GND | GND | 调试串口 | 连PC |
+| J3 | PIN1 | PIR_WAKE_HOST | PIR唤醒K230 | 1.8V | 可选 | J1.PIN待定 |
+| | PIN2 | GND | PIR供电,接PIR黑色线 | GND | \\ | \\ |
+| | PIN3 | PIR_WAKE_WiFi | PIR信号,接PIR棕色线 | 3.3V | \\ | \\ |
+| | PIN4 | VDD_3V3 | PIR供电,接PIR红色线 | POWER | \\ | \\ |
+
+## 3. 模块配置
+
+### 3.1 SDK目录结构
+
+WiFi SDK的目录结构如下:
+
+├── README.txt //简要编译及使用说明文档
+
+├── support //存放固件烧写工具BurnTool.exe,编译环境搭建说明文档及支持包
+
+├── toolchain //固件交叉编译工具链
+
+├── Makefile //编译入口Makefile,可实现一键编译
+
+├── SocChannel //WiFi驱动及配置工具源码
+
+├── AiW4211LV10 //WiFi固件源码
+
+编译驱动的工具链因与平台相关,故未放入SDK之中,如有需要请联系我们。
+
+### 3.2 定制化修改
+
+在WiFi SDK之中,为了便于固件的定制化,与硬件设计关联比较紧密的代码,需要公布且可由用户定制的SoftAP相关参数,以及自定义的被多个文件使用的全局变量等,被放置在canaan_private.h及canaan_private.c文件之中。重点项目说明见表3-1:
+
+表3-1 定制化重点项说明
+
+| **项目** | **说明** |
+|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|
+| CONFIG_WIFI_MONITOR_HOSTLEVEL | 使能该宏之后WiFi通过监控K230的电源状态引脚触发休眠,将忽略休眠指令 |
+| HOST_LLEVEL_TIME | 配合CONFIG_WIFI_MONITOR_HOSTLEVEL使用,电源状态引脚拉低持续HOST_LLEVEL_TIME时间将触发休眠,设置该时间是为了防抖及过滤冷启动的不稳定状态 |
+| LONG_PRESS_TIME | 长按WiFi开发板上的K4按键持续LONG_PRESS_TIME时间WiFi将建立SoftAP模式,用于配置AP接入。参考5.3.1。 |
+| TCP_SERVER_PORT | SoftAP建立之后,WiFi启动一个tcp socket server用于接收网络配置信息,TCP_SERVER_PORT是指定监听端口 |
+| g_softap_ipaddr | SoftAP的网关、掩码及ip |
+| g_softapcfg | SoftAP的热点名称及密码等 |
+| gpios_config\[\] g_gpios_config | WiFi GPIO配置表,与硬件设计相关,描述各功能GPIO的编号、功能名、方向、中断类型及触发方式和中断回调函数 |
+| kd_gpios_hoststanby | WiFi给Host下电接口,可根据平台特性实现,因K230自下电,此接口未操作任何IO |
+| kd_gpios_wakehost | WiFi给Host上电接口,可根据平台特性实现,针对K230平台,WiFi给K230 PMU发送了一个IO信号 |
+
+## 4. 固件编译
+
+### 4.1 编译环境
+
+固件编译环境搭建请参考文档《AiW4211V10/AiW4211LV10 SDK开发环境搭建 用户指南.pdf》,该文档存储于WiFi SDK的support目录。
+使用者也可以联系 成都爱旗科技有限公司() 索取相关资料。
+
+### 4.2 编译方法
+
+进入WiFi SDK源码目录执行指令make all和make install,编译得到WiFi固件、驱动、配置工具及通信接口共享库文件存储在顶层的out目录下:
+
+out/
+
+├── bin
+
+│ ├── aiw4211l_demo_allinone.bin
+
+│ ├── aiw4211lv10.ko
+
+│ ├── wifi.conf
+
+│ ├── iotwifi_link
+
+│ ├── iotwifi_cli
+
+│ └── k230_pwrdown
+
+├── inc
+
+│ ├── soc_msg.h
+
+│ └── hal_iotwifi_cli.h
+
+└── lib
+
+└── libhal_iotwifi.so
+
+也可以各部分独立编译:
+make firmware:编译WiFi固件aiw4211l_demo_allinone.bin
+make driver:编译WiFi驱动aiw4211lv10.ko
+make tools:编译配置工具和通信接口共享库,iotwifi_link、iotwifi_cli、libhal_iotwifi.so、k230_pwrdown
+
+备注:K230 SDK已经集成了WiFi驱动、配置工具和通信接口库,因此这些可以不编译
+
+## 5. 模块启动
+
+### 5.1 固件烧写
+
+使用WiFi SDK support目录 下的烧写工具BurnTool.exe,通过串口将固件aiw4211l_demo_allinone.bin烧写到AiW4211LV10开发板。
+
+烧写方法请参考文档《AiW4211V10/AiW4211LV10 BurnTool工具 使用指南.pdf》,该文档存储于WiFi SDK的support目录。
+
+使用者也可以联系 成都爱旗科技有限公司() 索取相关资料。
+
+图5-1展示的是单板快速烧写的示意图:
+
+![烧写3](images/9c1b166e281b6ae4532a24e3fb4ab544.png)
+
+图5-1 单板快速烧写
+
+step 1: 选择烧写COM口
+step 2: 通过“Setting”菜单项配置COM口参数
+step 3: 选择WiFi固件
+step 4: 点击“Connect”控件向WiFi开发板发起连接,WiFi开发板上电,工具log窗口可以看到ready to load ...,表示连接已经建立,可以开始烧写了
+step 5: 点击“Send file”控件开始烧写
+
+### 5.2 驱动加载
+
+参考2.2节内容配置硬件环境,长按K230 EVB板上K1按键上电启动,加载驱动:
+
+modprobe aiw4211lv10 或者 modprobe aiw4211lv10 mmc=1 gpio=34
+
+启动配置工具server端并置于后台运行:iotwifi_link &
+
+当前驱动支持传入mmc主控编号及用于中断检测的gpio编号,可以实现较为灵活的硬件配置,如果不传参则分别使用代码中规定的默认值1和34。iotwifi_link的功能角色类似于wpa_supplicant,它首先会将wlan0 up起来,然后从WiFi设备侧同步mac地址及ip地址到Host端。
+
+![驱动加载](images/78ce42062b1b3c4eea2724d722f587f5.png)
+
+图 5-2 驱动加载及iotwifi_link启动
+
+### 5.3 参数配置
+
+AiW4211LV10的接入AP、休眠等级、休眠周期、唤醒IO、tcp keepalive的目标server、保活参数等直接影响WiFi运行,且需要根据实际场景进行动态调整的参数,可以通过5.3.1和5.3.2节提供的方式方法进行传参配置。
+
+除非用户想要改变配置,否则每次启动之后无需重配。
+
+#### 5.3.1 通过网络配置AP接入
+
+AiW4211LV10开发板支持通过网络配置目标AP的名称、密码和加密方式这三个参数。配置AP接入的步骤如下:
+
+step 1: 准备一个路由器,并记录其热点名称、密码和加密方式信息
+step 2: AiW4211LV10开发板在固件烧写之后初次启动运行时,或者在已经完成配置的情况下长按板上K4按键3s,WiFi将启动SoftAP模式生成一个热点并建立一个基于TCP协议的socket server
+step 3: 将PC连入该热点,然后启动NetAssist
+step 4: 配置NetAssist作为 tcp socket client连接到WiFi
+step 5: server解析配置数据后连接到指定AP,退出SoftAP模式
+
+使用者如有能力可以开发一个手机APP进行网络配置,这里为简单起见只是使用了PC+NetAssist方案。SoftAP参数及配置数据格式见表5-1,NetAssist配置运行见图5-1:
+
+表 5-1 SoftAP参数及配置数据格式
+
+| **项目** | **参数** |
+|-------------|---------------------------------------------------------------------------------------------------|
+| AP name | k230 |
+| AP password | 12345678 |
+| server ip | 192.168.43.1 |
+| server port | 35556 |
+| config data | cfg=\,\,\ 例如:cfg=xuyuxuan,2,Xuyuxuan123 |
+
+![softAP接入](images/da2c89ea92bffca6b1dd4d9b09efd855.png)
+
+图 5-3 NetAssist配置运行
+
+#### 5.3.2 通过消息配置AP接入
+
+AiW4211LV10开发板支持通过消息通道配置目标AP参数(与5.3.1功能相同),除此之外还可以通过消息通道配置WiFi休眠参数和tcp keepalive参数。消息通道是K230与AiW4211LV10之间通过SDIO总线建立起来的软件通道。
+
+##### 5.3.2.1 通过配置工具配置
+
+配置步骤如下:
+
+step 1: 准备一个路由器并启动热点
+step 2: 将PC接入该热点,然后启动NetAssist,这里为简单起见使用PC+NetAssist作为远端保活服务器
+step 3: 配置NetAssist作为 tcp socket server等待WiFi保活链路的接入
+step 4: K230端根据热点信息和NetAssist启动的server信息编辑配置文件/etc/wifi.conf
+step 5: 运行配置工具client端,解析配置文件,发送配置消息:iotwifi_cli --config /etc/wifi.conf
+step 6: AiW4211LV10接收到配置参数之后,首先存储休眠参数,然后接入指定AP,最后建立tcp socket client连入NetAssist建立的 tcp socket server
+
+/etc/wifi.conf是WiFi工作参数配置文件,以json格式编写,基本上是对[wifi_config_t](#6121-wifi_config_t)结构体的映射,具体可参考6.1.2章节。文件内容如下:
+
+```c
+{
+"sleep": {
+"level": 2,
+"period": 3000,
+"wake_gpios": [5]
+},
+"conn": {
+"ssid": "xuyuxuan",
+"auth": 2,
+"key": "Xuyuxuan123",
+"bssid": "",
+"pairwise": 0
+},
+"keepalive": {
+"svrip": "192.168.50.197",
+"svrport": 5001,
+"time": 10,
+"intvl": 2,
+"probes": 5,
+"hrintvl": 60,
+"hrprobes": 5
+}
+}
+```
+
+备注: "wake_gpios": \[5\] 是一个数组项,当前数组只有一个元素5,表示WiFi可以被自身的gpio5唤醒,该IO对应按键K4,如果新添加唤醒源可以以逗号分隔追加。这取决于具体的硬件设计。
+
+![config](images/befd53872f5678c01b6a9680165bf4f0.png)
+
+图 5-4 (A)WiFi接入路由器并被分配IP (B)tcp keepalive server
+
+##### 5.3.2.2 通过调用API配置
+
+在实际的业务程序中,可以通过调用通信接口共享库libhal_iotwifi.so提供的API接口[kd_wifi_config](#6121-wifi_config_t)进行参数配置,API说明请参考6.1.1章节,配置步骤与5.3.2.1相同。
+
+5.3.2.1节当中介绍的工具iotwifi_cli也是通过调用该接口实现WiFi参数配置的。
+
+### 5.4 系统休眠
+
+#### 5.4.1 通过工具配置休眠
+
+运行配置工具client端发送休眠指令触发WiFi休眠:iotwifi_cli --dirsleep
+
+![enter sleep](images/a8681956288af97fa64d83522360b540.png)
+
+图 5-5 WiFi进入休眠log
+
+#### 5.4.2 通过调用API休眠
+
+在实际的业务程序中,可以通过调用通信接口共享库libhal_iotwifi.so提供的API接口[kd_wifi_sleep](#62-sleep接口)触发WiFi休眠,具体请参考6.2章节。
+
+工具iotwifi_cli也是通过调用该接口触发WiFi休眠的。
+
+#### 5.4.3 通过监控电平休眠
+
+K230 EVB可以实现自下电,下电之后K230 EVB开发板J1 PIN14(PW_EN)引脚的电平将会被拉低,WiFi也可以通过监控该引脚的电平触发休眠。该功能使用的前提是K230功耗管理功能正常,并在编译WiFi固件时使能宏 CONFIG_WIFI_MONITOR_HOSTLEVEL(默认不使能),使能该宏之后WiFi将忽略K230发送的sleep指令,仅依据引脚电平状态进行休眠。
+
+工具k230_pwrdown可以实现较为简单的K230 EVB双核自下电,它未做任何文件存储、状态检测等业务逻辑上的安全处理,因此只可以用于电平触发WiFi休眠的场景验证。该工具未集成到K230 SDK当中,因此需要拷贝到K230 EVB上执行:
+
+./k230_pwrdown
+
+### 5.5 系统唤醒
+
+#### 5.5.1 按键唤醒
+
+如果WiFi已进入休眠状态,短按AiW4211LV10开发板上的K4按键可唤醒WiFi,WiFi将给K230 EVB的PMU发送唤醒信号,如果此时K230 EVB处于5.4.3节配置的下电状态(非冷启动),其将被上电。
+
+![WiFi唤醒](images/e19ef72c437edd32f4e48ce8e8eb6552.png)
+
+图5-6 按键唤醒log
+
+#### 5.5.2 网络唤醒
+
+如果WiFi已进入休眠状态,NetAssist发送wakeup可唤醒WiFi,WiFi将给K230 EVB的PMU发送唤醒信号,如果此时K230 EVB处于5.4.3节配置的下电状态(非冷启动),其将被上电。
+
+![网络唤醒](images/c243ed2abdfa36f6d918274132ae3bff.png)
+
+图5-7 网络唤醒log
+
+## 6. API参考
+
+AiW4211LV10驱动加载后生成的无线网卡与一般WiFi网卡无异,因此网络通信功能无特殊API需要说明。
+除基本的网络通信外,K230与WiFi还存在两个消息通信接口,需要重点说明。
+
+### 6.1 config接口
+
+#### 6.1.1 API
+
+int kd_wifi_config([wifi_config_t](#6121-wifi_config_t) \*config)
+配置WiFi工作参数:
+
+- 配置目标AP的名称、密码、认证及加密方式
+- 配置WiFi休眠等级,苏醒周期以及可唤醒的gpio
+- 配置tcp keepalive时间参数等
+
+#### 6.1.2 数据结构
+
+##### 6.1.2.1 wifi_config_t
+
+```c
+typedef struct {
+unsigned int config_mask;
+#define CFG_MASK_SLEEP (1 << 0)
+#define CFG_MASK_CONNECT (1 << 1)
+#define CFG_MASK_KEEPALIVE (1 << 2)
+wifi_sleep_t sleep;
+wifi_connect_t conn;
+wifi_keepalive_t keepalive;
+} wifi_config_t;
+```
+
+表6-1 wifi_config_t结构体成员
+
+| config_mask | 配置目标项掩码,使能或屏蔽目标项,例如全部配置则:config_mask = CFG_MASK_SLEEP\|CFG_MASK_CONNECT\|CFG_MASK_KEEPALIVE CFG_MASK_SLEEP:配置休眠参数 CFG_MASK_CONNECT:配置AP连接参数 CFG_MASK_KEEPALIVE:配置tcp keepalive参数 |
+|--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [sleep](#6122-wifi_sleep_t) | 休眠参数 |
+| [conn](#6123-wifi_connect_t) | AP连接参数 |
+| [keepalive](#6124-wifi_keepalive_t) | tcp keepalive参数 |
+
+##### 6.1.2.2 wifi_sleep_t
+
+```c
+typedef struct
+{
+unsigned int level;
+#define WIFI_SLEEP_LIGHT 1
+#define WIFI_SLEEP_DEEP 2
+#define WIFI_SLEEP_ULTRA 3
+unsigned int period;
+union
+{
+/*
+* gpioX_wake: 0---disable, 1---enable
+*/
+struct {
+unsigned int gpio0_wake:1;
+unsigned int gpio1_wake:1;
+unsigned int gpio2_wake:1;
+unsigned int gpio3_wake:1;
+unsigned int gpio4_wake:1;
+unsigned int gpio5_wake:1;
+unsigned int gpio6_wake:1;
+unsigned int gpio7_wake:1;
+unsigned int gpio8_wake:1;
+unsigned int gpio9_wake:1;
+unsigned int gpio10_wake:1;
+unsigned int gpio11_wake:1;
+unsigned int gpio12_wake:1;
+unsigned int gpio13_wake:1;
+unsigned int gpio14_wake:1;
+};
+unsigned int wake_gpios;
+};
+} wifi_sleep_t;
+```
+
+表6-2 wifi_sleep_t结构体成员
+
+| level | 休眠等级 WIFI_SLEEP_LIGHT:浅睡 WIFI_SLEEP_DEEP:深睡,主要休眠模式 WIFI_SLEEP_ULTRA:超深睡,只有3/5/7/14号gpio可唤醒,目前不使用 |
+|------------|------------------------------------------------------------------------------------------------------------------------------------|
+| period | 苏醒周期,有效数值33\~\~4000ms。WiFi周期性从休眠态醒来,检测AP是否有发给自己的数据缓存 |
+| wake_gpios | enable或disable可唤醒WiFi的gpio(WiFi侧gpio) |
+
+##### 6.1.2.3 wifi_connect_t
+
+```c
+typedef struct
+{
+char ssid[EXT_WIFI_MAX_SSID_LEN + 1];
+ext_wifi_auth_mode auth;
+char key[EXT_WIFI_MAX_KEY_LEN + 1];
+unsigned char bssid[EXT_WIFI_MAC_LEN];
+ext_wifi_pairwise pairwise;
+} wifi_connect_t;
+```
+
+表6-3 wifi\_**connect**\_t结构体成员
+
+| ssid | AP名称 |
+|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| auth | 认证类型 EXT_WIFI_SECURITY_OPEN EXT_WIFI_SECURITY_WEP EXT_WIFI_SECURITY_WPA2PSK EXT_WIFI_SECURITY_WPAPSK_WPA2PSK_MIX EXT_WIFI_SECURITY_WPAPSK EXT_WIFI_SECURITY_WPA EXT_WIFI_SECURITY_WPA2 EXT_WIFI_SECURITY_SAE EXT_WIFI_SECURITY_WPA3_WPA2_PSK_MIX EXT_WIFI_SECURITY_UNKNOWN |
+| Key | AP密码 |
+| bssid | AP bssid,一般为AP mac地址 |
+| pairwise | 加密类型 EXT_WIFI_PARIWISE_UNKNOWN EXT_WIFI_PAIRWISE_AES EXT_WIFI_PAIRWISE_TKIP EXT_WIFI_PAIRWISE_TKIP_AES_MIX |
+
+##### 6.1.2.4 wifi_keepalive_t
+
+```c
+typedef struct
+{
+unsigned char svrip[16];
+unsigned short svrport;
+unsigned short tcp_keepalive_time;
+unsigned short tcp_keepalive_intvl;
+unsigned short tcp_keepalive_probes;
+unsigned short heartbeat_intvl;
+unsigned short heartbeat_probes;
+} wifi_keepalive_t;
+```
+
+表6-4 wifi_keepalive_t结构体成员
+
+| svrip | server端ip地址 |
+|----------------------|-------------------------------------------------------------------------|
+| svrport | server端端口号 |
+| tcp_keepalive_time | TCP层keepalive心跳包常规发送周期,秒 |
+| tcp_keepalive_intvl | TCP层keepalive心跳包无回应之后新的发送周期,秒 |
+| tcp_keepalive_probes | TCP层keepalive心跳包无回应计数超过该阈值之后,判断TCP连接异常,断开重连 |
+| heartbeat_intvl | 应用层心跳包发送周期,秒 |
+| heartbeat_probes | 应用层心跳包无回应计数超过该阈值之后,判断socket连接异常,断开重连 |
+
+### 6.2 sleep接口
+
+int kd_wifi_sleep(void)
+控制WiFi进入休眠,休眠相关参数在config API当中设置。
+
+## 7.wifi功能限制
+
+ AiW4211LV10芯片为单频wifi芯片,不支持ap和sta同时共存,当ap启动时固定在某一信道,再起sta的话sta会在不同的信道上扫描,此时ap就会断连。
+ 当通过sdio传入conf为错误配置时,AiW4211LV10会显示sta连接ap失败 串口打印 please reset conf,此时可通过iotwifi_cli传入新的正确的conf。
+ 当通过client传入sta错误配置时,wifi从ap会切换到sta模式,AiW4211LV10会显示sta连接ap失败 串口同样打印please reset conf,由于sta与ap不能同时共存,这时wifi芯片会从sta切换到ap模式重新起tcp server ,sta需要重新连接ap,作为client重新接入。
diff --git "a/zh/01_software/board/osdrv/K230_SDK_IoT_WiFi_AiW4211LV10_\351\251\261\345\212\250\345\274\200\345\217\221\346\214\207\345\215\227.md" "b/zh/01_software/board/osdrv/K230_SDK_IoT_WiFi_AiW4211LV10_\351\251\261\345\212\250\345\274\200\345\217\221\346\214\207\345\215\227.md"
new file mode 100644
index 0000000..3f2499d
--- /dev/null
+++ "b/zh/01_software/board/osdrv/K230_SDK_IoT_WiFi_AiW4211LV10_\351\251\261\345\212\250\345\274\200\345\217\221\346\214\207\345\215\227.md"
@@ -0,0 +1,480 @@
+# K230 SDK IoT WiFi AiW4211LV10驱动开发指南
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要描述IoT WiFi AiW4211LV10驱动在K230 EVB平台上的开发方法,其中包括硬件环境搭建,模块编译配置方法,驱动加载及网络配置工具使用等信息,并对WiFi控制接口进行介绍。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|------|
+| | |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|--------------------------------------------------------------------------------------------------------|--------|------------|
+| V1.0 | 初版 | 徐百坤 | 2023/04/08 |
+| V1.1 | 修改2.2章节,WiFi子板硬件更新到V1.1,分线链接变化 修改3.2、3.3章节,修改sdio扫描接口调用方式为间接调用 | 徐百坤 | 2023/04/13 |
+
+## 1. 功能介绍
+
+AiW4211LV10是一款低功耗IoT WiFi芯片,我司采用该芯片平台设计了一款AiW4211LV10开发板,该开发板可插入K230 EVB板的TF卡插槽实现接入。K230 EVB加载AiW4211LV10驱动之后,可以生成wlan0无线网卡,实现网络数据通信。
+
+## 2. 模块依赖
+
+硬件上依赖AiW4211LV10开发板,依赖K230 EVB开发板,K230 EVB为WiFi提供电源及中断检测连线。
+
+软件上依赖于K230 SDIO主控驱动,依赖GPIO驱动的完备,需要emmc引导启动实现。
+
+### 2.1 操作系统
+
+当前驱动支持linux 4.9、linux 4.17和linux 5.10.4
+
+### 2.2 硬件环境
+
+K230 EVB开发板设置emmc启动,空出TF卡插槽用于AiW4211LV10开发板接入。
+
+K230 EVB开发板飞线到AiW4211LV10开发板排针。连接关系如下:
+
+表 2-1 飞线关系
+
+| | Link1 | Link2 | Link3 | Link4 | Link5 |
+|----------|---------------|------------------------|--------------|--------------|---------------|
+| K230排针 | J5 PIN16 (5V) | J8 PIN9 (GPIO34) | | | |
+| WiFi排针 | J6 PIN1 (5V) | J2 PIN3 (SDIO_INT_OUT) | J2 PIN4 (TX) | J2 PIN5 (RX) | J2 PIN6 (GND) |
+| TTL-USB | | | RX | TX | GND |
+
+备注:TTL-USB与WiFi的连线主要是为了观察WiFi的固件输出,可以不连接
+
+## 3. 模块配置
+
+### 3.1 设备树修改
+
+#### 3.1.1 配置引脚function
+
+修改uboot设备树arch/riscv/dts/k230_evb.dts,配置K230 EVB IO52引脚功能为GPIO,方向为input:
+
+```c
+&iomux {
+pinctrl-names = "default";
+pinctrl-0 = <&pins>;
+pins: iomux_pins {
+pinctrl-single,pins = <
+
+......
+
+(IO52) ( 0 <;
+#size-cells = <0>;
+compatible = "canaan,k230-apb-gpio";
+reg = <0x0 0x9140c000 0x0 0x1000>;
+interrupt-controller;
+interrupt-parent = <&intc>;
+#interrupt-cells = <2>;
+interrupts = <84 IRQ_TYPE_EDGE_RISING>;
+
+port52: gpio-controller@0 {
+gpio-controller;
+#gpio-cells = <2>;
+nr-gpios = <1>;
+reg-bank = <0>;
+id = <52>;
+};
+};
+};
+```
+
+#### 3.1.3 配置SDHCI1参数
+
+修改linux设备树arch/riscv/boot/dts/kendryte/k230_evb.dtsi,配置对应sdio主控参数:
+
+```c
+sdcard: sdhci1@91581000 {
+compatible = "snps,dwcmshc-sdhci";
+reg = <0x0 0x91581000 0x0 0x1000>;
+interrupt-parent = <&intc>;
+interrupts = <144>;
+interrupt-names = "sdhci1irq";
+clocks = <&dummy_sd>,<&dummy_sd>;
+clock-names = "core", "bus";
+max-frequency = <50000000>;
+bus-width = <4>;
+//cd-gpios = <>;
+no-1-8-v;
+cap-sd-highspeed;
+sdhci,auto-cmd12;
+status = "okay";
+};
+```
+
+### 3.2 内核配置项
+
+通过内核配置将AiW4211LV10驱动编译为内核模块,并将必要的协议及驱动编入内核。
+
+使能kprobes:
+
+```c
+> General architecture-dependent options
+
+|| [*] Kprobes
+
+将cfg80211编入内核,注意需要选中 cfg80211 wireless extensions compatibility:
+
+> Networking support > Wireless
+
+│ --- Wireless │ │
+
+│ │ <*> cfg80211 - wireless configuration API │ │
+
+│ │ [ ] nl80211 testmode command │ │
+
+│ │ [ ] enable developer warnings │ │
+
+│ │ [ ] cfg80211 certification onus │ │
+
+│ │ [*] enable powersave by default │ │
+
+│ │ [ ] cfg80211 DebugFS entries │ │
+
+│ │ [*] support CRDA │ │
+
+│ │ [*] cfg80211 wireless extensions compatibility │ │
+
+│ │ [ ] lib80211 debugging messages │ │
+
+│ │ < > Generic IEEE 802.11 Networking Stack (mac80211)
+```
+
+将AiW4211LV10驱动编译成内核模块,注意需要选中 IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP):
+
+```c
+> Device Drivers > Network device support > Wireless LAN
+
+│ --- Wireless LAN │ │
+
+│ │ [ ] mac80211-based legacy WDS support │ │
+
+│ │ [ ] ADMtek devices │ │
+
+│ │ [*] Aich devices │ │
+
+│ │ Aich AiW4211LV10 (SDIO) support │
+
+│ │ [ ] Atheros/Qualcomm devices │ │
+
+│ │ [ ] Atmel devices │ │
+
+│ │ [ ] Broadcom devices │ │
+
+│ │ [ ] Cisco devices │ │
+
+│ │ [ ] Intel devices │ │
+
+│ │ [*] Intersil devices │ │
+
+│ │ <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)
+
+│ │ [ ] Support downloading firmware images with Host AP driver │ │
+
+│ │ [ ] Marvell devices │ │
+
+│ │ [ ] MediaTek devices │ │
+
+│ │ [ ] Microchip devices
+```
+
+### 3.3 SDIO主控增加扫描接口
+
+AiW4211LV10驱动需要依据WiFi所接入的槽位发起SDIO扫描,因此特封装plat_sdio_rescan接口函数。修改drivers/mmc/host/sdhci-of-dwcmshc.c文件如下:
+
+```c
+static unsigned int slot_index = 0;
+static struct mmc_host \*__mmc__host[3] = {NULL};
+int plat_sdio_rescan(int slot)
+{
+struct mmc_host \*mmc = \__mmc__host[slot];
+if (mmc == NULL) {
+pr_err("invalid mmc, please check the argument\\n");
+return -EINVAL;
+}
+
+mmc_detect_change(mmc, 0);
+return 0;
+}
+
+static int dwcmshc_probe(struct platform_device \*pdev)
+{
+
+......
+
+priv->bus_clk = devm_clk_get(&pdev-\>dev, "bus");
+if (!IS_ERR(priv->bus_clk))
+clk_prepare_enable(priv->bus_clk);
+__mmc__host[slot_index++] = host->mmc;
+err = mmc_of_parse(host->mmc);
+if (err)
+goto err_clk;
+
+......
+
+}
+```
+
+## 4. 模块编译
+
+在SDK顶层执行make linux,随内核一同编译,ko临时存储在output/k230_evb_defconfig/little/linux/drivers/net/wireless/aich/aiw4211lv10/目录。
+
+## 5. 模块启动
+
+### 5.1 WiFi固件
+
+在K230 SDK当中WiFi固件AiW4211L_demo_allinone.bin以二进制文件形式提供,如需源码请联系我们。
+
+固件存储路径:k230_sdk/src/little/utils/firmware/AiW4211L_demo_allinone.bin
+
+### 5.2 驱动加载
+
+在硬件环境配置完成后上电启动,执行以下指令即可实现驱动加载:
+
+modprobe aiw4211lv10 或者 modprobe aiw4211lv10 mmc=1 gpio=52
+
+当前驱动支持传入mmc主控编号及用于中断检测的gpio编号,可以实现较为灵活的硬件配置,如果不传参则分别使用代码中规定的默认值1和52。
+
+驱动加载完成后,使用ifconfig -a指令可以看到已经生成了无线网卡wlan0。
+
+### 5.3 网络配置
+
+启动配置工具server端并置于后台运行:iotwifi_link &
+
+该工具的功能角色类似于wpa_supplicant。iotwifi_link首先会将wlan0 up起来,然后从WiFi设备侧同步mac地址及ip地址到host端。
+
+运行配置工具client端,控制WiFi接入AP及设置其他参数:iotwifi_cli --config /etc/wifi.conf
+
+运行配置工具client端,控制WiFi进入深睡模式:iotwifi_cli --dirsleep
+
+/etc/wifi.conf是WiFi工作参数配置文件,以json格式编写,基本上是对wifi_config_t结构体的映射,具体可参考6.1.2章节。
+
+## 6. API参考
+
+AiW4211LV10驱动加载后生成的无线网卡与一般WiFi网卡无异,因此网络通信功能无特殊API需要说明。
+
+除基本的网络通信外,K230与WiFi还存在两个消息通信接口,需要重点说明。
+
+### 6.1 config接口
+
+#### 6.1.1 API
+
+int kd_wifi_config([wifi_config_t](#6121-wifi_config_t) \*config)
+
+配置WiFi工作参数:
+
+- 配置目标AP的名称、密码、认证及加密方式
+- 配置WiFi休眠等级,苏醒周期以及可唤醒的gpio
+- 配置tcp keepalive时间参数等
+
+#### 6.1.2 数据结构
+
+##### 6.1.2.1 wifi_config_t
+
+```c
+typedef struct {
+unsigned int config_mask;
+#define CFG_MASK_SLEEP (1 << 0)
+#define CFG_MASK_CONNECT (1 << 1)
+#define CFG_MASK_KEEPALIVE (1 << 2)
+wifi_sleep_t sleep;
+wifi_connect_t conn;
+wifi_keepalive_t keepalive;
+} wifi_config_t;
+```
+
+表 6-1 wifi_config_t结构体成员
+
+| 成员 | 说明 |
+|---------------------------------|---------|
+| config_mask | 配置目标项掩码,使能或屏蔽目标项,例如全部配置则:config_mask = CFG_MASK_SLEEP\|CFG_MASK_CONNECT\|CFG_MASK_KEEPALIVE; CFG_MASK_SLEEP:配置休眠参数,CFG_MASK_CONNECT:配置AP连接参数,CFG_MASK_KEEPALIVE:配置tcp keepalive参数 |
+| [sleep](#6122-wifi_sleep_t) | 休眠参数 |
+| [conn](#6123-wifi_connect_t) | AP连接参数|
+| [keepalive](#6124-wifi_keepalive_t) | tcp keepalive参数|
+
+#### 6.1.2.2 wifi_sleep_t
+
+```c
+typedef struct
+{
+unsigned int level;
+#define WIFI_SLEEP_LIGHT 1
+#define WIFI_SLEEP_DEEP 2
+#define WIFI_SLEEP_ULTRA 3
+unsigned int period;
+union
+{
+/*
+* gpioX_wake: 0---disable, 1---enable
+*/
+struct {
+unsigned int gpio0_wake:1;
+unsigned int gpio1_wake:1;
+unsigned int gpio2_wake:1;
+unsigned int gpio3_wake:1;
+unsigned int gpio4_wake:1;
+unsigned int gpio5_wake:1;
+unsigned int gpio6_wake:1;
+unsigned int gpio7_wake:1;
+unsigned int gpio8_wake:1;
+unsigned int gpio9_wake:1;
+unsigned int gpio10_wake:1;
+unsigned int gpio11_wake:1;
+unsigned int gpio12_wake:1;
+unsigned int gpio13_wake:1;
+unsigned int gpio14_wake:1;
+};
+unsigned int wake_gpios;
+};
+} wifi_sleep_t;
+```
+
+表 6-2 wifi_sleep_t结构体成员
+
+| 成员 | 说明 |
+|-------------|-------|
+| level | 休眠等级 WIFI_SLEEP_LIGHT:浅睡 WIFI_SLEEP_DEEP:深睡,主要休眠模式 WIFI_SLEEP_ULTRA:超深睡,只有3/5/7/14号gpio可唤醒,目前不使用 |
+| period | 苏醒周期,有效数值33\~\~4000ms。WiFi周期性从休眠态醒来,检测AP是否有发给自己的数据缓存 |
+| wake_gpios | enable或disable可唤醒WiFi的gpio(WiFi侧gpio)|
+
+#### 6.1.2.3 wifi_connect_t
+
+```c
+typedef struct
+{
+char ssid[EXT_WIFI_MAX_SSID_LEN + 1];
+ext_wifi_auth_mode auth;
+char key[EXT_WIFI_MAX_KEY_LEN + 1];
+unsigned char bssid[EXT_WIFI_MAC_LEN];
+ext_wifi_pairwise pairwise;
+} wifi_connect_t;
+```
+
+表 6-3 wifi\_**connect**\_t结构体成元
+
+| ssid | AP名称 |
+|----------|--------|
+| auth | 认证类型 EXT_WIFI_SECURITY_OPEN EXT_WIFI_SECURITY_WEP EXT_WIFI_SECURITY_WPA2PSK EXT_WIFI_SECURITY_WPAPSK_WPA2PSK_MIX EXT_WIFI_SECURITY_WPAPSK EXT_WIFI_SECURITY_WPA EXT_WIFI_SECURITY_WPA2 EXT_WIFI_SECURITY_SAE EXT_WIFI_SECURITY_WPA3_WPA2_PSK_MIX EXT_WIFI_SECURITY_UNKNOWN |
+| Key | AP密码 |
+| bssid | AP bssid,一般为AP mac地址 |
+| pairwise | 加密类型 EXT_WIFI_PARIWISE_UNKNOWN EXT_WIFI_PAIRWISE_AES EXT_WIFI_PAIRWISE_TKIP EXT_WIFI_PAIRWISE_TKIP_AES_MIX |
+
+#### 6.1.2.4 wifi_keepalive_t
+
+```c
+typedef struct
+{
+unsigned char svrip[16];
+unsigned short svrport;
+unsigned short tcp_keepalive_time;
+unsigned short tcp_keepalive_intvl;
+unsigned short tcp_keepalive_probes;
+unsigned short heartbeat_intvl;
+unsigned short heartbeat_probes;
+} wifi_keepalive_t;
+```
+
+表 6-4 wifi_keepalive_t结构体成员
+
+| svrip | server端ip地址 |
+|----------------------|-------------------------------------------------------------------------|
+| svrport | server端端口号 |
+| tcp_keepalive_time | TCP层keepalive心跳包常规发送周期,秒 |
+| tcp_keepalive_intvl | TCP层keepalive心跳包无回应之后新的发送周期,秒 |
+| tcp_keepalive_probes | TCP层keepalive心跳包无回应计数超过该阈值之后,判断TCP连接异常,断开重连 |
+| heartbeat_intvl | 应用层心跳包发送周期,秒 |
+| heartbeat_probes | 应用层心跳包无回应计数超过该阈值之后,判断socket连接异常,断开重连 |
+
+### 6.2 sleep接口
+
+int kd_wifi_sleep(void)
+
+控制WiFi进入休眠,休眠相关参数在config API当中设置。
+
+## 7. 基本性能测试
+
+### 7.1 吞吐量测试
+
+在办公室环境使用iperf进行网络吞吐量测试,PC通过网线接入AP,K230 EVB通过AiW4211LV10接入同一AP,分别在两端启动iperf工具,交叉测试上行及下行吞吐量。
+
+client:iperf -c xxx.xxx.xxx.xxx -i 2 -t 300
+
+server:iperf -s -i 2
+
+dual:iperf -c xxx.xxx.xxx.xxx -i 2 -t 300 -d
+
+表 7-1 TCP吞吐量粗测数据
+
+| WiFi ROLE | Bandwidth(Mbits/sec) |
+|-----------|----------------------|
+| client | 12.2 |
+| server | 20.3 |
+
+client:iperf -c xxx.xxx.xxx.xxx -i 2 -t 300 -u -b 25M
+
+server:iperf -s -i 2 -u
+
+表 7-2 UDP吞吐量粗测数据
+
+| WiFi ROLE | Bandwidth(Mbits/sec) | Jitter(ms) | Lost/Total Datagrams |
+|-----------|----------------------|------------|----------------------|
+| client | 17.8 | 1.341 | 1571/455457 (0.34%) |
+| server | 21.0 | 1.064 | 1/534990 (0.00019%) |
+
+## 7.2 文件传输测试
+
+分别在PC与K230 EVB端架设nginx服务器,并分别使用wget拉取544MB大文件,并校验拉取文件的MD5值,测试150次无异常。
diff --git "a/zh/01_software/board/osdrv/K230_\345\244\247\346\240\270\344\275\216\351\200\237\351\251\261\345\212\250_API\345\217\202\350\200\203.md" "b/zh/01_software/board/osdrv/K230_\345\244\247\346\240\270\344\275\216\351\200\237\351\251\261\345\212\250_API\345\217\202\350\200\203.md"
new file mode 100755
index 0000000..75d69ef
--- /dev/null
+++ "b/zh/01_software/board/osdrv/K230_\345\244\247\346\240\270\344\275\216\351\200\237\351\251\261\345\212\250_API\345\217\202\350\200\203.md"
@@ -0,0 +1,2821 @@
+# K230大核低速驱动API参考
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍 K230 大核RT-Smart上驱动软件设计,设计内容主要包括 UART、I2C、GPIO、Hard-lock、ADC、WDT、OTP、TS、PWM、RTC、TIMER等驱动在用户态和内核态的使用。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|-----------|---------------------------------------------|
+| UART | Universal Asynchronous Receiver/Transmitter |
+| I2C | Inter-Integrated Circuit |
+| GPIO | General-purpose input/output |
+| Hard-lock | 硬件互斥锁 |
+| ADC | analog-to_digital converter |
+| WDT | watchdog |
+| OTP | One-Time Programmable |
+| TS | Temperature Sensor |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|----------|------------|-------------------|
+| V1.0 | 初版 | 范俊涛 | 2023/4/26 |
+| V1.1 | 增加watchdog部分 | 范俊涛 | 2023/5/26 |
+| V1.2 | 增加OTP TS部分 | 范俊涛 | 2023/5/31 |
+| V1.3 | 增加pwm rtc timer部分 | 范俊涛 | 2023/6/29 |
+
+## 1 概述
+
+### 1.1 概述
+
+UART:
+
+通用异步收发器,该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信。
+
+I2C:
+
+由Philips公司(2006年迁移到NXP)在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。
+
+GPIO:
+
+(general porpose intput output)通用输入输出端口的简称。可以通过软件控制其输出和输入,通俗来说就是常用引脚,可以控制引脚的高低电平,对其进行读取或者写入。
+
+Hard-lock:
+
+嘉楠自研模块,用于同核不通进程间或异核之间对共享资源的互斥而实现的硬件互斥锁,可用于对共享资源的互斥使用。
+
+ADC:
+
+ADC 即模拟数字转换器(Analog-to-digital converter),是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。
+
+WDT:
+WDT 是watchdog的简称,本质上是一个定时器,软件程序需要每隔一段时间喂一次狗,如果WDT超时则可以产生一个中断信号或复位信号到CPU,由此通过软硬件结合的方式防止程序运行异常而不复位。
+
+OTP:
+OTP 主要用于存储安全敏感的机密信息,例如 bootrom 的固件信息、加解密密钥、签名信息以及用户自己定义的安全信息等。OTP 集成在安全模块 PUF 中,为整个 SoC 提供安全存储功能,保护根密钥和启动代码等关键数据不被攻击者破坏。大核侧 OTP 驱动主要提供读、写两种功能,可读区域为包括生产信息在内的 24Kbits 空间;写区域为 OTP 的最后 512 bytes 空间。
+
+TS:
+K230 TS(Temperature Sensor),自研温度传感器,采用 TSMC 12nm 工艺。TS 的应用场景是降频。大核侧 TS 驱动主要提供读功能,在读 TS 之前,首先需要配置 TS 寄存器使能信号、输出模式,然后才能读出芯片的结温。另外,TS 寄存器每 2.6s 读取一次芯片结温。
+
+PWM:是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。
+
+RTC:实时时钟可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒、星期等信息。
+
+TIMER(HWTIMER):通过内部计数器模块对内外部脉冲信号进行计数,可以工作在定时器模式和计数器模式。
+
+### 1.2 功能描述
+
+UART驱动结构如下图:
+
+![图形用户界面 描述已自动生成](images/4c13711677925f891f88c5f3451b1630.png)
+
+I2C驱动结构如下图:
+
+![图形用户界面, Teams 描述已自动生成](images/d57457f620fd3083c6a6da9f4da78a1e.png)
+
+GPIO驱动结构如下图:
+
+![图形用户界面, 应用程序 描述已自动生成](images/56a2648fb35340c3f3ab275da91b1247.png)
+
+Hard-lock驱动结构如下图:
+
+![图片包含 应用程序 描述已自动生成](images/8dab3c90fd04037c474ffe4dcb6ebcad.png)
+
+adc 驱动结构如下图:
+
+![图示 描述已自动生成](images/fd9ce5570d02a5a3248c036db4bf4ca2.png)
+
+将 adc 硬件抽象为一个设备,设备包含六个通道。支持采样电压范围为 0V\~1.8V,浮动范围为 5mv。
+
+WDT 驱动结构如下图:
+
+![wdt_driver_model](images/wdt_driver_model.png)
+
+OTP 驱动结构如下图:
+
+![otp](images/otp_rtt.png)
+
+TS 驱动结构如下图所示:
+
+![tsensor](images/ts_rtt.png)
+
+PWM 驱动结构如下图所示:
+
+![pwm](images/pwm-driver.png)
+
+RTC 驱动结构如下图所示:
+
+![rtc](images/rtc-driver.png)
+
+TIMER 驱动结构如下图所示:
+
+![timer](images/timer-driver.png)
+
+### 1.3 驱动API使用方法
+
+#### 1.3.1 UART
+
+##### 内核态程序使用uart
+
+1. 通过设备节点找到设备句柄。
+
+`uart_dev = rt_device_find(“uart”)`
+
+1. 以中断接收及轮询发送模式打开串口设备
+
+`rt_device_open(uart_dev, RT_DEVICE_FLAG_INT_RX)`
+
+1. 设置接收回调函数
+
+`rt_device_set_rx_indicate(uart_dev,call_back)`
+
+1. 发送字符串
+
+`rt_device_write(uart_dev, 0, str, (sizeof(str) - 1))`
+
+#### 1.3.2 I2C
+
+##### 内核态程序使用i2c
+
+1. 通过总线名找到总线句柄
+
+`i2c_bus = rt_i2c_bus_device_find(I2C_NAME)`
+
+1. 构建message
+
+```text
+struct rt_i2c_msg msgs
+msgs.addr = CHIP_ADDRESS;
+msgs.flags = RT_I2C_WR;
+msgs.buf = buf;
+msgs.len = 2;
+```
+
+1. 传输
+
+`rt_i2c_transfer(bus, &msgs, 1)`
+
+#### 1.3.3 GPIO
+
+##### 内核态程序使用gpio
+
+1. 包含头文件
+
+`#include "drv_gpio.h"`
+
+1. 设置关键输入输出模式
+
+`kd_pin_mode(LED_PIN_NUM1, GPIO_DM_OUTPUT)`
+`kd_pin_mode(KEY1_PIN_NUM, GPIO_DM_INPUT)`
+
+1. 设置高低电平
+
+`kd_pin_write(LED_PIN_NUM1, GPIO_PV_LOW)`
+`kd_pin_write(LED_PIN_NUM1, GPIO_PV_HIGH)`
+
+1. 读取电平
+
+`kd_pin_read(KEY1_PIN_NUM)`
+
+1. 设置中断方式,绑定中断函数
+
+`kd_pin_attach_irq(KEY1_PIN_NUM,GPIO_PE_FALLING, key_irq, RT_NULL)`
+
+1. 中断使能
+
+`kd_pin_irq_enable(KEY1_PIN_NUM, KD_GPIO_IRQ_ENABLE)`
+
+##### 用户态程序使用gpio(仅读写)
+
+1. 打开设备
+
+`gpio_fd = open("/dev/gpio", O_RDWR)`
+
+1. 配置输入输出模式
+
+`ioctl(fd, GPIO_DM_OUTPUT, &mode33)`
+
+1. 输出高低电平
+
+`ioctl(fd, GPIO_WRITE_HIGH, &mode33)`
+
+1. 读取电平
+
+`ioctl(fd, GPIO_READ_VALUE, &mode27)`
+
+#### 1.3.4 Hard-lock
+
+##### 内核态使用hard-lock
+
+1. 包含头文件
+
+`#include "drv_hardlock.h"`
+
+1. 申请使用锁
+
+`kd_request_lock(rt_uint32_t num)`
+
+1. 释放锁
+
+`kd_hardlock_unlock(rt_uint32_t num)`
+
+#### 1.3.5 ADC
+
+##### 1.3.5.1 用户态 msh 使用 adc
+
+用户通过 msh 来获取 adc 采样值的步骤如下:
+
+1. 在使用设备前,需要先查找设备是否存在,可以使用命令 adc probe 后面跟注册的 ADC 设备的名称。如下所示;
+
+`msh />adc probe adc`
+`probe adc success`
+
+1. 使能设备的某个通道可以使用命令 adc enable 后面跟通道号;
+
+`msh />adc enable 0`
+`adc channel 0 enables success`
+
+1. 读取 ADC 设备某个通道的数据可以使用命令 adc read 后面跟通道号;
+
+`msh />adc read 0`
+`adc channel 0 read value is 0x00000796`
+
+1. 关闭设备的某个通道可以使用命令 adc enable 后面跟通道号;
+
+`msh />adc disable 0`
+`adc channel 0 disable success`
+
+##### 1.3.5.2 用户态程序使用 adc
+
+用户态程序中获取 adc 采样值的步骤如下:
+
+1. rt_device_find 查找 adc 设备。如下所示:
+
+`rt_device_t adc_dev;`
+`adc_dev = rt_device_find("adc");`
+
+1. 通过设备句柄打开 adc 设备。如下所示:
+
+`ret = rt_device_open(adc_dev, RT_DEVICE_OFLAG_RDWR);`
+
+1. 通过设备句柄使能 adc 设备的某个通道。如下所示:
+
+```text
+uint32_t *p;
+uint32_t channel = 0;
+p = (uint32_t *)(intptr_t)channel;
+ret = rt_device_control(adc_dev, 0, (void *)p);
+```
+
+1. 通过设备句柄从 adc 读取数据。如下所示:
+
+```text
+uint32_t channel = 0;
+uint32_t reg_value;
+rt_device_read(adc_dev, channel, (void *)®_value, sizeof(unsigned int));
+```
+
+1. 当不再使用 adc 的某个通道时,通过设备句柄失能 adc 设备的某个通道;
+
+```text
+uint32_t *p;
+uint32_t channel = 0;
+p = (uint32_t *)(intptr_t)channel;
+ret = rt_device_control(adc_dev, 0, (void *)p);
+```
+
+##### 1.3.5.3 内核态程序使用 adc
+
+1. 查找 adc 设备
+
+应用程序根据 adc 设备名称获取设备句柄,进而可以操作 adc 设备,查找设备函数如下所示:
+
+`rt_device_t rt_device_find(const char* name);`
+
+1. 使能 adc 通道
+
+`rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel);`
+
+1. 读取 adc 通道采样值
+
+`rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel);`
+
+1. 关闭 adc 通道
+
+`rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel);`
+
+#### 1.3.6 WDT
+
+##### 1.3.6.1 用户态程序使用WDT
+
+1. 打开设备节点
+
+`open(WDT_DEVICE_NAME, O_RDWR);`
+
+1. 设置超时时间
+
+`ioctl(wdt_fd, CTRL_WDT_SET_TIMEOUT, &timeout);`
+
+1. 启动看门狗计时
+
+`ioctl(wdt_fd, CTRL_WDT_START, NULL);`
+
+1. 喂狗
+
+`ioctl(wdt_fd, CTRL_WDT_KEEPALIVE, NULL)`
+
+##### 1.3.6.2 内核态程序使用WDT
+
+1. 获取设备句柄
+
+`wdt_dev = rt_device_find(WDT_DEVICE_NAME);`
+
+1. 初始化设备
+
+`rt_device_init(wdt_dev);`
+
+1. 设置超时时间
+
+`rt_device_control(wdt_dev, KD_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);`
+
+1. 启动看门狗计时
+
+`rt_device_control(wdt_dev, KD_DEVICE_CTRL_WDT_START, RT_NULL);`
+
+1. 喂狗
+
+`rt_device_control(wdt_dev, KD_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);`
+
+#### 1.3.7 OTP
+
+大核侧 OTP 驱动可以支持被内核态其它驱动调用、用户态应用程序调用等场景,下面,将分别介绍这两种应用场景下 OTP 驱动的使用方法、注意事项。
+
+##### 1.3.7.1 用户态程序使用 OTP
+
+在 rt-smart 中,应用程序通过 I/O 设备管理接口来访问硬件设备,当实现对应的设备驱动之后,应用程序就可以访问该硬件。Rt-smart 用户层通过操作 `/dev/otp` 来访问 OTP 硬件,用户态应用程序使用 OTP 时,可以通过 open、read、write 等操作来访问 otp 设备。用户态应用程序使用 OTP 的具体操作如下:
+
+1. 添加头文件 `rtdevice.h`;
+1. 应用程序根据设备名称获取设备句柄;
+1. 获得设备句柄之后,应用程序可以打开设备;
+1. 初始化参数,包括偏移量、缓冲区、大小;
+1. 通过设备句柄和参数值从 OTP 设备中读取/写入数据;
+1. 利用设备句柄关闭设备。
+
+其中,snippet 代码如下所示:
+
+```c
+#include
+#include
+
+// 查找设备,获取句柄
+otp_dev = rt_device_find(“otp”);
+
+// 打开设备
+ret = rt_device_open(otp_dev, RT_DEVICE_OFLAG_RDWR);
+
+// 初始化读参数并从OTP空间读值,参数分别代表读取OTP的偏移量、要读取的字节长度、缓冲区
+uint32_t pos = 0x0;
+uint32_t size = 0xC00;
+uint32_t buffer[768] = {0};
+ret = rt_device_read(otp_dev, pos, (void *)buffer, size);
+
+
+// 初始化写参数并写入OTP空间,参数分别代表写入OTP的偏移量、写入的字节长度、要写入的值
+pos = 0x0;
+size = 0x4;
+buffer[0] = 0xff11ff11;
+ret = rt_device_write(otp_dev, pos, (void *)buffer, size);
+
+// 关闭设备
+rt_device_close(otp_dev);
+
+```
+
+##### 1.3.7.2 内核态程序使用 OTP
+
+在rt-smart中,内核态其它驱动程序想要读写 OTP 空间时,只需要调用 OTP 驱动提供的接口即可。具体的步骤如下所示:
+
+1. 添加头文件 `drv_otp.h`;
+1. 根据设备名称获取设备句柄;
+1. 初始化参数,包括偏移量、缓冲区、大小;
+1. 通过设备句柄和参数值从 OTP 设备中读取/写入数据;
+ - otp_device_read
+ - otp_device_write
+
+其中,snippet 代码如下所示:
+
+```c
+#include drv_otp.h
+
+// 获取句柄
+otp_dev = rt_device_find(“otp”);
+
+// 从(otp_read_base + 0x0)地址处读取0xC00字节的数据
+uint32_t pos = 0x0;
+uint32_t size = 0xC00;
+uint32_t buffer[768] = {0};
+ret = otp_device_read(otp_dev, pos, (void *)buf, size);
+
+// 向(otp_write_base + 0x0)地址处写 0xff11ff11
+pos = 0x0;
+size = 0x4;
+buffer[0] = 0xff11ff11;
+ret = otp_device_write(otp_dev, pos, (void *)buffer, size);
+
+```
+
+##### 1.3.7.3 注意事项
+
+在使用读写 API 的时候,需要注意以下几个关键点:
+
+- 危险操作:OTP 空间为一次可编程的区域,bit 位一旦由0写为1,便不能恢复;
+- 读写偏移量:读操作和写操作的基地址是不同的,OTP 区域的可读空间范围为`(otp_read_base + 0x0)~(otp_read_base + 0xc00)`,可写空间的长度为`(otp_write_base + 0x0)~(otp_write_base + 0x200)`;
+- 读写size:size 是4的倍数。
+
+#### 1.3.8 TS
+
+大核侧 TS 驱动可以支持被内核态其它驱动调用、用户态应用程序调用等场景,下面,将分别介绍这两种应用场景下 TS 驱动的使用方法、注意事项。
+
+##### 1.3.8.1 用户态程序使用 TS
+
+在 rt-smart 中,应用程序通过 I/O 设备管理接口来访问硬件设备,当实现对应的设备驱动之后,应用程序就可以访问该硬件。Rt-smart 用户层通过操作 `/dev/ts` 来访问 TS 硬件,用户态应用程序使用 TS 时,可以通过 `open`、`read`、`close` 等操作来访问 ts 设备。用户态应用程序使用 TS 的具体操作如下:
+
+1. 添加头文件 `rtdevice.h`;
+1. 应用程序根据设备名称获取设备句柄;
+1. 获得设备句柄之后,应用程序可以打开设备;
+1. 初始化参数,包括偏移量、缓冲区、大小;
+1. 通过设备句柄和参数值从 TS 设备中读取数据;
+1. 利用设备句柄关闭设备。
+
+其中,snippet 代码如下所示:
+
+```c
+#include
+#include
+
+// 查找设备,获取句柄
+ts_dev = rt_device_find(“ts”);
+
+// 打开设备
+ret = rt_device_open(ts_dev, RT_DEVICE_OFLAG_RDWR);
+
+// 初始化读参数并从TS设备中读值,参数分别代表读取TS的偏移量、要读取的字节长度、缓冲区
+uint32_t pos = 0x0;
+uint32_t size = 0x0;
+uint32_t buffer[1] = {0};
+ret = rt_device_read (ts_dev, pos, (void *)buffer, size);
+
+ts_val = *(uint32_t *)buffer;
+code = (double)(ts_val & 0xfff);
+
+usleep(2600000);
+
+if(ts_val >> 12)
+{
+ temp = (1e-10 * pow(code, 4) * 1.01472 - 1e-6 * pow(code, 3) * 1.10063 + 4.36150 * 1e-3 * pow(code, 2) - 7.10128 * code + 3565.87);
+
+ printf("ts_val: 0x%x, TS = %lf C\n", ts_val, temp);
+}
+
+// 关闭设备
+rt_device_close(ts_dev);
+
+```
+
+##### 1.3.8.2 内核态程序使用 TS
+
+在rt-smart中,内核态其它驱动程序想要读芯片结温时,只需要调用 TS 驱动提供的接口即可。具体的步骤如下所示:
+
+1. 添加头文件 `drv_ts.h`;
+1. 根据设备名称获取设备句柄;
+1. 初始化参数,包括偏移量、缓冲区、大小;
+1. 通过设备句柄和参数值从 TS 设备中读取温度数据;
+ - ts_device_read
+
+其中,snippet 代码如下所示:
+
+```c
+#include drv_ts.h
+
+// 查找设备,获取句柄
+ts_dev = rt_device_find(“ts”);
+
+// 初始化读参数并从TS设备中读值,参数分别代表读取TS的偏移量、要读取的字节长度、缓冲区
+uint32_t pos = 0x0;
+uint32_t size = 0x0;
+uint32_t buffer[1] = {0};
+ret = ts_device_read (ts_dev, pos, (void *)buffer, size);
+
+```
+
+##### 1.3.8.3 注意事项
+
+在调用API读TS温度的时候,需要注意以下几个关键点:
+
+- TS 驱动会读取 tsensor 寄存器,将寄存器的值返回,但是寄存器的值并不是真正的温度值,需要用数学公式做相应的转换,详细的公式信息如下:
+
+```c
+// code为读取TS寄存器的值保留12位得到的结果,temp为芯片结温
+code = ts_val & 0xfff;
+temp = (1e-10 * pow(code, 4) * 1.01472 - 1e-6 * pow(code, 3) * 1.10063 + 4.36150 * 1e-3 * pow(code, 2) - 7.10128 * code + 3565.87);
+
+```
+
+#### 1.3.9 PWM
+
+目前PWM驱动仅提供了从内核态的调用方法,使用方法如下:
+
+##### 1.3.9.1 内核态程序使用PWM
+
+```c
+pwm_demo:
+ pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
+ /* 设置PWM周期和脉冲宽度 */
+ period = 100000; /* PWM周期, 单位为纳秒ns */
+ pulse = 50000; /* PWM正脉冲宽度值, 单位为纳秒ns */
+ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL_2, period, pulse);
+ period = 100000;
+ pulse = 25000;
+ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL_3, period, pulse);
+ period = 100000;
+ pulse = 75000;
+ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL_4, period, pulse);
+ /* 使能设备,同一路pwm的不同channel仅需任意channel使能一次 */
+ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL_2);
+ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL_4);
+ sleep(10);
+ /* disable 时同理 */
+ rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL_2);
+ rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL_4);
+```
+
+##### 1.3.9.2 FinSH命令使用PWM
+
+```shell
+设置 PWM 设备的某个通道的周期和占空比
+msh />pwm_set pwm1 1 500000 5000
+
+使能 PWM 设备的某个通道
+msh />pwm_enable pwm1 1
+
+关闭 PWM 设备的某个通道
+msh />pwm_disable pwm1 1
+```
+
+##### 1.3.9.3 注意事项
+
+K230共有6个PWM通道,其中channel 0 ~ 2(pwm 0 ~ 2)同属一路PWM,channel 3 ~ 5(pwm 3 ~ 5)通属一路PWM,在同时使用多通道PWM时,同属一路的PWM,仅需任意使能其中一个channel即可。
+如 [1.3.9.1](#1391-内核态程序使用pwm) 中的示例,channel3和channel4仅使能了channel4,此时channel3也被使能。
+
+#### 1.3.10 RTC
+
+##### 1.3.10.1 内核态使用RTC
+
+RTC驱动提供了内核态的调用方法,使用方法如下:
+
+```c
+time_t now;
+rt_device_t device = RT_NULL;
+
+device = rt_device_find(RTC_NAME);
+rt_device_open(device, 0);
+set_date(2024, 1, 1); //设置日期
+set_time(12, 30, 0); //设置时间
+
+while(1)
+{
+ now = time(RT_NULL); //获取当前时间
+ rt_kprintf("%s\n", ctime(&now)); //打印
+ rt_thread_mdelay(1000);
+}
+```
+
+如果要使用K230 RTC的中断功能,请参考以下示例:
+
+```c
+void user_alarm_callback(void)
+{
+ rt_kprintf("[ user alarm callback function. ]\n");
+}
+
+void alarm_rtc()
+{
+ time_t now;
+ uint32_t i;
+ struct tm p_tm;
+ rt_device_t dev = RT_NULL;
+ struct rt_alarm * alarm = RT_NULL;
+ struct kd_alarm_setup setup;
+
+ dev = rt_device_find(RTC_NAME);
+ rt_device_open(dev, 0);
+ set_date(2024, 1, 1);
+ set_time(1, 1, 0);
+
+ now = time(RT_NULL);
+ gmtime_r(&now,&p_tm);
+ setup.flag = RTC_INT_TICK_SECOND; //秒级tick中断,每秒钟都会触发,请参考宏定义
+ setup.tm.tm_year = p_tm.tm_year;
+ setup.tm.tm_mon = p_tm.tm_mon;
+ setup.tm.tm_mday = p_tm.tm_mday;
+ setup.tm.tm_wday = p_tm.tm_wday;
+ setup.tm.tm_hour = p_tm.tm_hour;
+ setup.tm.tm_min = p_tm.tm_min;
+ setup.tm.tm_sec = p_tm.tm_sec;
+
+ rt_device_control(dev, RT_DEVICE_CTRL_RTC_SET_CALLBACK, &user_alarm_callback); //set rtc interrupt callback
+
+ rt_device_control(dev, RT_DEVICE_CTRL_RTC_SET_ALARM, &setup); //set alarm time
+
+ for (i=0; i<5; i++)
+ {
+ now = time(RT_NULL);
+ rt_kprintf("%s\n", ctime(&now));
+ rt_thread_mdelay(1000);
+ }
+ rt_device_control(dev, RT_DEVICE_CTRL_RTC_STOP_ALARM, RT_NULL); //close interrupt
+ rt_device_close(dev);
+}
+```
+
+##### 1.3.10.2 注意事项
+
+使用K230的RTC模块时,必须在芯片上电时激活PMU(请参考PMU相关文档),否则RTC无法工作。
+
+以 《K230-USIP-EVB-LP3-V1.1》为例,需要将J1区域的排针io13 io14连接后上电。
+
+K230的RTC支持两种中断模式:
+
+```text
+1、alarm中断(定时中断),在定时时间到时只产生一次中断。最大精度:秒
+
+2、tick中断(周期中断),如每秒钟,每分钟,每小时,每天等都会产生中断。最大精度:1/64秒
+```
+
+#### 1.3.11 TIMER
+
+##### 1.3.11.1 内核态使用TIMER
+
+TIMER驱动提供了内核态的调用方法,使用方法如下:
+
+```c
+static rt_err_t tmr_timeout_cb(rt_device_t dev, rt_size_t size)
+{
+ rt_kprintf("hwtimer timeout callback fucntion @tick\n");
+ return RT_EOK;
+}
+
+/* 以下示例代码略去了函数调用的错误检查,仅供参考。*/
+void test_hwtimer(void)
+{
+ rt_hwtimerval_t timerval;
+ rt_hwtimer_mode_t mode;
+ rt_size_t tsize;
+ rt_uint32_t freq = 25000000; /* 计数频率 可选 12.5M 25M 50M 100M*/
+
+ tmr_dev_0 = rt_device_find("hwtimer0");
+ tmr_dev_1 = rt_device_find("hwtimer1");
+
+ rt_device_open(tmr_dev_0, RT_DEVICE_OFLAG_RDWR);
+ rt_device_open(tmr_dev_1, RT_DEVICE_OFLAG_RDWR);
+
+ /* 将 freq 所表示的计数频率向timer设置 */
+ rt_device_control(tmr_dev_0, HWTIMER_CTRL_FREQ_SET, &freq)
+ /* freq 不设置则驱动使用默认的计数频率 */
+
+
+ /* 绑定中断回调函数 */
+ rt_device_set_rx_indicate(tmr_dev_0, tmr_timeout_cb);
+ rt_device_set_rx_indicate(tmr_dev_1, tmr_timeout_cb);
+
+ timerval.sec = 10;
+ timerval.usec = 0;
+ tsize = sizeof(timerval);
+ mode = HWTIMER_MODE_ONESHOT;
+
+ rt_device_control(tmr_dev_0, HWTIMER_CTRL_MODE_SET, &mode);
+
+ /* 将计数时间向timer设置 */
+ rt_device_write(tmr_dev_0, 0, &timerval, tsize);
+
+ timerval.sec = 5;
+ timerval.usec = 0;
+ tsize = sizeof(timerval);
+ mode = HWTIMER_MODE_ONESHOT;
+
+ rt_device_control(tmr_dev_1, HWTIMER_CTRL_MODE_SET, &mode);
+ rt_device_write(tmr_dev_1, 0, &timerval, tsize);
+
+ while(1)
+ {
+ /* 获取当前计数值 */
+ rt_device_read(tmr_dev_0, 0, &timerval, sizeof(timerval));
+ rt_kprintf("Read timer0: Sec = %d, Usec = %d\n", timerval.sec, timerval.usec);
+
+ rt_device_read(tmr_dev_1, 0, &timerval, sizeof(timerval));
+ rt_kprintf("Read timer1: Sec = %d, Usec = %d\n", timerval.sec, timerval.usec);
+
+ rt_thread_mdelay(1000);
+ }
+
+}
+```
+
+##### 1.3.11.2 注意事项
+
+设置freq计数频率时,只有12.5M 25M 50M 100M可供选择,不可设置其他数值,freq越大计数精度越高。
+
+## 2. API 参考
+
+### 2.1 内核态 API
+
+#### 2.1.1 UART
+
+UART模块提供以下API:
+
+- [rt_serial_init](#2111-rt_serial_init)
+- [rt_serial_open](#2112-rt_serial_open)
+- [rt_serial_close](#2113-rt_serial_close)
+- [rt_serial_read](#2114-rt_serial_read)
+- [rt_serial_write](#2115-rt_serial_write)
+- [rt_serial_control](#2116-rt_serial_control)
+
+##### 2.1.1.1 rt_serial_init
+
+【描述】
+
+初始化一个串口设备。
+
+【语法】
+
+`rt_serial_init(struct rt_device *dev)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------|-----------|
+| dev | 设备句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|------|
+| RT_EOK | 成功 |
+| 其他 | 失败 |
+
+##### 2.1.1.2 rt_serial_open
+
+【描述】
+
+打开一个串口设备。
+
+【语法】
+
+`rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-----------------------------------------------------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| oflag | `RT_DEVICE_FLAG_INT_RX RT_DEVICE_FLAG_DMA_RX` `RT_DEVICE_FLAG_INT_TX` `RT_DEVICE_FLAG_DMA_TX` | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|---------|------|
+| RT_EOK | 成功 |
+| -RT_EIO | 失败 |
+
+##### 2.1.1.3 rt_serial_close
+
+【描述】
+
+关闭一个串口设备。
+
+【语法】
+
+`rt_serial_close(struct rt_device *dev)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------|-----------|
+| dev | 设备句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|------|
+| RT_EOK | 成功 |
+| 其他 | 失败 |
+
+##### 2.1.1.4 rt_serial_read
+
+【描述】
+
+读取串口数据。
+
+【语法】
+
+`rt_serial_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| pos | 偏移,设0即可 | 输入 |
+| buffer | 用于装载数据的指针 | 输入 |
+| size | 要读取的大小 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|----------------|
+| rt_size_t | 读取到的字节数 |
+
+##### 2.1.1.5 rt_serial_write
+
+【描述】
+
+发送串口数据。
+
+【语法】
+
+`rt_serial_write(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| pos | 偏移,设0即可 | 输入 |
+| buffer | 将要写入数据的指针 | 输入 |
+| size | 要写入的大小 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|--------------|
+| rt_size_t | 写入的字节数 |
+
+##### 2.1.1.6 rt_serial_control
+
+【描述】
+
+通过控制接口,应用程序可以对串口设备进行配置,如波特率、数据位、校验位、接收缓冲区大小、停止位等参数的修改。
+
+【语法】
+
+`rt_serial_control(struct rt_device *dev, int cmd, void *args)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| cmd | 命令控制字,可取值:`RT_DEVICE_CTRL_CONFIG` | 输入 |
+| args | 控制的参数,可取类型: `struct serial_configure` | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|------------|--------------------|
+| RT_EOK | 函数执行成功 |
+| -RT_ENOSYS | 执行失败,dev 为空 |
+| 其他 | 执行失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.2 I2C
+
+I2C模块提供以下API:
+
+- [rt_i2c_bus_device_find](#2121-rt_i2c_bus_device_find)
+- [rt_i2c_master_send](#2122-rt_i2c_master_send)
+- [rt_i2c_master_recv](#2123-rt_i2c_master_recv)
+- [rt_i2c_transfer](#2124-rt_i2c_transfer)
+
+##### 2.1.2.1 rt_i2c_bus_device_find
+
+【描述】
+
+查找i2c总线。
+
+【语法】
+
+`rt_i2c_bus_device_find(const char *bus_name)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-------------|-----------|
+| bus_name | I2C总线名字 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|---------|----------------------------|
+| rt_i2c_bus_device* | 函数执行成功,返回总线句柄 |
+| RT_NULL | 总线不存在 |
+
+##### 2.1.2.2 rt_i2c_master_send
+
+【描述】
+
+向 I2C 从设备发送数据。
+
+【语法】
+
+```text
+rt_i2c_master_send(struct rt_i2c_bus_device *bus,
+rt_uint16_t addr,
+rt_uint16_t flags,
+const rt_uint8_t *buf,
+rt_uint32_t count);
+```
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-----------------------------------------------------------------------|-----------|
+| bus | I2c总线句柄 | 输入 |
+| addr | I2C 从设备地址 | 输入 |
+| flags | 标志位,可为`RT_I2C_WR RT_I2C_RD`及之外的其他标志位,可以进行 `|` 操作 | 输入 |
+| buf | 待发送数据数据缓冲区 | 输入 |
+| count | 待发送数据大小(单位:字节) | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------------------------|
+| 正值 | 成功,返回发送的字节数 |
+| 负值 | 失败 |
+
+##### 2.1.2.3 rt_i2c_master_recv
+
+【描述】
+
+向 I2C 从设备发送数据。
+
+【语法】
+
+```text
+rt_i2c_master_recv(struct rt_i2c_bus_device *bus,
+rt_uint16_t addr,
+rt_uint16_t flags,
+rt_uint8_t *buf,
+rt_uint32_t count)
+```
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-----------------------------------------------------------------------|-----------|
+| bus | I2c总线句柄 | 输入 |
+| addr | I2C 从设备地址 | 输入 |
+| flags | 标志位,可为`RT_I2C_WR` `RT_I2C_RD`及之外的其他标志位,可以进行 `|` 操作 | 输入 |
+| buf | 接收数据数据缓冲区 | 输入 |
+| count | 接收数据大小(单位:字节) | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|---------------------|
+| 正值 | 成功,返回接收到的字节数 |
+| 负值 | 失败 |
+
+##### 2.1.2.4 rt_i2c_transfer
+
+【描述】
+
+向 I2C 从设备发送数据。
+
+【语法】
+
+```text
+rt_i2c_transfer(struct rt_i2c_bus_device *bus,
+struct rt_i2c_msg msgs[],
+rt_uint32_t num)
+```
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------|-----------|
+| bus | I2c总线句柄 | 输入 |
+| msg | 待传输的消息数组指针 | 输入 |
+| num | 消息数组的元素个数 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|--------------------------------------|
+| 0 | 失败,总线不支持的操作 |
+| 正值 | 成功,返回传输msg的数量 |
+| -RT_EIO | 传输失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+头文件:`drivers/i2c.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.3 GPIO
+
+GPIO模块提供以下API:
+
+- [kd_pin_mode](#2131-kd_pin_mode)
+- [kd_pin_write](#2132-kd_pin_write)
+- [kd_pin_read](#2133-kd_pin_read)
+- [kd_pin_attach_irq](#2134-kd_pin_attach_irq)
+- [kd_pin_detach_irq](#2135-kd_pin_detach_irq)
+- [kd_pin_irq_enable](#2136-kd_pin_irq_enable)
+- [gpio_device_ioctl](#2137-gpio_device_ioctl)
+
+##### 2.1.3.1 kd_pin_mode
+
+【描述】
+
+设置gpio管脚输入输出模式。
+
+【语法】
+
+`kd_pin_mode(rt_base_t pin, rt_base_t mode)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-------------------------------------------------------------------------------------|-----------|
+| pin | gpio编号 | 输入 |
+| mode | 模式。`GPIO_DM_INPUT`、`GPIO_DM_INPUT_PULL_DOWN`、`GPIO_DM_INPUT_PULL_UP`、`GPIO_DM_OUTPUT` | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|------|
+| RT_EOK | 成功 |
+| 其他 | 失败 |
+
+##### 2.1.3.2 kd_pin_write
+
+【描述】
+
+设置gpio管脚电平。
+
+【语法】
+
+`kd_pin_write(rt_base_t pin, rt_base_t value)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-------------------------------------|-----------|
+| pin | gpio编号 | 输入 |
+| value | 电平状态。`GPIO_PV_LOW`、`GPIO_PV_HIGH` | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|----------|------|
+| 无返回值 | |
+
+##### 2.1.3.3 kd_pin_read
+
+【描述】
+
+设置gpio管脚电平。
+
+【语法】
+
+`kd_pin_read(rt_base_t pin)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------|-----------|
+| pin | gpio编号 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|------------------------|
+| 0 | 管脚当前状态低电平 |
+| 1 | 管脚当前电平状态高电平 |
+
+##### 2.1.3.4 kd_pin_attach_irq
+
+【描述】
+
+绑定管脚中断函数以及设置中断方式。
+
+【语法】
+
+`kd_pin_attach_irq(rt_int32_t pin,rt_uint32_t mode, void (*hdr)(void *args), void *args)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|-----------------------------------------------------------------------------------------|-----------|
+| pin | gpio编号 | 输入 |
+| mode | 中断方式。 `GPIO_PE_RISING`、 `GPIO_PE_FALLING`、 `GPIO_PE_BOTH`、 `GPIO_PE_HIGH`、 `GPIO_PE_LOW` | 输入 |
+| hdr | 中断回调函数,由用户设置 | 输入 |
+| args | 中断回调函数的参数,可以为RT_NULL | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------|
+| RT_EOK | 绑定成功 |
+| 错误码 | 绑定失败 |
+
+##### 2.1.3.5 kd_pin_detach_irq
+
+【描述】
+
+解除管脚中断函数的绑定,并禁止gpio管脚的中断使能。
+
+【语法】
+
+`kd_pin_detach_irq(rt_int32_t pin)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------|-----------|
+| pin | gpio编号 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|----------|----------|
+| 管脚编号 | 解除成功 |
+| 错误码 | 解除失败 |
+
+##### 2.1.3.6 kd_pin_irq_enable
+
+【描述】
+
+gpio管脚的中断使能。
+
+【语法】
+
+`kd_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------|-----------|
+| pin | gpio编号 | 输入 |
+| enabled | 是否使能。`True/false` | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------|
+| RT_EOK | 使能成功 |
+| 错误码 | 使能失败 |
+
+##### 2.1.3.7 gpio_device_ioctl
+
+【描述】
+
+gpio功能控制。
+
+【语法】
+
+`gpio_device_ioctl(rt_device_t dev, int cmd, void *args)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|---------|-----------|----------|
+| dev | gpio句柄 | 输入 |
+| cmd | 控制命令。 `KD_GPIO_DM_OUTPUT`、 `KD_GPIO_DM_INPUT`、 `KD_GPIO_DM_INPUT_PULL_UP`、 `KD_GPIO_DM_INPUT_PULL_DOWN`、 `KD_GPIO_WRITE_LOW`、 `KD_GPIO_WRITE_HIGH`、 `KD_GPIO_READ_VALUE` | 输入 |
+| args | 用于从用户传下来的数据结构指针,数据结构中应包含管脚编号 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|------|
+| RT_EOK | 成功 |
+| 错误码 | 失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+头文件:`drv_gpio.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.4 Hard-lock
+
+Hard-lock模块提供以下API:
+
+- [kd_request_lock](#2141-kd_request_lock)
+- [kd_hardlock_lock](#2142-kd_hardlock_lock)
+- [kd_hardlock_unlock](#2143-kd_hardlock_unlock)
+
+##### 2.1.4.1 kd_request_lock
+
+【描述】
+
+申请使用锁。
+
+【语法】
+
+`kd_request_lock(rt_uint32_t num)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------|-----------|
+| num | 锁编号。0\~127 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|----------|
+| 0 | 申请成功 |
+| -1 | 申请失败 |
+
+##### 2.1.4.2 kd_hardlock_lock
+
+【描述】
+
+加锁。
+
+【语法】
+
+`kd_hardlock_lock (rt_uint32_t num)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------|-----------|
+| num | 锁编号。0\~127 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|--------|------------------------------|
+| 0 | 加锁成功 |
+| -1 | 锁正在加锁状态,本次无法加锁 |
+
+##### 2.1.4.3 kd_hardlock_unlock
+
+【描述】
+
+加锁。
+
+【语法】
+
+`kd_hardlock_unlock (rt_uint32_t num)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------|-----------|
+| num | 锁编号。0\~127 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|----------|------|
+| 无返回值 | |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+头文件:`drv_hardlock.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.5 ADC
+
+ADC 模块提供以下API:
+
+- [rt_device_find](#2151-rt_device_find)
+- [rt_adc_enable](#2152-rt_adc_enable)
+- [rt_adc_read](#2153-rt_adc_read)
+- [rt_adc_disable](#2154-rt_adc_disable)
+
+##### 2.1.5.1 rt_device_find
+
+【描述】
+
+应用程序根据 ADC 设备名称获取设备句柄,进而可以操作 ADC 设备。
+
+【语法】
+
+`rt_device_t rt_device_find(const char* name);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| name | adc 设备名称 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|----------|------------------------------------|
+| 设备句柄 | 查找到对应设备将返回相应的设备句柄 |
+| RT_NULL | 没有找到设备 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.5.2 rt_adc_enable
+
+【描述】
+
+在读取 adc 设备数据前需要先使能设备,通过此函数使能 adc。
+
+【语法】
+
+`rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------|-----------|
+| dev | adc 设备句柄 | 输入 |
+| channel | adc 通道 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|------------|------------------------|
+| RT_EOK | 成功 |
+| -RT_ENOSYS | 失败,设备操作方法为空 |
+| 其他错误码 | 失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.5.3 rt_adc_read
+
+【描述】
+
+读取 adc 通道采样值可通过此函数完成。
+
+【语法】
+
+`rt_err_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------|-----------|
+| dev | adc 设备句柄 | 输入 |
+| channel | adc 通道 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|------------|------------|
+| 读取的数值 | 读取的数值 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.5.4 rt_adc_disable
+
+【描述】
+
+关闭 adc 通道可通过此函数完成。
+
+【语法】
+
+`rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|--------------|-----------|
+| dev | adc 设备句柄 | 输入 |
+| channel | adc 通道 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|------------|------------------------|
+| RT_EOK | 成功 |
+| -RT_ENOSYS | 失败,设备操作方法为空 |
+| 其他错误码 | 失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.6 WDT
+
+WDT 模块提供以下API:
+
+- [rt_device_find](#2161-rt_device_find)
+- [rt_device_init](#2162-rt_device_init)
+- [rt_device_control](#2163-rt_device_control)
+
+##### 2.1.6.1 rt_device_find
+
+【描述】
+
+应用程序根据 WDT 设备名称获取设备句柄,进而可以操作 WDT 设备。
+
+【语法】
+
+`rt_device_t rt_device_find(const char* name);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| name | wdt 设备名称 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|----------|------------------------------------|
+| 设备句柄 | 查找到对应设备将返回相应的设备句柄 |
+| RT_NULL | 没有找到设备 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.6.2 rt_device_init
+
+【描述】
+
+初始化 WDT 设备,主要是对`timeout table`的初始化。
+
+【语法】
+
+`rt_err_t rt_device_init(rt_device_t dev)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| dev | wdt 设备句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|---------------|
+| RT_EOK | 初始化成功 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.6.3 rt_device_control
+
+【描述】
+
+功能型函数,根据传入cmd不同可以向下调用不同功能,类似用户层ioctl的功能。
+
+【语法】
+
+`rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| dev | wdt 设备句柄 | 输入 |
+| cmd | wdt contrl函数宏定义 | 输入 |
+| arg | 传入的数据的指针 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|-----------------|
+| RT_EOK | 功能调用成功 |
+| RT_EINVAL | 传入cmd无效 |
+| RT_ENOSYS | 驱动无contrl接口 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.7 OTP
+
+大核 rt-smart 中,OTP 模块主要提供了以下 API:
+
+- [otp_device_read](#2171-otp_device_read)
+- [otp_device_write](#2172-otp_device_write)
+
+##### 2.1.7.1 otp_device_read
+
+【描述】
+
+读 OTP 空间,可读范围:偏移量 0x0~0xbfc,size 为 0xc00。
+
+【语法】
+
+otp_device_read(rt_device_t dev, rt_off_t pos, void \*buffer, rt_size_t size);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|-----------------|----------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| pos | 要读取地址的偏移量 | 输入 |
+| buffer | 内存缓冲区指针,读取的数据将会被保存在缓冲区中 | 输出 |
+| size | 读取数据的大小(byte) | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------------------|---------------------------------|
+| 读到数据的实际大小 | 以字节 byte 为单位 |
+| 0 | 读取失败,参考错误码定义 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:drv_otp.h
+- 库文件:无
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.7.2 otp_device_write
+
+【描述】
+
+写 OTP 空间,可写范围:偏移量 0x0~0x1fc,size 为 0x200。
+
+【语法】
+
+otp_device_write(rt_device_t dev, rt_off_t pos, const void \*buffer, rt_size_t size);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|-----------------|----------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| pos | 要写入数据的偏移量 | 输入 |
+| buffer | 内存缓冲区指针,放置要写入的数据 | 输出 |
+| size | 吸入数据的大小(byte) | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------------------|---------------------------------|
+| 写入数据的实际大小 | 以字节 byte 为单位 |
+| 0 | 写入失败,参考错误码定义 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:drv_otp.h
+- 库文件:无
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.8 TS
+
+大核 rt-smart 中,TS 模块主要提供了以下 API:
+
+- [ts_device_read](#2181-ts_device_read)
+
+##### 2.1.8.1 ts_device_read
+
+【描述】
+
+读芯片结温。
+
+【语法】
+
+ts_device_read(rt_device_t dev, rt_off_t pos, void \*buffer, rt_size_t size);
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|-----------------|----------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| pos | 要读取地址的偏移量,设置为0 | 输入 |
+| buffer | 内存缓冲区指针,读取的数据将会被保存在缓冲区中 | 输出 |
+| size | 读取数据的大小(byte),设置为0 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------------------|---------------------------------|
+| 读到数据的实际大小 | 以字节 byte 为单位 |
+| 0 | 读取失败,参考错误码定义 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:drv_ts.h
+- 库文件:无
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.9 PWM
+
+PWM模块提供以下内核态API:
+
+- [rt_pwm_set](#2191-rt_pwm_set)
+- [rt_pwm_enable](#2192-rt_pwm_enable)
+- [rt_pwm_disable](#2193-rt_pwm_disable)
+
+##### 2.1.9.1 rt_pwm_set
+
+【描述】
+
+设置PWM设备的周期和正脉冲宽度。
+
+【语法】
+
+`rt_pwm_set(struct rt_device_pwm *device, int channel, rt_uint32_t period, rt_uint32_t pulse)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| device | PWM 设备句柄 | 输入 |
+| channel | pwm通道号 | 输入 |
+| period | pwm周期(ns) | 输入 |
+| pulse | pwm正脉冲宽度(ns) | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|----------------|
+| RT_EOK | 成功 |
+| -RT_EIO | device 为空 |
+| -RT_ENOSYS | 设备操作方法为空 |
+| 其他错误码 | 执行失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`drivers/rt_drv_pwm.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.9.2 rt_pwm_enable
+
+【描述】
+
+使能 PWM 设备。
+
+【语法】
+
+`rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| device | PWM 设备句柄 | 输入 |
+| channel | pwm通道号 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|-----------------|
+| RT_EOK | 设备使能成功 |
+| -RT_ENOSYS | 设备操作方法为空 |
+| 其他错误码 | 设备使能失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`drivers/rt_drv_pwm.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.9.3 rt_pwm_disable
+
+【描述】
+
+关闭 PWM 设备对应通道。
+
+【语法】
+
+`rt_err_t rt_pwm_disable(struct rt_device_pwm *device, int channel);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| device | PWM 设备句柄 | 输入 |
+| channel | pwm通道号 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|-----------------|
+| RT_EOK | 设备关闭成功 |
+| -RT_EIO | 设备句柄为空 |
+| 其他错误码 | 设备关闭失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`drivers/rt_drv_pwm.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.10 RTC
+
+PWM模块提供以下内核态API:
+
+- [set_date](#21101-set_date)
+- [set_time](#21102-set_time)
+
+##### 2.1.10.1 set_date
+
+【描述】
+
+设置日期,年、月、日。
+
+【语法】
+
+`rt_err_t set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| year | 待设置的年份 | 输入 |
+| month | 待设置的月份 | 输入 |
+| day | 待设置的日 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|-----------------------|
+| RT_EOK | 设置成功 |
+| -RT_ERROR | 失败,没有找到 rtc 设备 |
+| 其他错误码 | 失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`time.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.1.10.2 set_time
+
+【描述】
+
+设置日期,年、月、日。
+
+【语法】
+
+`rt_err_t set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| hour | 待设置的时 | 输入 |
+| minute | 待设置的分 | 输入 |
+| second | 待设置的秒 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|-----------------------|
+| RT_EOK | 设置成功 |
+| -RT_ERROR | 失败,没有找到 rtc 设备 |
+| 其他错误码 | 失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`time.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.1.11 TIMER
+
+TIMER模块提供以下内核态API:
+
+- `rt_device_open`
+- `rt_device_control`
+- [rt_device_set_rx_indicate](#21111-rt_device_set_rx_indicate)
+- `rt_device_read`
+- `rt_device_write`
+
+##### 2.1.11.1 rt_device_set_rx_indicate
+
+【描述】
+
+设置回调函数,用于device接收到数据时调用。
+
+【语法】
+
+`rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size))`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| dev | 打开的设备句柄 | 输入 |
+| *rx_ind | 回调函数指针 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|-----------------------|
+| RT_EOK | 设置成功 |
+| 其他错误码 | 失败 |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+### 2.2 用户态 API
+
+#### 2.2.1 ADC
+
+ADC 模块在用户态提供以下API:
+
+- [rt_device_find](#2211-rt_device_find)
+- [rt_device_open](#2212-rt_device_open)
+- [rt_device_control](#2213-rt_device_control)
+- [rt_device_read](#2214-rt_device_read)
+
+##### 2.2.1.1 rt_device_find
+
+【描述】
+
+查找设备。该函数通过指定的名称查找设备。应用程序根据设备名称获取设备句柄,进而可以操作设备。
+
+【语法】
+
+`rt_device_t rt_device_find(const char *name);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| name | 设备的名称。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|------------------|
+| rt_device_t | 成功返回设备句柄 |
+| RT_NULL | 失败返回 RT_NULL |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.1.2 rt_device_open
+
+【描述】
+
+打开设备。通过设备句柄,应用程序可以打开和关闭设备,打开设备时会检测设备是否已经初始化,没有初始化则会默认调用初始化接口初始化设备。
+
+【语法】
+
+`rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| oflag | 设备的打开模式标志位,支持 `RT_DEVICE_FLAG_RDWR` | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|-----------------|
+| RT_EOK | 成功返回 RT_EOK |
+| rt 错误码 | 失败返回错误码 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.1.3 rt_device_control
+
+【描述】
+
+该函数将在设备上执行各种控制功能,通过此函数使能 adc 设备的某个通道。
+
+【语法】
+
+`rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------------------------------------------------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| cmd | 命令控制字,这个参数通常是与设备驱动程序相关。0 代表使能 adc 对应通道,1 代表关闭 adc 对应通道 | 输入 |
+| arg | 控制命令相关的参数。这里对应 adc 通道号 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|-----------------|
+| RT_EOK | 成功返回 RT_EOK |
+| rt 错误码 | 失败返回错误码 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+- 应该使用 1.2.2 节中第三部分示例代码传入通道号。
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.1.4 rt_device_read
+
+【描述】
+
+该函数将从设备读取数据。参数为 adc 设备句柄时,该函数将读取 adc 通道的采样值。
+
+【语法】
+
+`rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------------------|-----------|
+| dev | 设备句柄。在这里使用获取的 adc 设备句柄 | 输入 |
+| pos | 读取的偏移量。在这里对应通道号 | 输入 |
+| buffer | 用于保存读取数据的数据缓冲区。在这里应该使用一个 32 位无符号数 | 输出 |
+| size | 缓冲区的大小。在这里应该为 4 字节 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|----------------------------------------------------------------------------------------------------|
+| rt_size_t | 成功则返回实际读取的大小,如果是字符设备,返回大小以字节为单位,如果是块设备,返回的大小以块为单位 |
+| buffer | 用户保存读取数据的数据缓冲区。在这里是 adc 通道的采样值 |
+| 0 | 失败则返回 0 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.2 WDT
+
+WDT 模块在用户态可以使用posix接口:
+
+- [open](#2221-open)
+- [ioctl](#2222-ioctl)
+
+##### 2.2.2.1 open
+
+【描述】
+
+从用户态打开设备节点。
+
+语法】
+
+`int open(const char *file, int flags, ...);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------------------|-----------|
+| file | 设备节点路径 | 输入 |
+| flags | 模式 `O_RDONLY` `O_WRONLY` `O_RDWR`等 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|------------------------------|
+| 大于0 | 成功则返回打开的设备节点描述符 |
+| 小于0 | 失败 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`fcntl.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.2.2 ioctl
+
+【描述】
+
+通过传入不同的参数调用驱动的不同功能。
+
+语法】
+
+`int ioctl(int fildes, int cmd, ...);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------------------|-----------|
+| fildes | 设备描述符 | 输入 |
+| cmd | 命令 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----|-----|
+| 0 | 成功 |
+| 非0 | 失败 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`sys/ioctl.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.3 OTP
+
+OTP 模块在用户态提供以下API:
+
+- [rt_device_find](#2231-rt_device_find)
+- [rt_device_open](#2232-rt_device_open)
+- [rt_device_read](#2233-rt_device_read)
+- [rt_device_write](#2234-rt_device_write)
+- [rt_device_close](#2235-rt_device_close)
+
+##### 2.2.3.1 rt_device_find
+
+【描述】
+
+查找设备。该函数通过指定的名称查找设备。应用程序根据设备名称获取设备句柄,进而可以操作设备。
+
+【语法】
+
+`rt_device_t rt_device_find(const char *name);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|---------------|-----------|
+| name | 设备的名称。 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-------------|------------------|
+| rt_device_t | 成功返回设备句柄 |
+| RT_NULL | 失败返回 RT_NULL |
+
+【芯片差异】
+
+无。
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.3.2 rt_device_open
+
+【描述】
+
+打开设备。通过设备句柄,应用程序可以打开和关闭设备,打开设备时会检测设备是否已经初始化,没有初始化则会默认调用初始化接口初始化设备。
+
+【语法】
+
+`rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|------------------------------------------------|-----------|
+| dev | 设备句柄 | 输入 |
+| oflag | 设备的打开模式标志位,支持 `RT_DEVICE_FLAG_RDWR` | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|-----------------|
+| RT_EOK | 成功返回 RT_EOK |
+| rt 错误码 | 失败返回错误码 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.3.3 rt_device_read
+
+【描述】
+
+从 OTP 设备中读取数据,可读范围:偏移量 0x0~0xbfc,size 为 0xc00。
+
+【语法】
+
+`rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------------------|-----------|
+| dev | 设备句柄。在这里使用获取的 otp 设备句柄 | 输入 |
+| pos | 读取的偏移量。在这里对应要读取地址的偏移量 | 输入 |
+| buffer | 用于保存读取数据的数据缓冲区。在这里应该使用一个 32 位无符号数 | 输出 |
+| size | 缓冲区的大小。在这里对应读取数据的大小(bytes) | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|----------------------------------------------------------------------------------------------------|
+| rt_size_t | 成功则返回实际读取的大小,以字节为单位 |
+| 0 | 失败则返回 0 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.3.4 rt_device_write
+
+【描述】
+
+向 OTP 设备中写入数据,可写范围:偏移量 0x0~0x1fc,size 为 0x200。
+
+【语法】
+
+`rt_size_t otp_device_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------------------|-----------|
+| dev | 设备句柄。在这里使用获取的 otp 设备句柄 | 输入 |
+| pos | 偏移量。在这里对应要写入数据的偏移量 | 输入 |
+| buffer | 用于保存读取数据的数据缓冲区。放置要写入的数据 | 输出 |
+| size | 缓冲区的大小。在这里对应写入数据的大小(bytes) | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|----------------------------------------------------------------------------------------------------|
+| rt_size_t | 成功则返回实际写入数据的大小,以字节为单位 |
+| 0 | 失败则返回 0 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+##### 2.2.3.5 rt_device_close
+
+【描述】
+
+关闭设备。
+
+【语法】
+
+`rt_err_t rt_device_close(rt_device_t dev);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|----------|----------------------------------------------------------------|-----------|
+| dev | 设备句柄。在这里使用获取的 otp 设备句柄 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|-----------|----------------------------------------------------------------------------------------------------|
+| rt_err_t | 成功则关闭设备 |
+| 错误码 | 失败则返回错误码 |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:`rtdevice.h`、`rtthread.h`
+
+【注意】
+
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+#### 2.2.4 TS
+
+TS 模块在用户态提供以下 API,这些 API 跟 OTP 提供的 API 保持一致,请参考 [OTP](#223-otp) 中对于用户态 API 的介绍。
+
+- rt_device_find
+- rt_device_open
+- rt_device_read
+- rt_device_close
+
+## 3. 数据类型
+
+UART模块使用到的数据类型:未定义私有数据类型
+
+I2C模块使用到的数据类型:未定义私有数据类型
+
+ADC 模块使用到的数据类型:未定义私有数据类型
+
+GPIO模块使用到的数据类型:
+
+- [struct rt_device_gpio](#31-struct-rt_device_gpio)
+
+ADC 模块使用到的数据类型:未定义私有数据类型
+
+Hard-lock模块使用到的数据类型:
+
+- [struct device_hardlock](#32-device_hardlock)
+
+WDT 模块使用到的数据类型:未定义私有数据类型
+
+OTP 模块使用到的数据类型:未定义私有数据类型
+
+TS 模块使用到的数据类型:未定义私有数据类型
+
+PWM 模块使用到的数据类型:未定义私有数据类型
+
+RTC 模块使用到的数据类型:
+
+- [struct kd_alarm_setup](#33-struct-kd_alarm_setup)
+
+### 3.1 struct rt_device_gpio
+
+【说明】
+
+用户传进来的gpio管脚和读取管脚时用于装载返回值的集合。
+
+【定义】
+
+```text
+struct rt_device_gpio
+{
+ rt_uint16_t pin; //管脚标号
+ rt_uint16_t value; //读管脚电平时用于装载读回的电平值
+};
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+### 3.2 device_hardlock
+
+【说明】
+
+驱动中对hardlock设备的抽象。
+
+【定义】
+
+```text
+struct device_hardlock
+{
+ volatile void *hw_base; // 模块内核基地址
+ char used[HARDLOCK_MAX]; //用于标志锁是否被使用,申请时会将对应编号置1
+};
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+### 3.3 struct kd_alarm_setup
+
+【说明】
+
+在配置RTC中断时,将中断类型和定时时间一同向下注册进驱动中。
+
+【定义】
+
+```text
+struct kd_alarm_setup
+{
+ rt_uint32_t flag; /* alarm flag */
+ struct tm tm; /* when will the alarm wake up user */
+};
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+## 4. 错误码
+
+| 错误代码 | 宏定义 | 描述 |
+|----------|--------|------------|
+| RT_EOK | 0 | 成功 |
+| RT_ERROR | 1 | 发生了错误 |
+
+## 5. 计算公式
+
+### 5.1 ADC 计算公式
+
+adc 硬件参考电压为 1.8V,12 bit 数字信号输出,受噪声干扰有效位为 10 bit。通过 API 获取 adc 采样电压值以后,转换为实际电压值的计算公式如下:
+
+例如,在 msh 获取 adc 的采样值为 0x713,即 1811 时,实际电压值为:
+
+V\~1.8V,浮动范围为 5mv。
+
+### 5.2 WDT超时时间计算公式
+
+```text
+value = clock * timeout; timeout:用户设置的超时时间,单位是:秒
+log2(value) = ret + 16;
+ret = log2(value) - 16;
+```
+
+ret就是最终将要配置到wdt模块的超时时间值。
+
+用户并不需要关心超时时间如何计算,计算过程已经在驱动中实现,当用户调用ioctl或rt_device_control配置超时时间时,驱动将会找到一个最接近用户设置的时间的值配置进wdt模块。
diff --git "a/zh/01_software/board/osdrv/K230_\345\260\217\346\240\270Linux\351\251\261\345\212\250_API\345\217\202\350\200\203.md" "b/zh/01_software/board/osdrv/K230_\345\260\217\346\240\270Linux\351\251\261\345\212\250_API\345\217\202\350\200\203.md"
new file mode 100755
index 0000000..26284d2
--- /dev/null
+++ "b/zh/01_software/board/osdrv/K230_\345\260\217\346\240\270Linux\351\251\261\345\212\250_API\345\217\202\350\200\203.md"
@@ -0,0 +1,761 @@
+# K230小核Linux驱动API参考
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍K230小核Linux的驱动api,主要包括uart、i2c、gpio、watchdog、hardlock、OTP、Tsensor、TRNG等。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|-----------|---------------------------------------------|
+| UART | Universal Asynchronous Receiver/Transmitter |
+| I2C | Inter-Integrated Circuit |
+| GPIO | General-purpose input/output |
+| Hard-lock | 硬件互斥锁 |
+| WDT | watchdog |
+| OTP | One-Time Programmable |
+| TS | Temperature Sensor |
+| TRNG | True Random Number Generator |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|----------|--------|---------|
+| V1.0 | 初版 | 范俊涛 | 2023/5/26 |
+
+## 1 概述
+
+### 1.1 概述
+
+UART:
+通用异步收发器,该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信。
+
+I2C:
+由Philips公司(2006年迁移到NXP)在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。
+
+GPIO:
+(general porpose intput output)通用输入输出端口的简称。可以通过软件控制其输出和输入,通俗来说就是常用引脚,可以控制引脚的高低电平,对其进行读取或者写入。
+
+Hard-lock:
+嘉楠自研模块,用于同核不通进程间或异核之间对共享资源的互斥而实现的硬件互斥锁,可用于对共享资源的互斥使用。
+
+WDT:
+WDT是watchdog的简称,本质上是一个硬件定时器,软件程序需要每隔一段时间喂一次狗,如果WDT超时则可以产生一个中断信号或复位信号到CPU,由此通过软硬件结合的方式防止程序运行异常而不能恢复。
+
+OTP:
+OTP 主要用于存储安全敏感的机密信息,例如 bootrom 的固件信息、加解密密钥、签名信息以及用户自己定义的安全信息等。
+
+TS:
+K230 TS(Temperature Sensor),自研温度传感器,采用 TSMC 12nm 工艺,TS 的应用场景是降频。
+
+TRNG:
+TRNG 主要用于产生真随机数,从而为加解密运算提供一个随机熵源。
+
+### 1.2 功能描述
+
+#### 1.2.1 uart模块
+
+K230共有5路uart,且uart模块支持红外模式,支持RS485模式,支持DMA,部分端口支持流控,数据位支持5/6/7/8比特,停止位1/2比特,波特率可以支持到1.5MHz。
+
+#### 1.2.2 i2c模块
+
+K230共有5路i2c,i2c模块支持主模式,支持DMA,支持7/10比特寻址,支持中断,i2c模块传输速率支持100k/400k/1M/3.4M.
+
+#### 1.2.3 gpio模块
+
+k230共有2路gpio,每路gpio包含32个gpio端口,共64个gpio端口,每个gpio端口均支持输入输出功能,支持上升沿中断,下降沿中断,高低电平中断,和双边沿中断。k230的每个gpio端口的中断相互独立互不影响。
+
+#### 1.2.4 hard-lock模块
+
+k230有128个硬件互斥锁,其作用类似Linux的自旋锁,可以用于对同一资源的互斥。
+
+#### 1.2.5 wdt模块
+
+wdt,watchdog模块,k230有两路wdt,大小核分别使用一路,wdt支持中断和复位两种模式,默认使用复位模式,即当wdt的超时时间溢出时,直接使soc复位。
+
+#### 1.2.6 OTP模块
+
+OTP 集成在安全模块 PUF 中,为整个 SoC 提供安全存储功能,保护根密钥和启动代码等关键数据不被攻击者破坏。小核侧 OTP 驱动主要提供读功能,可读区域为包括生产信息在内的 24Kbits 空间。Linux 侧 OTP 驱动挂载在 nvmem 框架上,具体的框架结构如下图所示:
+
+![otp](images/otp_linux.png)
+
+#### 1.2.7 TS模块
+
+大核侧 TS 驱动主要提供读功能,在读 TS 之前,首先需要配置 TS 寄存器使能信号、输出模式,然后才能读出芯片的结温。另外,TS 寄存器每 2.6s 读取一次芯片结温。Rt-smart 侧 TS 驱动的结构如下图所示:
+
+![ts](images/ts_linux.png)
+
+#### 1.2.8 TRNG模块
+
+TRNG 集成在安全模块 PUF 中,为整个 SoC 提供真随机数功能,保护根密钥和启动代码等关键数据不被攻击者破坏。小核侧 TRNG 驱动主要提供读功能,TRNG 驱动挂载在 HW random 框架上,具体的框架结构如下图所示:
+
+![trng](images/trng_linux.png)
+
+## 2 API参考
+
+### 2.1 UART API参考
+
+Linux封装了termios API用来给用户使用,termios API描述了一个通用的终端接口,提供了控制异步通讯端口的配置和读写。
+
+```text
+termios API举例:
+int tcgetattr(int fd,struct termios *termios_p);
+int tcsetattr(int fd,int potional_actions,struct termios *termios_p);
+int tcsendbreak(int fd,int duration);
+int tcdrain(int fd);
+int tcflush(int fd, int queue_selector);
+int tcflow(int fd, int action);
+void cfmakeraw(struct termios *termios_p);
+speed_t cfgetispeed(const struct termios *termios_p);
+speed_t cfgetospeed(const struct termios *termios_p);
+int cfsetispeed(struct termios *termios_p, speed_t speed);
+int cfsetospeed(struct termios *termios_p, speed_t speed);
+int cfsetspeed(struct termios *termios_p, speed_t speed);
+```
+
+详细请参考`Documentation/driver-api/serial/tty.rst`。
+
+### 2.2 I2C API参考
+
+linux为用户称封装了系统调用来使用i2c。
+
+[open](#29-open)
+
+[ioctl](#210-ioctl)
+
+[read](#211-read)
+
+[write](#212-write)
+
+### 2.3 GPIO API参考
+
+#### 2.3.1 sysfs控制gpio
+
+GPIO驱动加载后会在 `/sys/class/gpio/` 下创建gpio端口的设备节点,每个节点代表一个gpio端口,通过sysfs操作这个gpio端口即可达到操作gpio输入输出和中断的作用。
+
+方法1:
+
+```text
+echo N > /sys/class/gpio/export //将编号为 N 的gpio端口导出到sysfs
+
+echo in > /sys/class/gpio/gpioN/direction //将该gpio端口设置成输入模式
+
+cat /sys/class/gpio/gpioN/value //读取该gpio端口电平状态
+
+echo out > /sys/class/gpio/gpioN/direction //将该gpio端口设置成输出模式
+
+echo 1 > /sys/class/gpio/gpioN/value //将该端口输出高电平,注意active_low极性
+
+echo 0 > /sys/class/gpio/gpioN/value //将该端口输出低电平,注意active_low极性
+
+设置中断属性:
+echo rising > /sys/class/gpio/gpioN/edge 上升沿中断,中断只能在direction为in时才可以设置
+
+echo falling > /sys/class/gpio/gpioN/edge 下降沿中断
+
+echo both > /sys/class/gpio/gpioN/edge 双边沿中断
+```
+
+方法2:
+
+```text
+设置好中断模式后通过poll函数监听中断:
+
+struct pollfd fds[1];
+fd = open("/sys/class/gpio/gpioN/value", O_RDONLY)
+
+fds[0].fd = gpio_fd;
+fds[0].events = POLLPRI;
+
+while(1)
+{
+ poll(fds, 1, -1);
+
+ if (fds[0].revents & POLLPRI)
+ {
+ /* 接收中断 */
+ }
+}
+
+```
+
+#### 2.3.2 ioctl控制gpio
+
+用户程序直接操作 `/dev/gpiochipN`:
+
+```text
+struct gpiohandle_request req;
+struct gpiohandle_data data;
+struct gpioevent_request event_req;
+struct gpioevent_data event_data;
+struct pollfd poll_fd;
+fd = open("/dev/gpiochipN", O_RDONLY);
+
+.....
+
+req.lineoffsets[0] = 0;
+req.flags = GPIOHANDLE_REQUEST_OUTPUT;
+req.lines = 1;
+
+event_req.lineoffset = 0;
+event_req.handleflags = GPIOHANDLE_REQUEST_INPUT;
+event_req.eventflags = GPIOEVENT_REQUEST_RISING_EDGE;
+
+ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);
+ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &event_req);
+
+close(fd);
+
+poll_fd.fd = event_req.fd;
+poll_fd.events = POLLIN;
+
+while(1)
+{
+ data.values[0] = !data.values[0];
+ .....
+ ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);
+ .....
+
+ ret = poll(&poll_fd, 1, 3000);
+ if(ret == 0)
+ ....
+ else {
+ read(event_req.fd, &event_data, sizeof(event_data));
+ }
+}
+
+close(req.fd);
+
+```
+
+### 2.4 Hardlock API参考
+
+Hardlock未提供用户api接口,其使用方法仅限内核态驱动之间使用。
+
+### 2.5 Wadtchdog API参考
+
+#### 2.5.1 通过ioctl使用watchdog
+
+[open](#29-open)
+
+[ioctl](#210-ioctl)
+
+```text
+示例:
+fd = open("/dev/watchdog", O_WRONLY)
+
+.....
+
+ioctl(fd, WDIOC_SETTIMEOUT, &flags); /* 设置超时 */
+
+ioctl(fd, WDIOC_GETTIMEOUT, &flags); /* 获取超时设置 */
+
+ioctl(fd, WDIOC_SETPRETIMEOUT, &flags); /* 设置预超时 */
+
+ioctl(fd, WDIOC_GETPRETIMEOUT, &flags); /* 获取预超时 */
+
+ioctl(fd, WDIOC_GETTIMELEFT, &flags); /* 获取剩余超时时间 */
+
+ioctl(fd, WDIOC_KEEPALIVE, &dummy); /* 喂狗 */
+
+.....
+```
+
+#### 2.5.2 通过文件系统使用watchdog
+
+```text
+echo V > /dev/watchdog watchdog开始计时,内核自动喂狗线程启动
+
+echo A > /dev/watchdog 内核喂狗线程停止喂狗,但计时仍然继续,在默认超时时间后系统复位
+```
+
+> 注意:在命令行向watchdog节点写字符时,watchdog被使能并使用默认超时时间计数,且内核自动喂狗线程被唤醒
+
+### 2.6 OTP API 参考
+
+用户可通过 `sysfs` 来访问 OTP 硬件,还可以通过运行用户态程序读取 OTP 空间。
+
+#### 2.6.1 sysfs 文件系统
+
+Linux 内核使用 `sysfs` 文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整。`Sysfs` 虚拟文件系统一般被挂载在 `/sys` 目录下。OTP 一旦被注册到 Linux 中的 `NVMEM` 框架中之后,通过 `sysfs` 虚拟文件系统,可以很容易查看到 OTP 的信息。
+
+OTP sysfs位于 `/sys/bus/nvmem/devices/kendryte_otp0/` 目录下,文件结构如下:
+
+```shell
+.
+|-- nvmem
+|-- of_node -> ../../../../../../firmware/devicetree/base/soc/security/otp@91214000
+|-- subsystem -> ../../../../../../bus/nvmem
+|-- type
+|-- uevent
+
+```
+
+启动 Linux 之后,运行下列命令:
+
+```shell
+[root@canaan ~ ]# hexdump -C -v /sys/bus/nvmem/devices/kendryte_otp0/nvmem
+00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000060 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000080 00 02 00 00 50 02 00 00 00 01 00 00 00 00 00 00 |....P...........|
+00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+......
+
+```
+
+或者,利用 `dd` 命令:
+
+```shell
+[root@canaan ~ ]# dd if=/sys/bus/nvmem/devices/kendryte_otp0/nvmem of=/tmp/file
+6+0 records in
+6+0 records out
+[root@canaan ~ ]# hexdump -C -v /tmp/file
+00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000060 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+00000080 00 02 00 00 50 02 00 00 00 01 00 00 00 00 00 00 |....P...........|
+00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+......
+
+```
+
+#### 2.6.2 用户态访问 OTP
+
+编写一个用户态应用程序,用户态应用程序通过标准的系统调用open()、close()、read()等函数陷入到内核态,最终会调用 OTP 驱动中注册的接口中,以测试 OTP 功能。
+
+目前用户态应用程序已经编写完成,生成的可执行文件在 `/usr/bin/otp_test_demo` 目录下。
+
+运行步骤如下:
+
+1. 进入应用程序 demo 目录;
+1. 在 demo 目录下运行 otp demo,读取长度作为参数;
+1. 执行 otp demo。
+1. 改变读取长度(长度范围:1~768),重新执行 otp demo。
+
+启动小核Linux之后,运行下列命令:
+
+```shell
+[root@canaan ~ ]#cd /usr/bin/
+[root@canaan /usr/bin ]# ./otp_test_demo 768
+Addr Value
+00000000 0xffffffff
+00000004 0xffffffff
+00000008 0xffffffff
+0000000c 0xffffffff
+00000010 0xffffffff
+00000014 0xffffffff
+00000018 0xffffffff
+0000001c 0xffffffff
+00000020 0xffffffff
+00000024 0xffffffff
+00000028 0xffffffff
+0000002c 0xffffffff
+00000030 0xffffffff
+00000034 0xffffffff
+00000038 0xffffffff
+0000003c 0xffffffff
+00000040 0xffffffff
+......
+
+```
+
+#### 2.6.3 OTP 空间默认值
+
+OTP 空间默认值信息如下所示,请对照默认值验证读取OTP空间是否正确。
+
+```text
+00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
+*
+00000080 00 02 00 00 50 02 00 00 00 01 00 00 00 00 00 00 |....P...........|
+00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+*
+00000100 8d 3d da 24 1c f6 fa f6 88 4b c3 91 fb 2d 7b 09 |.=.$.....K...-{.|
+00000110 a6 64 03 7d ce 98 e0 d2 92 5a a0 cf 3c 58 50 d0 |.d.}.....Z..z..).qE.0.|
+00000140 91 3f a6 3d 48 30 dd 6d 18 c2 1c 13 97 fe 1f 9b |.?.=H0.m........|
+00000150 fd 08 1c 16 1b a7 9a 20 1d 80 70 8a 20 08 61 a3 |....... ..p. .a.|
+00000160 24 2b cf ec 97 9e 3f 25 89 b9 f2 a8 7a 63 5c c7 |$+....?%....zc\.|
+00000170 44 86 70 30 45 e4 4f 35 4d 2e 3e 8c e5 3a 49 29 |D.p0E.O5M.>..:I)|
+00000180 b6 06 6e 15 6b 62 d3 94 5f 8a ea e3 ea a3 a1 fc |..n.kb.._.......|
+00000190 0f 19 f5 50 05 4d 63 47 77 14 c1 c0 bf 06 3b 55 |...P.McGw.....;U|
+000001a0 47 be 7c c6 93 e2 e1 31 05 27 f5 a2 77 16 1f 75 |G.|....1.'..w..u|
+000001b0 5a 95 0a 15 24 16 a8 1a fc d8 67 f4 dd 15 e4 8c |Z...$.....g.....|
+000001c0 25 44 b9 48 59 b1 17 bb 8e 05 15 db ff fa 77 47 |%D.HY.........wG|
+000001d0 52 ce f7 86 bf 20 b5 46 ac 83 e9 ac 08 a7 e3 67 |R.... .F.......g|
+000001e0 02 24 50 de 49 9d 24 57 9f 78 bb 74 21 8f 74 f0 |.$P.I.$W.x.t!.t.|
+000001f0 47 25 9b cb 99 e7 6a 0f 51 52 be 4b ea 6a a3 ee |G%....j.QR.K.j..|
+00000200 7b 8d f8 ad c8 c6 5e c4 13 66 4b 50 3b 02 98 c8 |{.....^..fKP;...|
+00000210 20 11 c5 ca 54 ee 32 ea 89 e4 38 58 cd 5a cb 34 | ...T.2...8X.Z.4|
+00000220 2f d2 d9 b3 d9 97 50 a8 10 74 73 17 b0 76 19 ec |/.....P..ts..v..|
+00000230 8e 1e 07 58 ba f5 5b b9 a3 6e 0b f8 ae 8c ba 35 |...X..[..n.....5|
+00000240 53 6b 5d 52 9d e9 76 46 ae f7 1f 8d 45 b4 93 b6 |Sk]R..vF....E...|
+00000250 28 93 b4 07 6f 8e be 37 41 57 86 19 c1 d0 fb 9b |(...o..7AW......|
+00000260 8e 09 7a 77 a4 23 83 db 39 64 6c 5f 73 0d 82 2e |..zw.#..9dl_s...|
+00000270 ca 5b 2e c4 5f b0 6b 23 3d fd 96 88 e8 b9 e9 02 |.[.._.k#=.......|
+00000280 a8 e1 22 b1 c4 af 61 4c bc ab 93 a1 d1 80 aa 6f |.."...aL.......o|
+00000290 01 dc cd c1 a0 71 36 58 86 ed 7e d9 c1 15 95 50 |.....q6X..~....P|
+000002a0 f2 4e 9a 0e c9 d8 58 d6 14 93 c9 de 86 0e 87 52 |.N....X........R|
+000002b0 85 e6 ff d6 28 e8 dd 29 5a ab b4 b3 ce de 35 e9 |....(..)Z.....5.|
+000002c0 48 f2 1f a8 22 8f e3 17 d7 86 d8 e8 de 24 4d 2a |H..."........$M*|
+000002d0 70 89 37 47 9c 53 9b 33 0b 74 95 30 d6 4e e0 36 |p.7G.S.3.t.0.N.6|
+000002e0 bc 10 ff da ab bd 74 e7 df 04 08 11 e7 43 94 09 |......t......C..|
+000002f0 4d 74 df 13 84 a0 86 54 4c d0 cb c2 63 fb 42 7d |Mt.....TL...c.B}|
+00000300 5b e6 9d 3b dc 86 59 d7 cb df 29 65 53 51 54 8b |[..;..Y...)eSQT.|
+00000310 b1 50 96 a2 85 e0 b6 b4 d2 ce 6d 63 48 09 b3 62 |.P........mcH..b|
+00000320 9d f5 d4 16 4c 81 5f b4 e1 f7 91 7b 5f 7f c9 29 |....L._....{_..)|
+00000330 43 22 56 e8 f5 ae 68 b3 a0 a8 f9 7d 7b d9 b1 2e |C"V...h....}{...|
+00000340 98 25 07 7b 38 33 9c 99 f6 85 c7 49 cb dc 6f 1d |.%.{83.....I..o.|
+00000350 1c 45 d1 ff 57 a4 b9 d7 2a 6c 3f 9e dd 9a ee 5b |.E..W...*l?....[|
+00000360 f3 0b 21 af 2e d8 e5 ce 4f b7 4d 07 ea ba 5a e9 |..!.....O.M...Z.|
+00000370 df 85 d8 6d 88 78 84 9a dd 1a 4a 4a 86 2e e4 62 |...m.x....JJ...b|
+00000380 c2 94 4c e7 77 0b 2c 7a 38 03 2c 2a a1 f7 5b dd |..L.w.,z8.,*..[.|
+00000390 14 a7 d8 4a 66 38 d0 9f e8 28 a8 7c 33 36 39 72 |...Jf8...(.|369r|
+000003a0 1b 7b 84 68 a6 a8 dd 7e a9 5b f0 8e 2b 50 6e 40 |.{.h...~.[..+Pn@|
+000003b0 d2 a5 62 43 5e f1 f4 bf 90 11 0f e2 16 b5 80 4e |..bC^..........N|
+000003c0 10 68 a7 a2 aa 2d dd ba c1 d7 d6 0c b7 17 a5 a3 |.h...-..........|
+000003d0 c2 e2 77 e8 7c 9a ff 23 8c 30 ae b3 5a 79 1c fd |..w.|..#.0..Zy..|
+000003e0 77 4a f6 41 78 53 36 52 d4 45 a6 f9 c2 8e 8d fc |wJ.AxS6R.E......|
+000003f0 03 2e f4 00 58 e8 15 85 bf d9 3f b8 62 58 e2 97 |....X.....?.bX..|
+00000400 d2 ea 7f b2 a2 ef 40 f2 fc 68 07 64 51 f7 c9 6e |......@..h.dQ..n|
+00000410 68 eb 68 ec 15 a8 a7 7e 1d 86 8b 12 f1 33 a0 18 |h.h....~.....3..|
+00000420 21 06 f4 0a 58 4b ec 17 7d 87 2c ec ea ce 3e ce |!...XK..}.,...>.|
+00000430 02 2f 02 a5 76 61 57 dd 85 6e f5 14 d4 6b fb f9 |./..vaW..n...k..|
+00000440 64 d3 60 2c 1f 45 00 9c 50 d4 2a aa 1d f0 96 82 |d.`,.E..P.*.....|
+00000450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+*
+00000bf0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+
+```
+
+### 2.7 TS API 参考
+
+用户可通过 `sysfs` 来访问 TS 硬件,还可以通过运行用户态程序读取芯片结温。
+
+#### 2.7.1 sysfs 文件系统
+
+Linux 内核使用 `sysfs` 文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整。`sysfs` 虚拟文件系统一般被挂载在 `/sys` 目录下。TS 一旦被注册到 Linux 中的 Thermal 框架中之后,通过 `sysfs` 虚拟文件系统,可以很容易查看到 TS 的信息。
+
+TS sysfs位于 `/sys/class/thermal/thermal_zone0/` 目录下,文件结构如下:
+
+```shell
+.
+|-- available_policies
+|-- integral_cutoff
+|-- k_d
+|-- k_i
+|-- k_po
+|-- k_pu
+|-- mode
+|-- offset
+|-- passive
+|-- policy
+|-- slope
+|-- subsystem -> ../../../../class/thermal
+|-- sustainable_power
+|-- temp
+|-- type
+|-- uevent
+
+```
+
+启动 Linux 之后,运行下列命令:
+
+```shell
+[root@canaan ~ ]#cat /sys/class/thermal/thermal_zone0/temp
+7182
+......
+
+```
+
+`7182` 这个值表示的含义为:读取 tsensor 寄存器的值,并没有做任何数学运算。相应的数学表达式如下:
+
+```text
+
+code = ts_val & 0xfff;
+temp = (1e-10 * pow(code, 4) * 1.01472 - 1e-6 * pow(code, 3) * 1.10063 + 4.36150 * 1e-3 * pow(code, 2) - 7.10128 * code + 3565.87);
+
+```
+
+- ts_val:实际读取 TS 寄存器的值;
+- code:TS 寄存器的值保留低12位得到的结果;
+- temp:计算得到的温度值。
+
+#### 2.7.2 用户态访问 TS
+
+编写一个用户态应用程序,用户态应用程序通过标准的系统调用open()、close()、read()等函数陷入到内核态,最终会调用 TS 驱动中注册的接口中,以测试 TS 功能。
+
+目前用户态应用程序已经编写完成,生成的可执行文件在 `/usr/bin/ts_test_demo` 目录下。
+
+运行步骤如下:
+
+1. 进入应用程序 demo 目录;
+1. 在 demo 目录下运行 ts demo,循环次数作为参数;
+1. 执行 ts demo。
+1. 改变循环次数,重新执行 ts demo。
+
+启动小核Linux之后,运行下列命令:
+
+```shell
+[root@canaan ~ ]#cd /usr/bin/
+[root@canaan /usr/bin ]#./ts_test_demo 5
+ts_val: 0x1c08, TS = 42.176993 C
+ts_val: 0x1c07, TS = 41.875168 C
+ts_val: 0x1c06, TS = 41.573277 C
+ts_val: 0x1c07, TS = 41.875168 C
+ts_val: 0x1c0a, TS = 42.780447 C
+[root@canaan ~ ]#
+
+```
+
+### 2.8 TRNG API 参考
+
+用户可通过 `sysfs` 来访问 TRNG 硬件,还可以通过运行用户态程序读取真随机数。
+
+#### 2.8.1 sysfs 文件系统
+
+Linux 内核使用 `sysfs` 文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整。`sysfs` 虚拟文件系统一般被挂载在 `/sys` 目录下。TRNG 一旦被注册到 Linux 中的 HW random 框架中之后,通过 `sysfs` 虚拟文件系统,可以很容易查看到 TRNG 的信息。
+
+TRNG sysfs位于 `/sys/class/misc/hw_random/` 目录下,文件结构如下:
+
+```shell
+.
+|-- dev
+|-- rng_available
+|-- rng_current
+|-- rng_selected
+|-- subsystem -> ../../../../class/misc
+|-- uevent
+
+```
+
+启动 Linux 之后,运行下列命令:
+
+```shell
+[root@canaan ~ ]# cat /sys/class/misc/hw_random/rng_current
+91213000.trng
+[root@canaan ~ ]# cat /sys/class/misc/hw_random/rng_available
+91213000.trng
+
+```
+
+#### 2.8.2 用户态访问 TRNG
+
+编写一个用户态应用程序,用户态应用程序通过标准的系统调用open()、close()、read()等函数陷入到内核态,最终会调用 TRNG 驱动中注册的接口中,查看每次读取得到的数据是否不一致,从而测试 TRNG 的功能。
+
+目前用户态应用程序已经编写完成,生成的可执行文件在 */usr/bin/trng_test_demo* 目录下。
+
+运行步骤如下:
+
+1. 进入应用程序 demo 目录;
+1. 在 demo 目录下运行 trng demo;
+1. 执行 trng demo。
+1. 重复执行 trng demo,查看每次读取的随机数是否一致。
+
+启动小核Linux之后,运行下列命令:
+
+```text
+[root@canaan ~ ]#cd /usr/bin/
+[root@canaan /usr/bin ]#./trng_test_demo
+2C 10 B3 29 C3 98 10 41 3C 2A 90 75 EB C4 61 A5
+[root@canaan /usr/bin ]#./trng_test_demo
+6E AB 46 DD C1 7D FC 97 65 02 0C 58 1E A1 80 B9
+[root@canaan ~ ]#
+
+```
+
+默认每次打印16个字节的随机数,每次打印的随机数不同。
+
+### 2.9 open
+
+【描述】
+
+打开设备节点。
+
+【语法】
+
+`int open(const char *pathname, int flags)`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+| ------- | ---------------- | --------- |
+| patchname | 全路径设备名 | 输入 |
+| flags | 打开方式 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 负值 | 错误 |
+| 正值 | 打开的文件描述符id |
+
+【需求】
+
+- 头文件:`sys/types.h`, `sys/stat.h`, `fcntl.h`
+
+【注意】
+
+无
+
+【举例】
+
+`int fd = open("/dev/i2c-0", O_RDWR);`
+
+### 2.10 ioctl
+
+【描述】
+
+设备控制。
+
+【语法】
+
+`int ioctl(int fd, unsigned long request, ...);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+| ------- | ---------------- | --------- |
+| fd | 打开的文件描述符 | 输入 |
+| request | 32位命令码 | -- |
+
+命令码请参考`include/uapi/asm-generic/ioctl.h`
+
+【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| 负值 | 错误 |
+| 非负值 | 成功 |
+
+【需求】
+
+- 头文件:`sys/ioctl.h`
+
+【注意】
+
+无
+
+【举例】
+
+`err = ioctl(file, I2C_SMBUS, &args);`
+
+### 2.11 read
+
+【描述】
+
+读取打开的文件描述符内容。
+
+【语法】
+
+`ssize_t read(int fd, void *buf, size_t count);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+| ------- | ---------------- | --------- |
+| fd | 打开的文件描述符 | 输入 |
+| buf | 存放输出数据的空间 | 输出 |
+
+【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| -1 | 错误 |
+| 非负值 | 读取到的字节数 |
+
+【需求】
+
+- 头文件:`unistd.h`
+
+【注意】
+
+无
+
+【举例】
+
+`int n = read(fd, &buf, num);`
+
+### 2.12 write
+
+【描述】
+
+向打开的文件描述符写数据。
+
+【语法】
+
+`ssize_t write(int fd, const void *buf, size_t count);`
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+| ------- | ---------------- | --------- |
+| fd | 打开的文件描述符 | 输入 |
+| buf | 存放数据的空间 | 输出 |
+| count | 需要写入的长度 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+| ------ | -------------------- |
+| -1 | 错误 |
+| 0 | 未写入 |
+| 正值 | 写入的字节数 |
+
+【需求】
+
+- 头文件:`unistd.h`
+
+【注意】
+
+无
+
+【举例】
+
+`int n = write(fd, &buf, num);`
diff --git a/zh/01_software/board/osdrv/images/4c13711677925f891f88c5f3451b1630.png b/zh/01_software/board/osdrv/images/4c13711677925f891f88c5f3451b1630.png
new file mode 100644
index 0000000..755cdbd
Binary files /dev/null and b/zh/01_software/board/osdrv/images/4c13711677925f891f88c5f3451b1630.png differ
diff --git a/zh/01_software/board/osdrv/images/56a2648fb35340c3f3ab275da91b1247.png b/zh/01_software/board/osdrv/images/56a2648fb35340c3f3ab275da91b1247.png
new file mode 100644
index 0000000..10c8564
Binary files /dev/null and b/zh/01_software/board/osdrv/images/56a2648fb35340c3f3ab275da91b1247.png differ
diff --git a/zh/01_software/board/osdrv/images/78ce42062b1b3c4eea2724d722f587f5.png b/zh/01_software/board/osdrv/images/78ce42062b1b3c4eea2724d722f587f5.png
new file mode 100644
index 0000000..d851698
Binary files /dev/null and b/zh/01_software/board/osdrv/images/78ce42062b1b3c4eea2724d722f587f5.png differ
diff --git a/zh/01_software/board/osdrv/images/899387ab5aa9eecd9d5ffa35982da43f.png b/zh/01_software/board/osdrv/images/899387ab5aa9eecd9d5ffa35982da43f.png
new file mode 100644
index 0000000..309a1d6
Binary files /dev/null and b/zh/01_software/board/osdrv/images/899387ab5aa9eecd9d5ffa35982da43f.png differ
diff --git a/zh/01_software/board/osdrv/images/8dab3c90fd04037c474ffe4dcb6ebcad.png b/zh/01_software/board/osdrv/images/8dab3c90fd04037c474ffe4dcb6ebcad.png
new file mode 100644
index 0000000..d09b6f6
Binary files /dev/null and b/zh/01_software/board/osdrv/images/8dab3c90fd04037c474ffe4dcb6ebcad.png differ
diff --git a/zh/01_software/board/osdrv/images/907ec0b9b9b7bafdd715a7e6a293fe33.jpeg b/zh/01_software/board/osdrv/images/907ec0b9b9b7bafdd715a7e6a293fe33.jpeg
new file mode 100644
index 0000000..908d1db
Binary files /dev/null and b/zh/01_software/board/osdrv/images/907ec0b9b9b7bafdd715a7e6a293fe33.jpeg differ
diff --git a/zh/01_software/board/osdrv/images/9c1b166e281b6ae4532a24e3fb4ab544.png b/zh/01_software/board/osdrv/images/9c1b166e281b6ae4532a24e3fb4ab544.png
new file mode 100644
index 0000000..bd7d121
Binary files /dev/null and b/zh/01_software/board/osdrv/images/9c1b166e281b6ae4532a24e3fb4ab544.png differ
diff --git a/zh/01_software/board/osdrv/images/a8681956288af97fa64d83522360b540.png b/zh/01_software/board/osdrv/images/a8681956288af97fa64d83522360b540.png
new file mode 100644
index 0000000..c596b8b
Binary files /dev/null and b/zh/01_software/board/osdrv/images/a8681956288af97fa64d83522360b540.png differ
diff --git a/zh/01_software/board/osdrv/images/befd53872f5678c01b6a9680165bf4f0.png b/zh/01_software/board/osdrv/images/befd53872f5678c01b6a9680165bf4f0.png
new file mode 100644
index 0000000..af09383
Binary files /dev/null and b/zh/01_software/board/osdrv/images/befd53872f5678c01b6a9680165bf4f0.png differ
diff --git a/zh/01_software/board/osdrv/images/c243ed2abdfa36f6d918274132ae3bff.png b/zh/01_software/board/osdrv/images/c243ed2abdfa36f6d918274132ae3bff.png
new file mode 100644
index 0000000..3683b18
Binary files /dev/null and b/zh/01_software/board/osdrv/images/c243ed2abdfa36f6d918274132ae3bff.png differ
diff --git a/zh/01_software/board/osdrv/images/canaan-cover.png b/zh/01_software/board/osdrv/images/canaan-cover.png
new file mode 100644
index 0000000..0319765
Binary files /dev/null and b/zh/01_software/board/osdrv/images/canaan-cover.png differ
diff --git a/zh/01_software/board/osdrv/images/d57457f620fd3083c6a6da9f4da78a1e.png b/zh/01_software/board/osdrv/images/d57457f620fd3083c6a6da9f4da78a1e.png
new file mode 100644
index 0000000..c7a2ad4
Binary files /dev/null and b/zh/01_software/board/osdrv/images/d57457f620fd3083c6a6da9f4da78a1e.png differ
diff --git a/zh/01_software/board/osdrv/images/da2c89ea92bffca6b1dd4d9b09efd855.png b/zh/01_software/board/osdrv/images/da2c89ea92bffca6b1dd4d9b09efd855.png
new file mode 100644
index 0000000..5d5c5a2
Binary files /dev/null and b/zh/01_software/board/osdrv/images/da2c89ea92bffca6b1dd4d9b09efd855.png differ
diff --git a/zh/01_software/board/osdrv/images/e19ef72c437edd32f4e48ce8e8eb6552.png b/zh/01_software/board/osdrv/images/e19ef72c437edd32f4e48ce8e8eb6552.png
new file mode 100644
index 0000000..c28b789
Binary files /dev/null and b/zh/01_software/board/osdrv/images/e19ef72c437edd32f4e48ce8e8eb6552.png differ
diff --git a/zh/01_software/board/osdrv/images/e20100e34c268ad615e69966cb28e5a6.png b/zh/01_software/board/osdrv/images/e20100e34c268ad615e69966cb28e5a6.png
new file mode 100644
index 0000000..3273784
Binary files /dev/null and b/zh/01_software/board/osdrv/images/e20100e34c268ad615e69966cb28e5a6.png differ
diff --git a/zh/01_software/board/osdrv/images/f09a29152cf3ccca9d2e2602a62f6d64.png b/zh/01_software/board/osdrv/images/f09a29152cf3ccca9d2e2602a62f6d64.png
new file mode 100644
index 0000000..49e0c95
Binary files /dev/null and b/zh/01_software/board/osdrv/images/f09a29152cf3ccca9d2e2602a62f6d64.png differ
diff --git a/zh/01_software/board/osdrv/images/fd9ce5570d02a5a3248c036db4bf4ca2.png b/zh/01_software/board/osdrv/images/fd9ce5570d02a5a3248c036db4bf4ca2.png
new file mode 100644
index 0000000..41a0eb5
Binary files /dev/null and b/zh/01_software/board/osdrv/images/fd9ce5570d02a5a3248c036db4bf4ca2.png differ
diff --git a/zh/01_software/board/osdrv/images/logo.png b/zh/01_software/board/osdrv/images/logo.png
new file mode 100644
index 0000000..aa48558
Binary files /dev/null and b/zh/01_software/board/osdrv/images/logo.png differ
diff --git a/zh/01_software/board/osdrv/images/modetest_osd_ar24_tiles.png b/zh/01_software/board/osdrv/images/modetest_osd_ar24_tiles.png
new file mode 100644
index 0000000..1e73114
Binary files /dev/null and b/zh/01_software/board/osdrv/images/modetest_osd_ar24_tiles.png differ
diff --git a/zh/01_software/board/osdrv/images/modetest_osd_rg16_tiles.png b/zh/01_software/board/osdrv/images/modetest_osd_rg16_tiles.png
new file mode 100644
index 0000000..350f4d0
Binary files /dev/null and b/zh/01_software/board/osdrv/images/modetest_osd_rg16_tiles.png differ
diff --git a/zh/01_software/board/osdrv/images/modetest_video_nv12_smpte.png b/zh/01_software/board/osdrv/images/modetest_video_nv12_smpte.png
new file mode 100644
index 0000000..882052a
Binary files /dev/null and b/zh/01_software/board/osdrv/images/modetest_video_nv12_smpte.png differ
diff --git a/zh/01_software/board/osdrv/images/otp_linux.png b/zh/01_software/board/osdrv/images/otp_linux.png
new file mode 100755
index 0000000..dfe753a
Binary files /dev/null and b/zh/01_software/board/osdrv/images/otp_linux.png differ
diff --git a/zh/01_software/board/osdrv/images/otp_rtt.png b/zh/01_software/board/osdrv/images/otp_rtt.png
new file mode 100755
index 0000000..637470a
Binary files /dev/null and b/zh/01_software/board/osdrv/images/otp_rtt.png differ
diff --git a/zh/01_software/board/osdrv/images/pmu_hw_bottom_view.jpg b/zh/01_software/board/osdrv/images/pmu_hw_bottom_view.jpg
new file mode 100644
index 0000000..41df74d
Binary files /dev/null and b/zh/01_software/board/osdrv/images/pmu_hw_bottom_view.jpg differ
diff --git a/zh/01_software/board/osdrv/images/pmu_hw_top_view.jpg b/zh/01_software/board/osdrv/images/pmu_hw_top_view.jpg
new file mode 100644
index 0000000..514fd24
Binary files /dev/null and b/zh/01_software/board/osdrv/images/pmu_hw_top_view.jpg differ
diff --git a/zh/01_software/board/osdrv/images/pwm-driver.png b/zh/01_software/board/osdrv/images/pwm-driver.png
new file mode 100755
index 0000000..0f7ae5e
Binary files /dev/null and b/zh/01_software/board/osdrv/images/pwm-driver.png differ
diff --git a/zh/01_software/board/osdrv/images/rtc-driver.png b/zh/01_software/board/osdrv/images/rtc-driver.png
new file mode 100755
index 0000000..e0527e6
Binary files /dev/null and b/zh/01_software/board/osdrv/images/rtc-driver.png differ
diff --git a/zh/01_software/board/osdrv/images/timer-driver.png b/zh/01_software/board/osdrv/images/timer-driver.png
new file mode 100755
index 0000000..ff324d5
Binary files /dev/null and b/zh/01_software/board/osdrv/images/timer-driver.png differ
diff --git a/zh/01_software/board/osdrv/images/trng_linux.png b/zh/01_software/board/osdrv/images/trng_linux.png
new file mode 100755
index 0000000..5e4f851
Binary files /dev/null and b/zh/01_software/board/osdrv/images/trng_linux.png differ
diff --git a/zh/01_software/board/osdrv/images/ts_linux.png b/zh/01_software/board/osdrv/images/ts_linux.png
new file mode 100755
index 0000000..8924592
Binary files /dev/null and b/zh/01_software/board/osdrv/images/ts_linux.png differ
diff --git a/zh/01_software/board/osdrv/images/ts_rtt.png b/zh/01_software/board/osdrv/images/ts_rtt.png
new file mode 100755
index 0000000..ba53e44
Binary files /dev/null and b/zh/01_software/board/osdrv/images/ts_rtt.png differ
diff --git a/zh/01_software/board/osdrv/images/wdt_driver_model.png b/zh/01_software/board/osdrv/images/wdt_driver_model.png
new file mode 100644
index 0000000..fb14dc7
Binary files /dev/null and b/zh/01_software/board/osdrv/images/wdt_driver_model.png differ
diff --git "a/zh/01_software/pc/dewarp/K230_SDK_Dewarp\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/zh/01_software/pc/dewarp/K230_SDK_Dewarp\344\275\277\347\224\250\346\214\207\345\215\227.md"
new file mode 100644
index 0000000..fa13004
--- /dev/null
+++ "b/zh/01_software/pc/dewarp/K230_SDK_Dewarp\344\275\277\347\224\250\346\214\207\345\215\227.md"
@@ -0,0 +1,92 @@
+# K230 SDK Dewarp 使用指南
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/canaan-lable.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍K230 VICAP 模块中Dewarp标定及使用方法。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ---- |
+| DW | Dewarp |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | -------- | ---------- | ---------- |
+| V1.0 | 初版 | 刘家安、黄子懿 | 2023-06-08 |
+
+## 1. Dewarp 标定介绍
+
+Dewarp 标定过程产生一个包含相机矩阵和畸变系数的 YAML 文件,K230 SDK 在构建时会通过这个 YAML 文件来生成 remap 文件,并放入大核根文件系统的 `/bin` 目录下,在配置 VICAP 时将 `k_vicap_dev_attr` 结构体的 `dw_enable` 设为1来启用 Dewarp,VICAP 会在当前路径下查找 `-x.bin` (例如对于 IMX335 全分辨率,即为 `imx335-2592x1944.bin`)文件作为 Dewarp 配置文件进行畸变矫正。
+
+### 1.1 抓取图像
+
+1. 在同一平面上旋转棋盘并拍摄至少 20 张图片
+1. 选择涵盖所有角度至少10张照片保存到一个固定目录,推荐选择差异较大的图片
+
+![标定图片示例](images/calibration.png)
+
+可以使用 sample_vicap.elf 这个程序进行抓取,将保存的YUV文件通过ffmpeg转换为 png/bmp 等易于OpenCV读取的图像格式,参考如下命令
+
+```shell
+ffmpeg -f rawvideo -pixel_format nv12 -video_size 2592x1944 -i dev_00_chn_00_2592x1944_0000.yuv420sp 0.png
+```
+
+### 1.2 执行标定程序
+
+创建包含图片路径的xml文件,例如 `imx335-2592x1944-0.xml`,填入上一步保存的图片路径,形如
+
+```xml
+
+
+
+images/imx335-2592x1944-0/0.png
+...
+
+
+```
+
+编辑 `run.bat`,将最后一个参数改为刚才创建的 XML 文件路径,将 -o 参数改为保存输出的 YAML 文件路径,然后执行 `run.bat`
+
+## 2. Dewarp 与 VICAP 模块配合使用
+
+注意:**打开Dewarp需要一个额外的vb pool,并将设备属性的 buf_size改为sensor输出buffer大小,可以参考 `sample_vicap.c` 中 `sample_vicap_vb_init` 函数的做法来初始化vb pool。**
+
+在上一步中生成的 YAML 文件需要放入 `/src/big/mpp/userapps/src/sensor/dewarp` 目录下,编译 K230 SDK。
+
+如果之前已经编译过 K230 SDK,那么可以不用完整重新编译,放置好 YAML 文件后直接运行 `make mpp-apps` 即可,如果需要制作镜像则还需要运行 `make build-image`
diff --git a/zh/01_software/pc/dewarp/images/calibration.png b/zh/01_software/pc/dewarp/images/calibration.png
new file mode 100755
index 0000000..d9092df
Binary files /dev/null and b/zh/01_software/pc/dewarp/images/calibration.png differ
diff --git a/zh/01_software/pc/dewarp/images/canaan-cover.png b/zh/01_software/pc/dewarp/images/canaan-cover.png
new file mode 120000
index 0000000..f05561a
--- /dev/null
+++ b/zh/01_software/pc/dewarp/images/canaan-cover.png
@@ -0,0 +1 @@
+../../../../template/images/canaan-cover.png
\ No newline at end of file
diff --git a/zh/01_software/pc/dewarp/images/canaan-lable.png b/zh/01_software/pc/dewarp/images/canaan-lable.png
new file mode 120000
index 0000000..b49cdc1
--- /dev/null
+++ b/zh/01_software/pc/dewarp/images/canaan-lable.png
@@ -0,0 +1 @@
+../../../../template/images/canaan-lable.png
\ No newline at end of file
diff --git "a/zh/01_software/pc/pqtools/K230_SDK_Tuning_Tool\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/zh/01_software/pc/pqtools/K230_SDK_Tuning_Tool\344\275\277\347\224\250\346\214\207\345\215\227.md"
new file mode 100644
index 0000000..fdcc91c
--- /dev/null
+++ "b/zh/01_software/pc/pqtools/K230_SDK_Tuning_Tool\344\275\277\347\224\250\346\214\207\345\215\227.md"
@@ -0,0 +1,360 @@
+# K230 SDK Tuning Tool使用指南
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档描述了Tuning Tool的使用说明。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|------|------------------------------------------------------------|
+| BLS | Black Level Subtraction |
+| HDR | High Dynamic Range |
+| 3A | AE(Auto Exposure)、AF(Auto Focus)、AWB(Auto White Balance) |
+| DG | Digital Gain |
+| LSC | Lens Shading Correction |
+| WB | White Balance |
+| DM | Demosaic |
+| DPCC | Defect Pixel Cluster Correction |
+| DPF | Denoising Prefilter |
+| CNR | Color Noise Reduction |
+| CAC | Chromatic Aberration Correction |
+| CA | Color Adjustment |
+| 2DNR | 2D Noise Reduction |
+| 3DNR | 3D Noise Reduction |
+| GC | Gamma Correction |
+| GE | Green Equilibrate |
+| EE | Edge Enhance |
+| CP | Color Processing |
+| ROI | Region Of Interested |
+| DW | De-warp |
+| TS | Tuning-Server |
+| TC | Tuning-Client |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|-----------------------------------|--------|------------|
+| V1.0 | 初版 | 郭世栋 | 2023-02-20 |
+| V1.1 | 更新部分功能描述 | 刘家安 | 2023-04-07 |
+| V1.2 | 更新部分功能描述 新增部分功能描述 | 郭世栋 | 2023-05-05 |
+
+## 1. 模块软件架构
+
+![arch](images/28a799580bb5670cb8d29dc709a4dcc6.png)
+
+图1-1
+
+## 2. Tuning Tool的连接及启用
+
+### 2.1 工具获取路径
+
+| **文件名** | **存放位置** | **功能** |
+|-------------------------------------------|--------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|
+| PC tuning-tool软件包(tuning-client.exe) | relaese的源码包k230_sdk/tools/tuning-tool-client/Kendyte_ISP_Tool_TuningClient_RC22.5_Pre_596062-20221116.7z | 用于图像dump,ISP调试等PC端工具 |
+| tsconfig.json | 小核文件系统 /app/tuning-server/ | DUMP数据用配置文件 |
+| run_tuning_server.sh | 小核文件系统 /app/tuning-server/ | 启动tuning-server脚本 |
+| 3aconfig.json | 小核文件系统 /app/tuning-server/ | 3a模块的配置参数 |
+| tuning-server | 小核文件系统 /app/tuning-server/ | tuning-server可执行程序,被run_tuning_server.sh调用 |
+| sample_sys_init.elf | 大核/bin/ | ISP demo(包含少部分ISP功能,已经不再使用) |
+| sample_vicap_dump.elf | 大核/bin/ | 基于VICAP的ISP demo(包括基本ISP pipeline) |
+**表2-1 文件列表**
+
+### 2.2 环境编译
+
+Tuning-tool依赖板端小核系统的tuning-server程序通信,依赖板端大核系统的ISP demo,demo由sample_sys_init.elf替换为sample_vicap_dump.elf,包含基本ISP pipeline功能。
+
+根据release源码包中的README.md编译出镜像,烧写至板端。Tuning-server相关组件以及应用程序将存放在小核/app/tuning-server和/lib/tuning-server中。
+
+### 2.3 启动流程
+
+1. 板端小核配置IP
+1. 板端小核插入k_ipcm.ko模块,cd /mnt; insmod k_ipcm.ko
+1. 板端小核启动tuning-server
+1. 板端大核启动ISP demo,cd /bin/; ./sample_vicap_dump.elf -dev \ -sensor \ -chn \ -ofmt \ -preview \
+1. PC端启动tuning-tool-client
+
+### 2.4 修改配置文件
+
+#### 2.4.1 小核
+
+1. tsconfig.json
+
+用于配置DUMP功能的图像数据参数,默认基于ov9732(目前仅支持ov9732)。
+修改“convert_to_Bmp”为1时,将dump的数据保存BMP并发送到PC指定保存目录,此时预览窗口将显示BMP。
+修改“convert_to_Bmp”为0时,将dump的原始数据(yuvNV12)保存并发送到PC指定保存目录,此时预览窗口将无法显示。
+
+| **关键字** | **默认值** | **功能** |
+|----------------|---------------------------|--------------------------------------------------------------------------------------------------------------------------|
+| Width | 1280 | DUMP图像的宽 |
+| Height | 720 | DUMP图像的高 |
+| Align | 1 | 对齐字节数 |
+| stride | 1280 | 对齐后的数据宽度 |
+| pixel_format | 27 | DUMP图像格式,27/30: YUV NV12 |
+| insert_pic | 0 | 插帧测试,0:关闭,1:开启,默认关闭 |
+| convert_to_Bmp | 1 | DUMP后的图像转换为BMP,默认开启,将在tuning-tool中显示转换后的BMP,关闭后将不进行转换,tuning-tool显示窗口将无法显示图像 |
+| bayer_pattern | 1 | 0: BGGR,1: RGGB,默认RGGB,暂时不生效 |
+| insertFilename | NON | 插帧测试文件全路径: 默认为空即可 |
+| save_path | /app/tuning-server/mount/ | DUMP数据在板端的存储路径,板端无mount目录,需自行创建 |
+| dev_num | 0 | 设备ID编号,默认0,0:sensor0, 1:sensor1 |
+| chn_num | 0 | 绑定通道编号,默认0 |
+| exp_type | 0 | sensor曝光模式,当前不生效,默认为0 |
+**表2-2 配置参数说明**
+
+1. run_tuning_server.sh,用于启动tuning-server,直接按照步骤3)执行即可。
+1. 启动tuning-server,cd /app/tuning-server; ./run_tuning_server.sh
+
+#### 2.4.2 大核
+
+1. RT-Smart启动ISP-demo
+
+> cd /bin/; ./sample_vicap_dump.elf
+ISP-demo启动方法
+./sample_vicap_dump.elf -dev \ -sensor \ -chn \ -ofmt \ -preview \
+./sample_vicap_dump.elf -dev 0 -sensor 0 -chn 0
+./sample_vicap_dump.elf -dev 0 -sensor 2 -chn 0
+通过指定sensor num决定使用哪个sensor配置,preview开关决定是否进行预览
+
+#### 2.4.3 PC tuning tool
+
+1. 启动tuning-tool
+
+打开release的tuning-tool工具包中的tuning-client.exe。路径为:k230_sdk/tools/tuning-tool-client/Kendyte_ISP_Tool_TuningClient_RC22.5_Pre_596062-20221116.7z
+参照章节3.1配置IP即可。
+
+## 3. Tuning Tool界面介绍
+
+![图形用户界面, 文本, 应用程序, 电子邮件 描述已自动生成](images/ebd1d0f0d38884a6e0eb9d4b370e006d.png)
+
+图3-1
+
+如图3-1所示为tuning-tool-client的基本操作UI全部展开后共五个区域
+
+① 菜单操作区域:用于ISP的选择、参数导入/导出、通信连接配置
+
+② 图像操作区域:抓取图像
+
+③ 功能区域:用于ISP各模块UI的切换
+
+④ 调试区域:用于调试某一个模块的参数
+
+⑤ 回显区域:用于打印部分参数下发和接收的日志
+
+### 3.1 连接板端tuning-server
+
+#### 3.1.1 使用HTTP方式连接板端tuning-server
+
+![图形用户界面, 文本, 应用程序 描述已自动生成](images/cde5234f5012c9f0b08ecfa108470466.png)
+图3-2
+
+SDK默认支持HTTP方式连接,依次点击Edit-\>Preferences-\>Server Settings将弹出配置窗口,如图3-2,图3-3。
+
+![图形用户界面, 文本, 应用程序, 电子邮件 描述已自动生成](images/89e7206f4f032031939db08d5242a71e.png)
+图3-3
+
+选择HTTP模式,保证PC与板端连接的网络处于同一网段,在Server的第一项指定板端的IP,第二项指定端口默认即可,依次点击add-\>apply后关闭窗口即可完成配置,如果板端tuning-server已经启动,则会自动完成连接,任意切换图3-1中③区域的模块,则会看到tuning-server端的函数打印。
+
+### 3.2 在线调试界面及功能描述
+
+本节只是简单介绍一些tuning tool界面上调试模块的主要功能,具体的调试策略及步骤将在以后的图像调优文档中进行详细的描述。
+
+#### 3.2.1 Input Control
+
+Sensor Driver:选择sensor的驱动配置.drv
+
+Resolution:sensor配置出图的resolution
+
+Enable Test Pattern:是否打开sensor test pattern
+
+Connection Status:查看连接状态
+
+Bayer Pattern: bayer排序
+
+#### 3.2.2 Register
+
+支持用户对ISP的寄存器进行读写。
+
+支持对sensor寄存器的读写,目前默认对sensor0进行读写,若读写sensor1,需要配置tsconfig.json中dev_num参数为1即可。
+
+#### 3.2.3 3A Config
+
+目前未使用,已分解到其他地方。
+
+#### 3.2.4 Calibration Data
+
+将标定工具生成的xml文件导入并显示在界面上。
+
+#### 3.2.5 High Dynamic Range 2
+
+暂未支持。
+
+#### 3.2.6 Exposure Control
+
+支持获取自动曝光和增益,支持通过工具界面设置曝光和增益,设置时需要关闭自动曝光功能。
+
+#### 3.2.7 Digital Gain
+
+用于对ISP Digital Gain使能控制及调节大小。
+
+#### 3.2.8 Black Level Subtraction
+
+提供与Sensor相关的黑电平校正,可对R、Gr、Gb、B四通道进行设置。
+
+#### 3.2.9 Lens Shading Correction
+
+提供镜头阴影校正,校准系数由标定工具生成。
+
+#### 3.2.10 White Balance
+
+提供白平衡R、Gr、Gb、B四通道增益设置;
+
+通过调节3x3 CCM矩阵及偏移量可完成颜色偏差的校准。
+
+#### 3.2.11 Wide Dynamic Range 4
+
+提供对图像全局和局部对比度的调整。
+
+#### 3.2.12 Defect Pixel Cluster Correction
+
+提供对像素坏点的检测及校准的功能,通过选择set可设置不同的校准方法。
+
+#### 3.2.13 Denoising Prefilter
+
+双边滤波降噪模块。
+
+#### 3.2.14 Demosaicing 2
+
+通过插值将Bayer格式的Raw图转为RGB图,并提供去摩尔纹、去紫边、锐化及降噪处理功能。
+
+#### 3.2.15 Color Noise Reduction
+
+未支持。
+
+#### 3.2.16 Chromatic Aberration Correction
+
+用于校准主要由镜头引入的色差,由标定工具生成校准参数。
+
+#### 3.2.17 Color Adjustment
+
+分为CA和DCI两块。
+
+CA模块用于调节图像的饱和度。根据图像亮度或者原饱和度的变化来调整饱和度,达到局部调整饱和度的目的,让亮区域的颜色更鲜艳以及消除暗区域或低饱和度区域的彩噪。
+
+DCI模块实现对图像的动态对比度调整。
+
+#### 3.2.18 3D Noise Reduction 3
+
+通过调整参数配置,对图像降噪强度的调节。
+
+#### 3.2.19 Gamma Correction 2
+
+支持客户自定义gamma,该模式下可更改gamma指数。
+
+#### 3.2.20 Green Equilibrate
+
+校准Gr与Gb两通道的不平衡,可设置不同的绿平衡强度。
+
+#### 3.2.21 Edge Enhance
+
+用于提升图像的清晰度。通过设置合适的参数,提升图像清晰度的同时,也可抑制噪声的增强。
+
+#### 3.2.22 Color Processing
+
+颜色处理模块,可调节图像的对比度、亮度、饱和度及色调,设置不同的颜色喜好或风格。
+
+#### 3.2.23 Rgbir
+
+暂未支持。
+
+#### 3.2.24 Auto Exposure 2
+
+工具界面暂不支持调节自动参数。
+
+#### 3.2.25 Region Of Interested
+
+支持通过工具设置8个ROI窗口,第一次设置窗口数量超过1后,将不能再关闭ROI模式,ROI数量最少1个。开启ROI模式需要,需要在Auto Exposure2模块Scene Evaluation Mode中选择FIX模式并enable AE才能开启ROI模式。
+
+#### 3.2.26 Auto Focus
+
+因涉及到自动功能,暂未支持。
+
+#### 3.2.27 Auto White Balance
+
+因涉及到自动功能,暂未支持。
+
+#### 3.2.28 Dewarp
+
+已经移到单独的Dewarp tool里。
+
+### 3.3 抓取图片
+
+#### 3.3.1 选择保存目录
+
+![图形用户界面, 文本, 应用程序, 电子邮件 描述已自动生成](images/cc9d6c96f9050f3e754279087fba464f.png)
+图3-4
+
+点击菜单-\>Edit-\>preferences,弹窗如图3-4,点击Capture Settings,点击Browser按钮,选择保存数据的路径,关闭窗口即可。
+
+#### 3.3.2 采集图像
+
+当前仅支持dump 8bit yuvNV12格式数据,点击![cam](images/857dd7d1140476e6a225b78297b9b2fe.png),等待预览窗口弹出,即可将转换为BMP的图像传送至设置的保存路径中,并显示,原始yuv数据则存放在文件系统中。
+
+如果yuv和BMP数据都需要,可以考虑使用挂载盘或者tftp等功能将数据发出。如果使用挂载方式。在tsconfig.json中修改"save_path"值,默认"save_path": "/app/tuning-server/mount/",可以修改tuning-server dump数据时原始数据的存储路径,可将路径设置为挂载目录,直接会将yuv和BMP文件存储在该路径下。
+
+如果不需要BMP数据,仅使用yuv数据,则可以在tsconfig.json中设置"convert_to_Bmp": 0,关闭转换BMP功能,这样yuv数据将直接发送至PC,预览窗口将不再显示图像。
+
+板端存储空间有限,在dump一定帧数后将无法dump,需要手动清理数据后再执行该功能。
+
+tsconfig.json文件可直接修改,保存后执行sync命令,此时capture功能将更新,无需退出tuning-server后再修改。
+
+### 3.4 参数的导入与导出
+
+#### 3.4.1 参数导入
+
+工具默认支持导入的参数文件为标准xml格式,分为标定参数和tuning参数两部分,支持PC本地和远程(板端本地)导入。
+
+依次点击File-\>Import All Settings-\>Local/Remote即可在弹出的窗口中选择需要导入的参数xml文件,如图3-5所示。在tuning-tool-client中默认自带多种sensor的参考xml,可用于进行测试。也可在板端Linux文件系统中导入提前存放的xml文件。
+
+![图形用户界面, 应用程序 描述已自动生成](images/c82b2bcd7ec8b6ad2d9af0c3778354b3.png)
+
+图3-5
+
+#### 3.4.2 参数导出
+
+工具默认导出方式会将标定参数和在线调试参数两部分汇总为一个xml文件存放。
+
+依次点击File-\>Export All Settings后,将在板端保存isp-yyyy-MM-dd_HH-mm-ss.xml文件,如:isp-2023-02-07_11-13-17.xml。
diff --git a/zh/01_software/pc/pqtools/images/28a799580bb5670cb8d29dc709a4dcc6.png b/zh/01_software/pc/pqtools/images/28a799580bb5670cb8d29dc709a4dcc6.png
new file mode 100644
index 0000000..48c05eb
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/28a799580bb5670cb8d29dc709a4dcc6.png differ
diff --git a/zh/01_software/pc/pqtools/images/857dd7d1140476e6a225b78297b9b2fe.png b/zh/01_software/pc/pqtools/images/857dd7d1140476e6a225b78297b9b2fe.png
new file mode 100644
index 0000000..0400699
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/857dd7d1140476e6a225b78297b9b2fe.png differ
diff --git a/zh/01_software/pc/pqtools/images/89e7206f4f032031939db08d5242a71e.png b/zh/01_software/pc/pqtools/images/89e7206f4f032031939db08d5242a71e.png
new file mode 100644
index 0000000..be279de
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/89e7206f4f032031939db08d5242a71e.png differ
diff --git a/zh/01_software/pc/pqtools/images/c82b2bcd7ec8b6ad2d9af0c3778354b3.png b/zh/01_software/pc/pqtools/images/c82b2bcd7ec8b6ad2d9af0c3778354b3.png
new file mode 100644
index 0000000..0e35cb1
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/c82b2bcd7ec8b6ad2d9af0c3778354b3.png differ
diff --git a/zh/01_software/pc/pqtools/images/canaan-cover.png b/zh/01_software/pc/pqtools/images/canaan-cover.png
new file mode 100644
index 0000000..0319765
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/canaan-cover.png differ
diff --git a/zh/01_software/pc/pqtools/images/cc9d6c96f9050f3e754279087fba464f.png b/zh/01_software/pc/pqtools/images/cc9d6c96f9050f3e754279087fba464f.png
new file mode 100644
index 0000000..6ee396e
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/cc9d6c96f9050f3e754279087fba464f.png differ
diff --git a/zh/01_software/pc/pqtools/images/cde5234f5012c9f0b08ecfa108470466.png b/zh/01_software/pc/pqtools/images/cde5234f5012c9f0b08ecfa108470466.png
new file mode 100644
index 0000000..96051d5
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/cde5234f5012c9f0b08ecfa108470466.png differ
diff --git a/zh/01_software/pc/pqtools/images/ebd1d0f0d38884a6e0eb9d4b370e006d.png b/zh/01_software/pc/pqtools/images/ebd1d0f0d38884a6e0eb9d4b370e006d.png
new file mode 100644
index 0000000..0e1b91a
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/ebd1d0f0d38884a6e0eb9d4b370e006d.png differ
diff --git a/zh/01_software/pc/pqtools/images/logo.png b/zh/01_software/pc/pqtools/images/logo.png
new file mode 100644
index 0000000..aa48558
Binary files /dev/null and b/zh/01_software/pc/pqtools/images/logo.png differ
diff --git a/zh/02_applications/ai_demos/.gitkeep b/zh/02_applications/ai_demos/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git "a/zh/02_applications/ai_demos/K230_AI_Demo\344\273\213\347\273\215.md" "b/zh/02_applications/ai_demos/K230_AI_Demo\344\273\213\347\273\215.md"
new file mode 100755
index 0000000..15e9d72
--- /dev/null
+++ "b/zh/02_applications/ai_demos/K230_AI_Demo\344\273\213\347\273\215.md"
@@ -0,0 +1,109 @@
+# K230 AI Demo介绍
+
+![cover](../tutorials/images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](../tutorials/images/logo.png)“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## K230 AI Demo
+
+### 概述
+
+K230 AI Demo集合包括人脸、身体、手部、车牌相关的检测、识别、分割任务。
+
+### 硬件环境
+
+- K230-UNSIP-LP3-EVB-V1.0/K230-UNSIP-LP3-EVB-V1.1
+- K230-USIP-IMX335-SENSOR-V1.1模组
+
+### 源码位置
+
+源码路径位于`src/reference/ai_poc`,目录结构如下:
+
+``` shell
+.
+├── build_app.sh
+├── cmake
+├── CMakeLists.txt
+├── face_detection
+├── face_emotion
+├── face_gender
+├── face_glasses
+├── face_landmark
+├── face_mask
+├── face_parse
+├── face_pose
+├── falldown_detect
+├── fitness
+├── licence_det
+├── licence_det_rec
+├── object_detect_yolov8n
+├── person_attr
+├── person_detect
+├── pose_detect
+├── shell
+├── sq_hand_det
+├── sq_handkp_class
+├── sq_handkp_det
+├── sq_handreco
+└── vehicle_attr
+```
+
+kmodel及image路径位于`src/big/kmodel/ai_poc`,目录结构如下:
+
+``` shell
+.
+├── images
+│ ├── 1024x1331.jpg
+│ ├── 1024x624.jpg
+│ ├── bus.jpg
+│ ├── car.jpg
+│ ├── falldown_elder.jpg
+│ ├── hrnet_demo.jpg
+│ ├── input_hd.jpg
+│ └── test.jpg
+└── kmodel
+ ├── face_detection_320.kmodel
+ ├── face_emotion.kmodel
+ ├── face_gender.kmodel
+ ├── face_glasses.kmodel
+ ├── face_landmark.kmodel
+ ├── face_mask.kmodel
+ ├── face_parse.kmodel
+ ├── face_pose.kmodel
+ ├── hand_det.kmodel
+ ├── handkp_det.kmodel
+ ├── hand_reco.kmodel
+ ├── licence_reco.kmodel
+ ├── LPD_320.kmodel
+ ├── LPD_640.kmodel
+ ├── person_pulc.kmodel
+ ├── vehicle.kmodel
+ ├── yolov5n-falldown.kmodel
+ ├── yolov5n.kmodel
+ ├── yolov8n_320.kmodel
+ ├── yolov8n_640.kmodel
+ └── yolov8n-pose.kmodel
+```
+
+### 编译及运行程序
+
+1.进入src/reference/ai_poc
+2.执行build_app.sh脚本(之前脚本前确保src/big/kmodel/ai_poc下已经有相应kmodel和images),会将kmodel、images、shell、elf统一拷贝生成到k230_bin文件夹
+3.将整个文件夹拷贝到板子上,在大核上执行sh脚本即可运行相应demo.
diff --git "a/zh/02_applications/business_poc/K230_\345\234\272\346\231\257\345\256\236\346\210\230_\346\231\272\350\203\275\351\227\250\351\224\201.md" "b/zh/02_applications/business_poc/K230_\345\234\272\346\231\257\345\256\236\346\210\230_\346\231\272\350\203\275\351\227\250\351\224\201.md"
new file mode 100755
index 0000000..9d81faf
--- /dev/null
+++ "b/zh/02_applications/business_poc/K230_\345\234\272\346\231\257\345\256\236\346\210\230_\346\231\272\350\203\275\351\227\250\351\224\201.md"
@@ -0,0 +1,132 @@
+# K230 场景实战-智能门锁POC
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## K230 智能门锁
+
+在K230平台开发的一套集成UI、人脸检测、人脸识别、人脸注册功能的程序。
+
+### 硬件环境
+
+- K230-USIP-LP3-EVB-V1.0/K230-USIP-LP3-EVB-V1.1
+- 配套的LCD模组
+- K230-USIP-IMX335-SENSOR-V1.1模组
+
+### 概述
+
+智能门锁程序作为一个POC项目,提供给客户如何使用lvgl、大小核通信、多媒体pipeline及ai等功能的参考,程序主要分两部分,大核端程序主要完成视频输入输出,AI处理等相关的功能,小核端完成UI及人脸特征值管理的功能,大小核通过IPCMSG进行通信,现阶段只支持sd卡启动,后续会支持emmc、norflash等启动。
+
+### 源码位置
+
+大核端程序源码路径位于`src/reference/business_poc/door_lock`,目录结构如下:
+
+```sh
+.
+├── anchors_320.cc
+├── CMakeLists.txt
+├── main.cc
+├── mbface.kmodel
+├── mobile_face.cc
+├── mobile_face.h
+├── mobile_retinaface.cc
+├── mobile_retinaface.h
+├── model.cc
+├── model.h
+├── retinaface.kmodel
+├── util.cc
+├── util.h
+└── vi_vo.h
+
+```
+
+小核端程序源码路径位于`src/little/buildroot-ext/package/door_lock`,目录结构如下:
+
+```sh
+.
+├── Config.in
+├── src
+│ ├── CMakeLists.txt
+│ └── ui
+│ ├── CMakeLists.txt
+│ ├── data
+│ │ └── img
+│ │ ├── delete.png
+│ │ ├── import.png
+│ │ └── signup.png
+│ ├── demo
+│ │ └── main.c
+│ ├── lvgl_port
+│ │ ├── CMakeLists.txt
+│ │ ├── k230
+│ │ │ ├── buf_mgt.cpp
+│ │ │ ├── buf_mgt.hpp
+│ │ │ ├── CMakeLists.txt
+│ │ │ ├── lv_port_disp.cpp
+│ │ │ └── lv_port_indev.c
+│ │ ├── lv_conf_demo.h
+│ │ ├── lv_conf.h
+│ │ └── lv_port.h
+│ └── src
+│ ├── db_proc.c
+│ ├── db_proc.h
+│ ├── main.c
+│ ├── msg_proc.cpp
+│ ├── msg_proc.h
+│ ├── scr_main.c
+│ ├── scr_signup.c
+│ ├── sdk_autoconf.h
+│ └── ui_common.h
+└── src.mk
+
+```
+
+#### 编译程序
+
+大核程序编译:在`k230_sdk`目录下执行`make poc`,在`k230_sdk/src/reference/business_poc/door_lock/out`目录下生成`door_lock.elf`
+小核程序编译:在`k230_sdk`目录下执行`make buildroot-menuconfig`,进入`External options`选项,选中以下选项,如图所示:![little_door_lock](images/little_door_lock.png)
+保存配置并退出图形配置界面,依次执行`make buildroot-savedefconfig`和`make buildroot`命令,
+在`k230_sdk/output/k230_evb_defconfig/little/buildroot-ext/target`下生成`app`目录
+
+#### 运行程序
+
+1. 加载模型到开发板
+从`k230_sdk/src/big/kmodel/door_lock`目录下拷贝`retinaface.kmodel`和`mbface.kmodel`两个模型拷贝到小核/sharefs下
+1. 加载程序到开发板
+将大核编译好的程序拷贝到小核/sharefs下
+将小核编译好的程序整个`app`目录拷贝到小核根目录下
+1. 加载动态链接库
+将小核编译好的动态链接库`libdisp.so`、`liblvgl.so`和`liblv_drivers.so`放到小核的`/usr/lib`下,编译完成的动态链接库位置`k230_sdk/output/k230_evb_defconfig/little/buildroot-ext/target/usr/lib/`
+1. 系统启动后大核进入/sharefs之后在大核端执行命令
+`door_lock.elf retinaface.kmodel mbface.kmodel`
+1. 在小核端执行命令
+`/app/door_lock/ui/ui`
+
+#### 功能演示
+
+1. 大小核程序启动后界面显示如下:![door_lock_menu](images/door_lock_menu.png)
+
+1. sd人脸图片导入功能,必须在/sharefs/pic下放入图片,为保证识别效果,导入图片的格式要求为jpg,分辨率为720*1280,用户把需要导入的人脸图片放到`/sharefs/pic`下,按下图片导入键,程序会自动完成提取特征值功能,并以图片的文件名为识别成功后的lable,操作效果如下:![door_lock_import](images/door_lock_import.png)
+
+1. 人脸实时注册功能,点击人脸注册按钮,通过UI展示的键盘输入lable,为保证识别效果,注册时人脸应位于图像的中央,操作效果如下:![door_lock_singup](images/door_lock_singup.png)
+识别效果:![door_lock_singup_show](images/door_lock_singup_show.png)
+
+1. 人脸底库删除功能,删除所有通过sd卡和人脸实时注册的人脸,操作效果如下:![door_lock_delete](images/door_lock_delete.png)
diff --git a/zh/02_applications/business_poc/images/canaan-cover.png b/zh/02_applications/business_poc/images/canaan-cover.png
new file mode 100755
index 0000000..0319765
Binary files /dev/null and b/zh/02_applications/business_poc/images/canaan-cover.png differ
diff --git a/zh/02_applications/business_poc/images/canaan-lable.png b/zh/02_applications/business_poc/images/canaan-lable.png
new file mode 100755
index 0000000..009a662
Binary files /dev/null and b/zh/02_applications/business_poc/images/canaan-lable.png differ
diff --git a/zh/02_applications/business_poc/images/door_lock_delete.png b/zh/02_applications/business_poc/images/door_lock_delete.png
new file mode 100644
index 0000000..994aea5
Binary files /dev/null and b/zh/02_applications/business_poc/images/door_lock_delete.png differ
diff --git a/zh/02_applications/business_poc/images/door_lock_import.png b/zh/02_applications/business_poc/images/door_lock_import.png
new file mode 100644
index 0000000..bdc8bed
Binary files /dev/null and b/zh/02_applications/business_poc/images/door_lock_import.png differ
diff --git a/zh/02_applications/business_poc/images/door_lock_menu.png b/zh/02_applications/business_poc/images/door_lock_menu.png
new file mode 100644
index 0000000..b56f01f
Binary files /dev/null and b/zh/02_applications/business_poc/images/door_lock_menu.png differ
diff --git a/zh/02_applications/business_poc/images/door_lock_singup.png b/zh/02_applications/business_poc/images/door_lock_singup.png
new file mode 100644
index 0000000..52e5568
Binary files /dev/null and b/zh/02_applications/business_poc/images/door_lock_singup.png differ
diff --git a/zh/02_applications/business_poc/images/door_lock_singup_show.png b/zh/02_applications/business_poc/images/door_lock_singup_show.png
new file mode 100644
index 0000000..e770e75
Binary files /dev/null and b/zh/02_applications/business_poc/images/door_lock_singup_show.png differ
diff --git a/zh/02_applications/business_poc/images/little_door_lock.png b/zh/02_applications/business_poc/images/little_door_lock.png
new file mode 100644
index 0000000..0770c50
Binary files /dev/null and b/zh/02_applications/business_poc/images/little_door_lock.png differ
diff --git a/zh/02_applications/business_poc/images/logo.png b/zh/02_applications/business_poc/images/logo.png
new file mode 100755
index 0000000..aa48558
Binary files /dev/null and b/zh/02_applications/business_poc/images/logo.png differ
diff --git a/zh/02_applications/fancy_poc/.gitkeep b/zh/02_applications/fancy_poc/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git "a/zh/02_applications/tutorials/K230_AI\345\256\236\346\210\230_HHB\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\351\203\250\347\275\262\345\267\245\345\205\267.md" "b/zh/02_applications/tutorials/K230_AI\345\256\236\346\210\230_HHB\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\351\203\250\347\275\262\345\267\245\345\205\267.md"
new file mode 100755
index 0000000..1ec3bd6
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_AI\345\256\236\346\210\230_HHB\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\351\203\250\347\275\262\345\267\245\345\205\267.md"
@@ -0,0 +1,322 @@
+# K230 AI实战 - HHB神经网络模型部署工具
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 简述
+
+本文档为平头哥的HHB在k230硬件平台的使用说明文档,指导用户如何在HHB上编译模型生成c代码, 如何使用k230交叉编译工具链编译程序和上板运行等.
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ---------------------------------- |
+| HHB | Heterogeneous Honey Badger |
+| SHL | Structure of Heterogeneous Library |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | -------- | ------ | --------- |
+| V1.0 | 文档初版 | 张扬 | 2023/6/25 |
+
+## 1. 概述
+
+HHB程序在k230 rtt上部署运行, 需要如下步骤
+
+- 基于HHB开发环境, 编译模型生成c代码
+- 使用k230 rtt交叉编译工具链编译c代码
+- 上板运行可执行程序
+
+### 1.1 HHB
+
+HHB (Heterogeneous Honey Badger) 是 T-Head 提供的一套针对玄铁芯片平台的神经网络模型部署工具集。包括了编译优化,性能分析,过程调试,结果模拟等一系列部署时所需的工具。
+
+HHB 的功能与特性:
+
+- 支持 caffe,tensorflow,onnx 和 tflite 对应格式的模型
+- 支持 8/16 位定点和 16/32 位浮点等数据类型
+- 支持对称和非对称定点量化,支持通道量化
+- 可在部署前优化模型的网络结构
+- 编译生成可在无剑 SoC 平台上执行的二进制
+- 支持在主机上做行为模拟
+- 多组件形式的工具集方便二次开发
+- 同时提供传统习惯的 Unix 命令行和 Python 接口
+
+HHB 已支持语音和视觉的多种不同业务算法,可导入 PyTorch 和 TensorFlow 等不同训练框架的模型。
+
+HHB 以开源项目 [TVM](https://github.com/apache/tvm) 为基础架构,添加了丰富的命令行选项提供命令模式;预置了多类量化算法适配不同平台可支持的数据类型;根据不同平台特点,输出调用 SHL 的 C 代码,或者直接输出可执行的二进制。
+
+![HHB 框架结构](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/6288173861/p668762.png)
+
+详细使用方法可参考[HHB用户手册](https://www.yuque.com/za4k4z/oxlbxl)
+
+### 1.2 SHL
+
+SHL 是 T-HEAD 提供的一组针对玄铁 CPU 平台的神经网络库 API。抽象了各种常用的网络层的接口,并且提供一系列已优化的二进制库。
+
+SHL 的特性:
+
+- C 代码版本的参考实现。
+- 提供玄铁系列 CPU 的汇编优化实现。
+- 支持对称量化和非对称量化。
+- 支持8位定点,16位定点和16位浮点等数据类型。
+- 兼容 NCHW 和 NHWC 格式。
+- 搭配 [HHB](https://www.yuque.com/za4k4z/oxlbxl) 实现代码自动调用。
+- 覆盖 CPU,NPU 等不同体系结构。
+- 附加异构参考实现。
+
+SHL 提供了完成的接口声明和接口的参考实现,各个设备提供商可以依此针对性的完成各个接口的优化工作。
+
+详细使用方法可参考[SHL用户手册](https://www.yuque.com/za4k4z/isgz8o/ayilv9)
+
+## 2. HHB编译模型
+
+### 2.1 环境搭建
+
+> 前置条件: 本地PC已安装docker
+
+- 去[HHB](https://occ.t-head.cn/product?id=3865005559921381376&type=soft)下载hhb-2.2.35 docker image
+
+- 解压/加载/启动docker image
+
+ ```shell
+ tar xzf hhb-2.2.35.docker.tar.gz
+ cd hhb-2.2.35.docker/
+ docker load < hhb.2.2.35.img.tar
+ ./start_hhb.sh
+ ```
+
+### 2.2 编译模型
+
+目前这个版本docker image没有集成c908模型编译, 这里拷贝c906并修改相关配置。
+
+```shell
+root@02297217e66d:~# cd /home/example/
+root@02297217e66d:/home/example# cp -a c906 c908
+root@02297217e66d:/home/example# cd c908/onnx_mobilenetv2/
+```
+
+run.sh相关修改
+
+- 修改--board参数的值(c906改为c908)
+- 添加校正集参数( -cd )
+- 添加量化参数(--quantization-scheme)
+
+最后修改后run.sh内容如下
+
+```shell
+#!/bin/bash -x
+
+hhb -S --model-file mobilenetv2-12.onnx --data-scale 0.017 --data-mean "124 117 104" --board c908 --input-name "input" --output-name "output" --input-shape "1 3 224 224" --postprocess save_and_top5 --simulate-data persian_cat.jpg -cd persian_cat.jpg --quantization-scheme "int8_asym_w_sym" --fuse-conv-relu
+```
+
+> 注: 不同的模型, 编译参数有可能不同,会造成性能数据差异。用户需要基于自己的模型, 深入了解hhb各参数含义(hhb -h)或者咨询平头哥等。
+
+执行run.sh开始编译
+
+```shell
+root@02297217e66d:/home/example/c908/onnx_mobilenetv2# ./run.sh
++ hhb -S --model-file mobilenetv2-12.onnx --data-scale 0.017 --data-mean '124 117 104' --board c908 --input-name input --output-name output --input-shape '1 3 224 224' --postprocess save_and_top5 --simulate-data persian_cat.jpg -cd persian_cat.jpg --quantization-scheme int8_asym_w_sym --fuse-conv-relu
+[2023-06-21 09:02:53] (HHB LOG): Start import model.
+[2023-06-21 09:02:55] (HHB LOG): Model import completed!
+[2023-06-21 09:02:55] (HHB LOG): Start quantization.
+[2023-06-21 09:02:55] (HHB LOG): get calibrate dataset from persian_cat.jpg
+[2023-06-21 09:02:55] (HHB LOG): Start optimization.
+[2023-06-21 09:02:55] (HHB LOG): Optimization completed!
+Calibrating: 100%|###############################################################################################################################################################################################################################| 153/153 [00:14<00:00, 10.66it/s]
+[2023-06-21 09:03:10] (HHB LOG): Start conversion to csinn.
+[2023-06-21 09:03:10] (HHB LOG): Conversion completed!
+[2023-06-21 09:03:10] (HHB LOG): Start operator fusion.
+[2023-06-21 09:03:10] (HHB LOG): Operator fusion completed!
+[2023-06-21 09:03:10] (HHB LOG): Start operator split.
+[2023-06-21 09:03:10] (HHB LOG): Operator split completed!
+[2023-06-21 09:03:10] (HHB LOG): Start layout convert.
+[2023-06-21 09:03:10] (HHB LOG): Layout convert completed!
+[2023-06-21 09:03:10] (HHB LOG): Quantization completed!
+[2023-06-21 09:03:14] (HHB LOG): cd hhb_out; qemu-riscv64 -cpu c908v hhb_runtime ./hhb.bm persian_cat.jpg.0.bin
+Run graph execution time: 1675.78113ms, FPS=0.60
+
+=== tensor info ===
+shape: 1 3 224 224
+data pointer: 0x2e0b40
+
+=== tensor info ===
+shape: 1 1000
+data pointer: 0x325530
+The max_value of output: 16.053827
+The min_value of output: -8.026914
+The mean_value of output: 0.002078
+The std_value of output: 11.213154
+ ============ top5: ===========
+283: 16.053827
+281: 14.920615
+282: 12.559759
+285: 12.182022
+287: 11.520982
+```
+
+最后生成hhb_out目录,如下
+
+```shell
+root@02297217e66d:/home/example/c908/onnx_mobilenetv2# ll hhb_out
+total 17940
+drwxr-xr-x 2 root root 4096 Jun 21 09:03 ./
+drwxr-xr-x 5 root root 4096 Jun 21 09:02 ../
+-rw-r--r-- 1 root root 3554304 Jun 21 09:03 hhb.bm
+-rwxr-xr-x 1 root root 6140744 Jun 21 09:03 hhb_runtime*
+-rw-r--r-- 1 root root 602112 Jun 21 09:03 input.0.bin
+-rw-r--r-- 1 root root 2860548 Jun 21 09:03 input.0.tensor
+-rw-r--r-- 1 root root 4946 Jun 21 09:03 io.c
+-rw-r--r-- 1 root root 1539 Jun 21 09:03 io.h
+-rw-r--r-- 1 root root 7410 Jun 21 09:03 main.c
+-rw-r--r-- 1 root root 81352 Jun 21 09:03 main.o
+-rw-r--r-- 1 root root 112618 Jun 21 09:03 model.c
+-rw-r--r-- 1 root root 791576 Jun 21 09:03 model.o
+-rw-r--r-- 1 root root 3546112 Jun 21 09:03 model.params
+-rw-r--r-- 1 root root 602112 Jun 21 09:03 persian_cat.jpg.0.bin
+-rw-r--r-- 1 root root 9534 Jun 21 09:03 persian_cat.jpg.0.bin_output0_1_1000.txt
+-rw-r--r-- 1 root root 20086 Jun 21 09:03 process.c
+-rw-r--r-- 1 root root 2040 Jun 21 09:03 process.h
+```
+
+将hhb_out目录拷贝到/mnt,导出到PC, 后续需要使用k230 rtt工具链重新交叉编译。
+
+```shell
+root@02297217e66d:/home/example/c908/onnx_mobilenetv2# cp -a hhb_out/ /mnt/
+```
+
+## 3. Demo
+
+### 3.1 环境搭建
+
+> 前置条件: 用户已按照 k230_sdk文档编译了docker image
+
+启动k230 docker image
+
+```shell
+cd /path/to/k230_sdk
+docker run -u root -it -v $(pwd):$(pwd) -v $(pwd)/toolchain:/opt/toolchain -w $(pwd) k230_docker /bin/bash
+```
+
+### 3.2 编译demo
+
+我们在k230_sdk中提供了HHB的demo, 用户只需将HHB编译的c代码拷贝过来即可编译出上板运行的可执行程序。
+
+相关目录说明
+
+| 目录 | 备注 |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| /path/to/k230_sdk/src/big/utils/examples/hhb | 用户可修改CMakeLists.txt追加demo |
+| /path/to/k230_sdk/src/big/utils/lib目录下的csi-nn2和hhb-prebuilt-decode | c代码依赖的预编译库(csi-nn2/jpeg/png/zlib等, 使用musl交叉编译工具链编译) |
+
+准备用例
+
+mbv2_onnx_int8目录就是前面HHB生成的c代码, 用户修改了模型编译参数后, 需要同步更新过来.
+
+用户也可以根据自己的模型,新增demo, 修改CMakeLists.txt即可。
+
+开始编译
+
+```shell
+root@9d2a450436a7:/home/zhangyang/workspace/k230_sdk# cd src/big/utils/examples/hhb/
+root@9d2a450436a7:/home/zhangyang/workspace/k230_sdk/src/big/utils/examples/hhb# ./build_app.sh
+```
+
+最后生成的可执行程序为out/bin/mbv2_onnx_int8.elf
+
+```shell
+root@9d2a450436a7:/home/zhangyang/workspace/k230_sdk/src/big/utils/examples/hhb# ll out/bin/mbv2_onnx_int8.elf
+-rwxr-xr-x 1 root root 1172680 Jun 25 14:37 out/bin/mbv2_onnx_int8.elf*
+```
+
+将mbv2_onnx_int8运行的相关文件传送到小核linux的/sharefs目录
+
+```shell
+[root@canaan /sharefs/k230/mbv2_onnx_int8 ]#ls -l
+total 5560
+-rw-r--r-- 1 sshd sshd 3554304 Jun 25 2023 hhb.bm
+-rwxr-xr-x 1 sshd sshd 1172680 Jun 25 2023 mbv2_onnx_int8.elf
+-rw-r--r-- 1 sshd sshd 359355 Jun 25 2023 persian_cat.jpg
+-rw-r--r-- 1 sshd sshd 602112 Jun 25 2023 persian_cat.jpg.0.bin
+```
+
+### 3.3 运行demo
+
+- 启动k230, 在大核rtt串口下, 执行如下命令
+
+```shell
+msh />cd /sharefs/k230/mbv2_onnx_int8/
+
+msh /sharefs/k230/mbv2_onnx_int8>./mbv2_onnx_int8.elf hhb.bm persian_cat.jpg.0.bin
+Run graph execution time: 64.71648ms, FPS=15.45
+
+=== tensor info ===
+shape: 1 3 224 224
+data pointer: 0x300170060
+
+=== tensor info ===
+shape: 1 1000
+data pointer: 0x300194c80
+The max_value of output: 15.581656
+The min_value of output: -8.026914
+The mean_value of output: 0.008405
+The std_value of output: 11.703238
+ ============ top5: ===========
+283: 15.581656
+281: 14.731747
+282: 12.559759
+285: 11.709850
+287: 11.143245
+
+msh /sharefs/k230/mbv2_onnx_int8>./mbv2_onnx_int8.elf hhb.bm persian_cat.jpg
+Run graph execution time: 64.67589ms, FPS=15.46
+
+=== tensor info ===
+shape: 1 3 224 224
+data pointer: 0x300170060
+
+=== tensor info ===
+shape: 1 1000
+data pointer: 0x300194c80
+The max_value of output: 16.053827
+The min_value of output: -8.026914
+The mean_value of output: 0.009821
+The std_value of output: 12.815542
+ ============ top5: ===========
+283: 16.053827
+281: 15.109484
+282: 13.220798
+287: 12.087587
+285: 11.804284
+```
diff --git "a/zh/02_applications/tutorials/K230_GPU\345\272\224\347\224\250\345\256\236\346\210\230.md" "b/zh/02_applications/tutorials/K230_GPU\345\272\224\347\224\250\345\256\236\346\210\230.md"
new file mode 100644
index 0000000..c3a4734
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_GPU\345\272\224\347\224\250\345\256\236\346\210\230.md"
@@ -0,0 +1,361 @@
+# K230 GPU 应用实战 - VGLite 绘制酷炫图形
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/canaan-lable.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍使用K230 GPU 绘制矢量图形。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 全称 |
+|------|-----------------------|
+| GPU | Graphics Process Unit |
+| SVG | Scalable Vector Graphics |
+| DRM | Direct Rendering Manager |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | -------- | ---------- | ---------- |
+| V1.0 | 初版 | 黄子懿 | 2023-06-20 |
+
+## 概念介绍
+
+### 矢量图基础
+
+矢量图形是用点、直线或者多边形等基于数学方程的几何图元表示的图像,矢量图形与使用像素表示图像的位图不同,可以无限放大而不失真。SVG是一种典型的矢量图格式,其本身是XML文本文件,描述各种图元的位置,通过浏览器打开即可看到渲染后的效果,如果你完全不了解 K230 GPU 使用的 VGLite API,可以把他看成是一个弱化版的 SVG。
+
+K230 GPU 支持多种二维图元
+
+- 直线
+- 二次贝塞尔曲线
+- 三次贝塞尔曲线
+- 圆曲线(当然也可以用三次贝塞尔曲线拟合)
+
+注意:**这些图形都是线条,GPU 不能直接绘制线条,只能绘制由这些线条围成的闭合图形。**
+
+### GPU 基础
+
+在 K230 SDK 的小核 Linux 上,主要通过调用 VGLite API 来与 GPU 交互。VGLite 内部会维护一个 GPU 的命令队列,当需要完成绘制,或者队列满时会提交到 GPU 硬件进行渲染。命令队列的长度默认为65536,可以调用 `vg_lite_set_command_buffer_size` 函数进行修改。
+
+注意:**VGLite API 不支持在多线程上下文中使用,如果你的应用程序使用了多线程,请确保只有一个线程会使用VGLite API**。
+
+K230 GPU 是一个 memory-to-memory 设备,本身不具备显示输出能力,如果需要显示可以与 DRM 配合使用。
+
+## 使用 VGLite API
+
+### 开发环境准备
+
+VGLite API 主要包含两个部分,头文件和库文件,其中头文件的位置在
+
+```text
+/src/little/buildroot-ext/package/vg_lite/inc/vg_lite.h
+```
+
+将 K230 SDK 完整编译后,库文件会放在
+
+```text
+/output/k230_evb_defconfig/little/buildroot-ext/target/usr/lib/libvg_lite.so
+```
+
+#### make
+
+将代码的源文件放到 `src` 目录下,创建一个 Makefile 并将如下内容粘贴进去即可使用`make`命令进行构建,构建完成后将在 Makefile 同级目录下生成可执行文件,将其拷贝到小核 linux 上运行即可,也可以使用 `make install` 将其拷贝到 K230 SDK,再到 K230 SDK 目录下构建镜像,再烧录到 SD 卡或 eMMC 启动。
+
+```Makefile
+K230SDK ?= /path/to/k230_sdk
+BIN := test-vglite
+
+CC := "$(K230SDK)/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-gcc"
+CXX := "$(K230SDK)/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++"
+
+CFLAGS += -I"$(K230SDK)/src/little/buildroot-ext/package/vg_lite/inc" -I"$(K230SDK)output/k230_evb_defconfig/little/buildroot-ext/host/riscv64-buildroot-linux-gnu/sysroot/usr/include"
+CFLAGS += -L"$(K230SDK)/output/k230_evb_defconfig/little/buildroot-ext/target/usr/lib"
+CFLAGS += -lvg_lite -lvg_lite_util -ldrm
+CFLAGS += -Wall -g
+
+CXXFLAGS := $(CFLAGS)
+
+SRCDIR := ./src
+OBJDIR := ./objs
+SRCS := $(wildcard $(SRCDIR)/*.c) $(wildcard $(SRCDIR)/*.cpp)
+OBJS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(filter %.c, $(SRCS))) \
+ $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(filter %.cpp, $(SRCS)))
+DEPS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.d,$(filter %.c, $(SRCS))) \
+ $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.d,$(filter %.cpp, $(SRCS)))
+
+all: $(BIN)
+
+$(OBJDIR):
+ mkdir -p $(OBJDIR)
+
+$(BIN): $(OBJS)
+ $(CXX) $(CXXFLAGS) $(OBJS) -o $@
+
+$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
+ $(CC) $(CFLAGS) -MMD -c $< -o $@
+
+$(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $(OBJDIR)
+ $(CXX) $(CXXFLAGS) -MMD -c $< -o $@
+
+-include $(DEPS)
+
+clean:
+ rm -rf $(OBJDIR) $(BIN)
+
+install:
+ cp $(BIN) "$(K230SDK)/output/k230_evb_defconfig/little/buildroot-ext/target/usr/bin"
+
+uninstall:
+ rm "$(K230SDK)/output/k230_evb_defconfig/little/buildroot-ext/target/usr/bin/$(BIN)"
+
+.PHONY: all clean install
+
+```
+
+#### CMake
+
+将代码的源文件放到 `src` 目录下,创建一个 `CMakeLists.txt` 文件并粘贴如下内容进去即可使用 cmake 构建。
+
+```CMakeLists.txt
+cmake_minimum_required(VERSION 3.0)
+project(test-vglite)
+set(K230SDK /path/to/k230_sdk)
+
+set(CMAKE_C_COMPILER "${K230SDK}/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-gcc")
+set(CMAKE_CXX_COMPILER "${K230SDK}/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++")
+set(CMAKE_C_FLAGS "-Wall")
+set(CMAKE_CXX_FLAGS "-Wall")
+
+include_directories(
+ "$(K230SDK)/output/k230_evb_defconfig/little/buildroot-ext/host/riscv64-buildroot-linux-gnu/sysroot/usr/include"
+ "$(K230SDK)/src/little/buildroot-ext/package/vg_lite/inc"
+)
+
+link_directories("${K230SDK}/output/k230_evb_defconfig/little/buildroot-ext/target/usr/lib")
+link_libraries(vg_lite vg_lite_util drm)
+
+file(GLOB SOURCES "src/*.c" "src/*.cpp")
+
+add_executable(${PROJECT_NAME} ${SOURCES})
+
+install(TARGETS ${PROJECT_NAME} DESTINATION "$(K230SDK)/output/k230_evb_defconfig/little/buildroot-ext/target/usr/bin")
+
+```
+
+### 显示
+
+K230 EVB 有一个1080x1920的显示屏,在小核linux上可以用 DRM 进行显示,让 GPU 驱动加载 DRM dumb buffer 可以减少内存拷贝,实现高效渲染。GPU+DRM 的相关代码可以参考 `vglite_drm` 这个 demo,读者可以将 `drm.c` 添加到自己的程序中。
+
+需要注意截至 K230 SDK v0.8,linux 上的 DRM 驱动仍然**不能**独立工作,需要依赖大核对 SoC 视频输出模块的配置,可以通过在大核上执行 `sample_vo.elf 3` 来完成。
+
+其次 DRM 的颜色格式枚举与 `vg_lite_buffer_format_t` 并不完全一致,例如 `VGLITE_BGRA8888` 表示的是红色在低8位,alpha在高8位的32位颜色,对应 DRM 中的 `DRM_FORMAT_ARGB8888`。
+
+![vglite_drm demo 运行结果](images/gpu-1.jpg)
+
+如图是 vglite_drm 运行后屏幕正确显示的颜色:R(255)G(128)B(16)
+
+一般来说为了实现同步显示会需要两张 buffer 进行 ping-pong 交替显示,但是为了简化演示代码这里就只用了一张,读者可以自行实现垂直同步的双重缓冲区进行连续渲染。
+
+## 绘图
+
+### 一些准备
+
+首先需要初始化 VGLite,调用 `vg_lite_init` 来完成,它有两个参数 `tessellation_width` 和 `tessellation_height`,用于渲染窗口的大小,越大的话效率越高,如果为0则表示不使用矢量绘制功能,只能 BLIT,通常会设置为最大 buffer 的大小。
+
+渲染需要 buffer,可以从 DRM dumb 导入,像下面这样
+
+```c
+vg_lite_buffer_t buffer;
+int buf_fd;
+memset(&buffer, 0, sizeof(buffer));
+buf_fd = drm_get_dmabuf_fd(0);
+if (buf_fd < 0) {
+ perror("get fd");
+ return buf_fd;
+}
+memset(&buffer, 0, sizeof(buffer));
+buffer.width = width;
+buffer.height = height;
+buffer.format = VG_LITE_ARGB8888;
+buffer.stride = buffer.width * 4;
+if (vg_lite_from_dma_buf(buf_fd, &buffer.address)) {
+ perror("import dma-buf");
+ return -1;
+}
+```
+
+也可以从 GPU 驱动分配离屏 buffer,像下面这样
+
+```c
+vg_lite_buffer_t buffer;
+memset(&buffer, 0, sizeof(buffer));
+buffer.width = width;
+buffer.height = height;
+buffer.format = VG_LITE_ARGB8888;
+if (vg_lite_allocate(&buffer)) {
+ return -1;
+}
+```
+
+显然分配离屏 buffer 更简单,只需要配置分辨率和像素格式即可,而从 DRM dumb 导入还需要自己计算 stride(一行的字节数量),当然从 DRM dumb 导入的好处就是可以直接用于显示,当然从驱动分配的 buffer 也可以导入到 DRM 进行显示。
+
+### 多边形
+
+有 buffer 就可以开始绘制了。多边形由多条直线组成,以三角形为例,首先需要确定三角形三个顶点的坐标,例如`(0,0) (0,1) (1,0)`,整个过程如下
+
+1. 将画笔移动到`(0,0)`
+1. 画一条线到`(0,1)`
+1. 画一条线到`(1,0)`
+1. 画一条线到`(0,0)`
+1. 闭合图形
+
+查阅K230 GPU API参考可以看到移动的操作码是2,直线的操作码是4,闭合路径的操作码是0,使用第一种数据格式,可以构造 `path_data` 数组如下
+
+```c
+uint8_t path_data[] = {
+ 2, 0, 0, // 移动到 (0,0)
+ 4, 0, 1, // 直线到 (0,1)
+ 4, 1, 0, // 直线到 (1,0)
+ 4, 0, 0, // 直线到 (0,0)
+0};
+```
+
+只有 path_data 还是不够的,渲染需要的参数是 path,path 中除了 path_data 外还包含数据格式等信息,数据的格式可以指定为以下几种:
+
+1. 8bit 有符号整数
+1. 16bit 有符号整数
+1. 32bit 有符号整数
+1. 32bit 浮点数
+
+从上到下性能依次递减,不过即使是8bit有符号整数也不意味着只能覆盖-128到127的像素范围,因为还需要矩阵变换来计算最终坐标。
+
+现在构造 path,并绘制到 buffer
+
+```c
+vg_lite_path_t path = {
+ .bounding_box = {0., 1., 1., 0.}, // 图形的包围盒
+ .quality = VG_LITE_HIGH, // 渲染质量
+ .format = VG_LITE_S8, // 考虑到坐标很简单,所以 8bit 足够
+ .uploaded = 0, // 路径没有被上传过 GPU,所以用0
+ .path_length = sizeof(path_data), // 路径数据长度,以字节为单位
+ .path = path_data, // 路径数据就放在这了
+ .path_changed = 1, // 用来表示路径被更新过
+ .pdata_internal = 0 // 表示路径数据不是由驱动分配的
+};
+```
+
+有了上面那些变量后就可以执行渲染了,步骤如下
+
+1. 将 buffer 清空,即用一个单色填充,可以使用 `vg_lite_clear` 来完成
+1. 一个变换矩阵,关于矩阵可以参考仿射变换有关的内容,这里直接使用一个缩放矩阵,将图像放大100倍,这样最终长度为1的直线在图像中会使用100个像素
+1. 调用 `vg_lite_draw` 来将 path “渲染”到 buffer
+1. 最后,使用 `vg_lite_finish` 提交渲染
+
+为了方便错误处理,使用 `CHECK_ERROR` 宏来包裹返回 `vg_lite_error_t` 的函数
+
+```c
+vg_lite_matrix_t matrix;
+CHECK_ERROR(vg_lite_clear(&buffer, NULL, 0xffff0000)); // 使用蓝色填充整个 buffer
+vg_lite_identity(&matrix); // 初始化为单位矩阵
+vg_lite_translate(buffer.width / 2., buffer.height / 2., &matrix); // 移动到 buffer 中间位置
+vg_lite_scale(100., 100., &matrix); // x y 方向都放d大100倍
+CHECK_ERROR(vg_lite_draw(
+ &buffer, &path,
+ VG_LITE_FILL_NON_ZERO, // 填充规则,像素只要被覆盖就会被绘制
+ &matrix,
+ VG_LITE_BLEND_NONE, // 颜色混合规则,None 表示忽略透明度直接覆盖
+ 0xff0000ff // RGBA 颜色,这个值表示不透明的红色
+));
+CHECK_ERROR(vg_lite_finish()); // 提交到 GPU
+```
+
+完整的参考代码可以在 vglite_drm 中查看,下面是绘制出来的效果。
+
+![绘制的简单三角形](images/gpu-2.jpg)
+
+可以很容易地发现,坐标系是以右为x正方向,以下为y正方向,这也是 SVG 所使用的坐标系。
+
+需要注意的是,我刚才说到 `vg_lite_draw` 时“渲染”是打了引号的,因为并没有真的渲染,只是写入渲染指令,最终渲染需要调用 `vg_lite_finish`,这样对性能是有好处的,实际使用中可以多次调用 `vg_lite_draw`,再最后实际显示前再执行 `vg_lite_finish`,因为 `vg_lite_finish`是系统调用,存在一定开销,而 `vg_lite_draw` 不是,可以执行得很快。
+
+当渲染完成后,可以将结果显示到屏幕或者保存为图片,需要注意保存图片时是用 CPU 来读取数据的,所以需要确保 `vg_lite_buffer_t::memory` 可读,如果读者使用上面 DRM 的代码来创建 `vg_lite_buffer_t`,那么没有映射 DRM dumb 的话是没法读取的。
+
+### 曲线
+
+K230 GPU 支持三种曲线,分别是
+
+1. 二次贝塞尔曲线
+1. 三次贝塞尔曲线
+1. 椭圆曲线
+
+当然椭圆曲线可以用三次贝塞尔曲线拟合,本质上可以看成是同样的曲线类型,与绘制多边形的情况一样,只需要修改操作码和数据即可。
+
+下面我们尝试将刚才画的三角形的底边改为二次贝塞尔曲线,并将中点放在`(1,1)`处,绘制一个近似圆角的图案,将上面 `path_data` 改为
+
+```c
+uint8_t path_data[] = {
+ 2, 0, 0,
+ 4, 0, 1,
+ 6, 1, 1, 1, 0, // 二次贝塞尔曲线,控制点(1,1),画到(1,0)
+ 4, 0, 0,
+0};
+```
+
+当然,为了更好地观察这条曲线,我们将缩放倍数开得更大一些,比如500倍,同时将位移也改小一些,使得图案近似在屏幕中央
+
+```c
+vg_lite_translate(buffer.width / 2., buffer.height / 2., &matrix);
+vg_lite_scale(500., 500., &matrix);
+```
+
+最后绘制的图案就像下面这样了
+
+![近似圆角的扇形](images/gpu-3.jpg)
+
+### 位图填充
+
+当不满足于单色的填充时,可以使用位图图来填充,位图文件会被渲染到目标位置,当然位图也得是 `vg_lite_buffer_t` 才行,如果需要从本地的 JPEG/PNG 等文件中加载,那么建议使用离屏 buffer 来存储像素内容,用 `vg_lite_blit` 或者 `vg_lite_draw_pattern` 来渲染。
+
+### 渐变
+
+对于 VGLite 的实现来说,渐变本身是一种特殊的位图填充,`linear_grad` 相关函数会分配一个 1x256 的 buffer 进行 BLIT,当然使用者可以不关心上面的细节,拿来用就好,参考 `linearGrad` demo,具体过程可以分为以下几个调用
+
+1. `vg_lite_init_grad` 初始化一个渐变
+1. `vg_lite_set_grad` 设置颜色和止点,最多支持16个止点
+1. `vg_lite_update_grad` 更新渐变
+1. `vg_lite_get_grad_matrix` 获得渐变的变换矩阵指针
+1. 对变换矩阵进行调整,例如旋转和缩放,默认长度为256像素从左到右,如果需要其他方向的渐变需要用这个矩阵来操作
+1. `vg_lite_draw_gradient` 绘制渐变
diff --git "a/zh/02_applications/tutorials/K230_GUI\345\256\236\346\210\230_LVGL\347\247\273\346\244\215\346\225\231\347\250\213.md" "b/zh/02_applications/tutorials/K230_GUI\345\256\236\346\210\230_LVGL\347\247\273\346\244\215\346\225\231\347\250\213.md"
new file mode 100644
index 0000000..0f23e86
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_GUI\345\256\236\346\210\230_LVGL\347\247\273\346\244\215\346\225\231\347\250\213.md"
@@ -0,0 +1,187 @@
+# K230 GUI实战 - LVGL移植教程
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## K230 GUI实战
+
+LVGL是流行的免费开源嵌入式图形库,可以用于嵌入式系统的图形用户界面(GUI)开发。
+
+### 硬件环境
+
+- K230-USIP-LP3-EVB-V1.1
+- 配套的LCD模组
+
+### 概述
+
+k230使用DRM作为显示驱动,DRM(Direct Rendering Manager) 是 Linux 内核中的一个子系统,相比过时的Framebuffer 可以支持复杂的 GPU 操作,如硬件加速的图形渲染。lvgl可以基于libdrm提供的接口进行GUI的绘制。
+
+SDK中已经移植好lvgl组件,且默认编译了一个可以运行的demo,位于`/usr/bin/lvgl_demo_widgets`。开机后在小核linux终端输入命令`lvgl_demo_widgets`回车即可体验。
+
+### lvgl源码位置
+
+SDK中已经包含移植好的lvgl,路径位于`src/little/buildroot-ext/package/lvgl`。在SDK的buildroot编译过程中会将源码放置于目录`output/k230_evb_defconfig/little/buildroot-ext/build/lvgl-v8.3.7`下,该目录包含了从github拉取的lvgl源码包以及前面所说的src路径下的移植文件。目录结构如下:
+
+```sh
+.
+├── lv_conf.h
+├── lv_drivers
+│ ├── display
+│ │ ├── drm.c
+│ │ └── drm.h
+│ ├── indev
+│ │ ├── AD_touch.c
+│ │ ├── AD_touch.h
+│ │ ├── evdev.c
+│ │ ├── evdev.h
+│ │ ├── keyboard.h
+│ │ ├── libinput.c
+│ │ ├── libinput_drv.h
+│ │ ├── mouse.h
+│ │ └── mousewheel.h
+│ └── lv_drivers.mk
+├── lv_drv_conf.h
+├── main.c
+├── Makefile
+└── mouse_cursor_icon.c
+```
+
+### lvgl的DRM驱动
+
+linux内核中DRM驱动加载成功后会出现以下节点`/dev/dri/card0`。
+
+#### DRM配置相关
+
+在头文件`src/little/buildroot-ext/package/lvgl/port_src/lv_drv_conf.h`中
+
+- 配置宏定义`define USE_DRM 1`来使能DRM显示驱动
+- 配置宏定义`define DRM_CARD "/dev/dri/card0"`指定DRM驱动节点
+
+#### DRM驱动源码具体介绍
+
+lvgl的drm驱动程序位于`src/little/buildroot-ext/package/lvgl/port_src/lv_drivers/display/drm.c`。
+对DRM的操作需要先open该文件节点。
+lvgl使用中主要用到以下几个函数:
+
+- drm_init() drm初始化。
+- drm_get_sizes() 获取显示器分辨率信息。
+- drm_flush() 显示绘制回调接口。
+
+drm初始化过程中会自动获取DRM的资源,包括获知connect id, plane id, crtc id等,会根据配置文件中选定的颜色格式自动匹配对应支持的plane。
+
+该drm驱动默认开启了双buffer,但目前在没有硬件加速的情况下,双缓冲刷新率低,可以注释掉下面代码以单缓冲方式刷新,显示效果会更好:
+
+``` c
+void drm_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
+{
+ ...
+ if (!drm_dev.cur_bufs[0])
+ drm_dev.cur_bufs[1] = &drm_dev.drm_bufs[1];
+ else
+ drm_dev.cur_bufs[1] = drm_dev.cur_bufs[0];
+ drm_dev.cur_bufs[0] = fbuf;
+ ...
+}
+```
+
+### lvgl的使用
+
+lvgl的主程序文件位于`src/little/buildroot-ext/package/lvgl/port_src/main.c`
+
+#### lvgl配置相关
+
+lvgl配置文件位于:`src/little/buildroot-ext/package/lvgl/port_src/lv_conf.h`
+
+以下是几个常用的配置项:
+
+- `#define LV_COLOR_DEPTH 32` 设置颜色深度
+- `#define LV_COLOR_SCREEN_TRANSP 1` 设置屏幕透明
+- `#define LV_DPI_DEF 300` 设置屏幕DPI
+- `#define LV_USE_PERF_MONITOR 1` 显示fps以及cpu占用率,用于调试
+- `#define LV_USE_MEM_MONITOR 1` 显示内存占用,用于调试
+- `#define LV_USE_DEMO_WIDGETS 1` 启用lvgl widgets demo
+
+#### lvgl使用的主要步骤
+
+1. LVGL初始化:
+
+ `lv_init();`
+
+1. 显示驱动初始化:
+
+ ``` c
+ drm_init();
+ drm_get_sizes(&lcd_w, &lcd_h, &lcd_dpi);
+ printf("lcd w,h,dpi:%d,%d,%d \n", lcd_w, lcd_h, lcd_dpi);
+
+ uint32_t draw_buf_size = lcd_w * lcd_h * sizeof(lv_color_t) / 4; /*1/4 screen sized buffer has the same performance */
+ static lv_disp_draw_buf_t disp_buf;
+ lv_color_t *buf_2_1 = malloc(draw_buf_size);
+ lv_color_t *buf_2_2 = malloc(draw_buf_size);
+ lv_disp_draw_buf_init(&disp_buf, buf_2_1, buf_2_2, draw_buf_size);
+
+ /*Initialize and register a display driver*/
+ static lv_disp_drv_t disp_drv;
+ lv_disp_drv_init(&disp_drv);
+ disp_drv.draw_buf = &disp_buf;
+ disp_drv.flush_cb = drm_flush;
+ disp_drv.hor_res = lcd_w;
+ disp_drv.ver_res = lcd_h;
+ disp_drv.screen_transp = 1;
+ lv_disp_drv_register(&disp_drv);
+ ```
+
+1. 触摸驱动:
+
+ ``` c
+ evdev_init();
+ static lv_indev_drv_t indev_drv_1;
+ lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/
+ indev_drv_1.type = LV_INDEV_TYPE_POINTER;
+
+ /*This function will be called periodically (by the library) to get the mouse position and state*/
+ indev_drv_1.read_cb = evdev_read;
+ lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);
+ ```
+
+1. demo例程:
+
+ `lv_demo_widgets();`
+
+关于lvgl更详细的用法请参考lvgl官网:`https://lvgl.io`,API文档以及例程:`https://docs.lvgl.io/8.3/index.html`。
+
+也可以使用lvgl的拖放式UI编辑器SquareLine Studio来简化开发:`https://squareline.io`。
+
+### 编译
+
+在SDK根目录下执行`make`默认全部编译。
+
+### 运行lv_demo_widgets
+
+ ```sh
+lvgl_demo_widgets
+ ```
+
+执行完上述命令,会在LCD屏幕上显示配置界面,可以通过触摸屏进行相关配置,具体如下所示:
+
+![显示内容](images/lvgl_demo_widgets.png)
+
+当然lvgl应用程序开发也可以作为一个独立项目而不是在SDK中进行编译,可以参考`https://github.com/lvgl/lv_port_linux_frame_buffer`项目将SDK中的移植文件替换进去,然后配置K230的交叉编译工具链以及对应libdrm引用即可。
diff --git "a/zh/02_applications/tutorials/K230_RVV\345\256\236\346\210\230.md" "b/zh/02_applications/tutorials/K230_RVV\345\256\236\346\210\230.md"
new file mode 100755
index 0000000..a06c931
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_RVV\345\256\236\346\210\230.md"
@@ -0,0 +1,155 @@
+# K230 RVV实战
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 概述
+
+提高数据并行性的一种方式是向量计算技术,Riscv使用了这项技术。 K230 采用的是玄铁C908双核处理器,其中大核C908带了RVV1.0扩展,本文描述了如何在大核rt-smart上使用rvv功能
+
+## 环境准备
+
+### 硬件环境
+
+- K230-UNSIP-LP3-EVB-V1.0/K230-UNSIP-LP3-EVB-V1.1
+
+### 软件环境
+
+k230_SDK
+
+## 使用RVV功能
+
+### 源码位置
+
+`src/big/unittest/testcases/rvv_utest`
+
+### 编译
+
+在k230_sdk目录下运行
+
+``` shell
+make rt-smart-apps
+```
+
+进入目录 `src/big/rt-smart` 运行脚本 `source smart-env.sh riscv64` 配置环境变量。
+
+```shell
+$ source smart-env.sh riscv64
+Arch => riscv64
+CC => gcc
+PREFIX => riscv64-unknown-linux-musl-
+EXEC_PATH => /home/testUser/k230_sdk/src/big/rt-smart/../../../toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
+```
+
+进入`userapps/testcases/rvv_utest`目录运行`scons`编译
+
+``` shell
+$ cd userapps/testcases/rvv_utest
+$ scons
+scons: Reading SConscript files ...
+scons: done reading SConscript files.
+scons: Building targets ...
+scons: building associated VariantDir targets: build/rvv_utest
+CC build/rvv_utest/rvv_utest.o
+LINK rvv_utest.elf
+/home/testUser/k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/../lib/gcc/riscv64-unknown-linux-musl/12.0.1/../../../../riscv64-unknown-linux-musl/bin/ld: warning: rvv_utest.elf has a LOAD segment with RWX permissions
+```
+
+之后即可将编译完成的rvv_utest.elf拷贝到sharefs内运行
+
+``` shell
+msh /sharefs>./rvv_utest.elf
+enter thread run [1] times
+enter thread run [67] times
+enter thread run [96] times
+enter thread run [56] times
+enter thread run [89] times
+enter thread run [51] times
+enter thread run [55] times
+enter thread run [1] times
+enter thread run [29] times
+enter thread run [53] times
+vadd_test check passed
+```
+
+在源码目录下使用objdump工具反编译可确认是否产生了vector指令
+
+``` text
+$ riscv64-unknown-linux-musl-objdump -D rvv_utest.elf | grep 'vadd'
+0000000200002b48 :
+ 200002b48: 04d05e63 blez a3,200002ba4
+ 200002b5c: 04f76563 bltu a4,a5,200002ba6
+ 200002b68: 02f87363 bgeu a6,a5,200002b8e
+ 200002b7c: 038c8c57 vadd.vv v24,v24,v25
+ 200002b8a: f2ed bnez a3,200002b6c
+ 200002ba0: feb699e3 bne a3,a1,200002b92
+ 200002ba8: bf65 j 200002b60
+0000000200002baa :
+ 200002c36: f13ff0ef jal ra,200002b48
+ 200002c3e: a835 j 200002c7a
+ 200002c5c: 00f70a63 beq a4,a5,200002c70
+ 200002c84: fae7dee3 bge a5,a4,200002c40
+ 200002cd0: edbff0ef jal ra,200002baa
+ 90: 00000d57 vadd.vv v26,v0,v0,v0.t
+ 1b6: 00000157 vadd.vv v2,v0,v0,v0.t
+ 24a: 007c0357 vadd.vv v6,v7,v24,v0.t
+ 2a0: 000006d7 vadd.vv v13,v0,v0,v0.t
+ 360: 00000c57 vadd.vv v24,v0,v0,v0.t
+ b14: 00000d57 vadd.vv v26,v0,v0,v0.t
+```
+
+### 源码简介
+
+``` C
+void __attribute__((noinline, noclone, optimize(3)))
+vadd (int *dst, int *op1, int *op2, int count)
+{
+ for (int i = 0; i < count; ++i)
+ dst[i] = op1[i] + op2[i];
+}
+
+#define ELEMS 10
+
+int vadd_test(void)
+{
+ int in1[ELEMS] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+ int in2[ELEMS] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+ int out[ELEMS];
+ int check[ELEMS] = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 };
+
+ vadd (out, in1, in2, ELEMS);
+
+ for (int i = 0; i < ELEMS; ++i)
+ {
+ if (out[i] != check[i]) {
+ printf("check error\n");
+ __builtin_abort();
+ }
+ }
+ return 0;
+}
+```
+
+vadd_test函数中预先计算了俩个数组(in1 in2)的和作为校验结果,之后使用vadd函数做数组加法。vadd函数在定义时添加了optimize(3)的属性设置,该函数将使用O3编译。
+之后编译器会将数组加法优化为向量指令计算。
+`src/big/rt-smart/tools/riscv64.py`文件内定义了编译参数可使用V指令扩展优化。
+
+DEVICE = ' -mcmodel=medany -march=rv64imafdc`v` -mabi=lp64d'
diff --git "a/zh/02_applications/tutorials/K230_USB\345\272\224\347\224\250\345\256\236\346\210\230_UVC\344\274\240\350\276\223YUV\345\217\212\347\274\226\347\240\201\347\240\201\346\265\201.md" "b/zh/02_applications/tutorials/K230_USB\345\272\224\347\224\250\345\256\236\346\210\230_UVC\344\274\240\350\276\223YUV\345\217\212\347\274\226\347\240\201\347\240\201\346\265\201.md"
new file mode 100755
index 0000000..1179e95
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_USB\345\272\224\347\224\250\345\256\236\346\210\230_UVC\344\274\240\350\276\223YUV\345\217\212\347\274\226\347\240\201\347\240\201\346\265\201.md"
@@ -0,0 +1,280 @@
+# K230 USB应用实战-UVC传输YUV及编码码流
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 概述
+
+本文将讲解如何在k230开发板上实现USB摄像头功能。也就是把K230 开发板连接到电脑,电脑可以通过播放器播放K230摄像头采集到的图像。
+
+## 1. 环境准备
+
+### 1.1 硬件环境
+
+- K230-UNSIP-LP3-EVB-V1.0/K230-UNSIP-LP3-EVB-V1.1
+- Ubuntu PC 20.04
+- Typec USB线 * 1 至少
+- USB TypeC转以太网(如果使用TFTP加载和NFS文件系统)
+- 网线一根
+- SD卡(如果使用SD卡启动,或软件需要访问SD卡)
+
+### 1.2 软件环境
+
+k230_sdk中提供了工具链,分别在如下路径。
+
+- 大核rt-samrt工具链
+
+``` shell
+k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu
+```
+
+- 小核linux工具链
+
+``` shell
+k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0
+```
+
+也可通过以下链接下载工具链
+
+``` shell
+wget https://download.rt-thread.org/rt-smart/riscv64/riscv64-unknown-linux-musl-rv64imafdcv-lp64d-20230222.tar.bz2
+wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1659325511536/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0-20220715.tar.gz
+```
+
+## 2. SDK UVC demo体验
+
+### 2.1 release sdk编译固件,烧录固件
+
+参考 [K230_SDK_使用说明](../../01_software/board/K230_SDK_使用说明.md) 2/3/4/5章节描述
+
+### 2.2 执行命令测试demo
+
+参考 [K230_SDK_Demo使用指南](../../01_software/board/examples/K230_SDK_Demo使用指南.md) 2.9 UVC_demo 章节
+
+## 3. 如何开发UVC功能
+
+### 3.1 USB/UVC协议
+
+### 3.1.1 USB协议
+
+USB协议内容比较多,是用得非常普遍的接口,互联网上资料很多。本文只描述一些我认为有助于对USB协议理解的点。
+
+USB2.0有4条线,VBUS/GND/D+/D-,差分信号传输。低速/全速使用3.3V电压,高速使用400mV电压。除了传递数据的差分0/1信号外,其他的一些电压组合可以用来作为速度识别,空闲、复位、唤醒等信号。
+
+PHY可以理解为做一个并转串的操作,把UTMI+信号转成D+/D-的差分信号。
+
+![usb_phy](images/usb_phy.png)
+
+理论上两条数据信号完全可以使用gpio来进行控制,只是协议太复杂,且gpio的变化速度太慢。无论是SPI/SDIO/UART/IIC等等这些接口控制器都是这样,控制器尽可能提供给软件必要的接口,且让软件做尽可能少的操作。USB控制器也就是把协议的功能尽可能让硬件来做,比如速度协商,收到数据包后自动产生应答包等等功能。提供一些寄存器接口告知软件当前USB通信的状态。当然最重要的是提供传输数据的接口,让软件可以收发不同的数据,收发数据一般都会使用DMA。
+
+USB传输数据是以包为基本单位的。下图为包的构成
+
+![packet](images/usb_packet.png)
+
+PID决定了包的类型,令牌包、数据包、握手包和特殊包,不同的包类型包含的字段成分不一样,比如数据包只包含PID+数据+CRC,握手包只有PID。
+
+包组成了事务,令牌包+数据包(可选)+握手包(可选)。下图使用南京沁恒出的USB2.0高速总线分析仪捕获的USB交互信息,如果想捕获USB线上的数据比较推荐这款仪器。
+
+![transaction](images/usb_transaction.png)
+
+可以看到前面是枚举传输,包含SETUP事务,数据IN/OUT事务,状态IN/OUT事务。后面是同步传输,包含数据IN事务。
+
+传输是由单次或多次事务组成,有4种传输类型:
+
+控制传输-在枚举阶段使用,所有的USB设备连接主机时,都需要一套统一的协议去识别各种USB设备类型。USB控制器初始阶段会让0端点为双向控制端点。
+
+![control](images/usb_control.png)
+
+中断传输-小数据量和不连续,且实时性要求高的场合。比如鼠标键盘。
+
+![interrupt](images/usb_interrupt.png)
+
+同步传输-数据量大、连续,且要求实时性的场合。比如USB摄像头设备。
+
+![iso](images/usb_iso.png)
+
+批量传输-用于数据量大,但没有实时性要求的场合。比如U盘设备。
+
+![bulk](images/usb_bulk.png)
+
+无论是什么样的USB设备协议,都是通过这4种传输来实现的。所以像linux这样的操作系统的USB协议栈,提供了这4种传输方式的接口。
+
+### 3.1.2 UVC协议
+
+### 3.1.2.1 UVC描述符
+
+USB的描述符用于让主机知道设备的属性信息。设备刚连接主机时,主机会发送所有设备都支持的请求命令。通用的描述符包含设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。不同的设备类型可能会定义特有的描述符,用于对设备的描述扩展。
+
+windows上可以使用UsbTreeView软件查看USB设备的描述符。下图展示了一个UVC设备其描述符的整体布局。
+
+![usb_uvc_layout](images/usb_uvc_layout.png)
+
+在该布述符布局中,首先第一项是设备描述符,其次是配置描述符,该设备拥有一个配置描述符。配置描述符后接一个接口关联描述符IAD,接口关联描述符IAD拥有一个视频控制接口VC和N个视频流接口。
+
+视频控制接口包括视视频控制接口头描述符、输入终端描述符、处理单元描述符、编码单元描述符、输出终端描述符、中断断点描述符。
+
+视频流接口中包括一个接口和与其对应的多个转换设置接口(Alternate Setting)。
+
+主机端通过视频控制接口描述符,可以知晓UVC摄像头的拓扑结构,并进行控制。比如处理单元PU,包括背光、对比度、色度等等调节,主机端先通过描述符获知哪些是可调节项,然后再与UVC设备交互获知控制范围信息。
+
+![usb_unit](images/usb_unit.png)
+
+### 3.1.2.2 UVC视频流格式选择
+
+VS接口包含许多Format(YUV/MJPEG/H264等),每个Format包含多个Frame(各种分辨率)。参数设置的过程需要主机和USB设备进行协商, 协商的过程大致如下图所示:
+
+![usb_vs](images/usb_vs.png)
+
+流程说明:
+
+- Host 先将期望的设置发送给USB设备(PROBE)
+- 设备将Host期望设置在自身能力范围之内进行修改,返回给Host(PROBE)
+- Host 认为设置可行的话,Commit 提交(COMMIT)
+- 设置接口的当前设置为某一个设置
+
+### 3.1.2.3 UVC视频流负载
+
+![uvc_payload](images/uvc_payload.png)
+
+可以看到payload data前面包含一个header,payload data包含多个USB包,主机端是如何识别一帧图像数据的呢?通过payload header来识别。
+
+payload header固定前2字节和后面的扩展部分。重点关注FID-不同的格式规定有差异。但所有的格式都是使用该bit在0和1之间切换来识别新一帧图像数据的。
+
+![uvc_payload](images/uvc_payload_header.png)
+
+### 3.2 linux驱动层
+
+K230的SDK设计,为了性能把视频音频功能放在大核RTT上。linux上USB的功能实现很成熟,所以基于linux开发UVC功能,通过核间mapi通信获取大核视频数据。
+
+![uvc_payload](images/uvc_framework.png)
+
+### 3.2.1 控制器驱动
+
+![usb_gadget](images/usb_gadget.png)
+
+K230集成了新思科技的USB模块,linux/drivers/usb/dwc2目录为该控制器的驱动。
+
+目前的SDK设计UVC固定使用USB1,otg通过ID信号识别为device模式。
+
+platform.c,做一些复位,注册中断,配置参数等操作。SDK的USB默认支持buffer DMA模式。Scatter Gather DMA模式可以提升ISO传输性能,HOST模式使用该DMA模式不能支持HUB。
+
+gadget.c,重点关注该驱动代码,dwc2_gadget_init初始化重要的结构体,gadget.ops和ep.ops。usb_ep_ops的queue就是提交数据收发的请求,实际上是把这个请求放到一个处理链表。USB会挨个处理这些链表上的请求然后上报完成回调。
+
+``` c
+//设备树
+usbotg1: usb-otg@91540000 {
+ compatible = "kendryte,k230-otg";
+ reg = <0x0 0x91540000 0x0 0x10000>;
+ interrupt-parent = <&intc>;
+ interrupts = <174>;
+ g-rx-fifo-size = <512>;
+ g-np-tx-fifo-size = <64>;
+ g-tx-fifo-size = <512 1024 64 64 64 64>;
+ dr_mode = "otg";
+ otg-rev = <0x200>;
+};
+```
+
+### 3.2.2 gadget驱动
+
+源码位于linux/drivers/usb/gadget
+
+- legacy:整个Gadget 设备驱动的入口。位于driver/usb/gadget/legacy下,里面给出了常用的usb类设备的驱动sample。其作用就是配置USB设备描述符信息,提供一个usb_composite_driver, 然后注册到composite层。也可以通过functionfs动态创建,这种方式更灵活,K230提供的usb gadget demo都是采用这种方式。
+- functions:各种usb 子类设备功能驱动。位于driver/usb/gadget/functions,里面也给出了对应的sample。其作用是配置USB子类协议的接口描述以及其他子类协议,比如uvc协议,hid等。uvc涉及到的相关文件uvc_video.c、uvc_v4l2.c、uvc_queue.c、uvc_configfs.c、f_uvc.c
+
+K230的UVC几乎未对gadget驱动层做修改,仅仅是移植了支持H264格式功能和扩展单元。
+
+linux编译内核添加USB Gadget框架
+
+``` shell
+-> Device Drivers
+ -> USB support
+ -> USB Gadget Support
+```
+
+![udc_linux_menuconfig](images/udc_linux_menuconfig.png)
+
+![uvc_linux_menuconfig](images/uvc_linux_menuconfig.png)
+
+uvc涉及到v4l2模块的功能,还需要添加media框架
+
+``` shell
+-> Device Drivers
+ -> Multimedia support
+ -> Media core support
+ -> Media core support
+```
+
+![media_linux_menuconfig](images/media_linux_menuconfig.png)
+
+### 3.3 uvc-gadget应用层
+
+从K230的SDK设计架构可以看到,K230的UVC功能与单纯的linux上的uvc功能的差别就是获取视频数据的方式是通过核间通信从大核RTT获取的。
+
+K230 UVC应用层的代码位置:cdk/user/mapi/sample/camera
+
+源代码文件描述:
+
+application.c - 主函数
+
+camera.c - 提供摄像头对象操作,可以包含uvc/uac的控制
+
+frame_cache.c - 复杂buffer的管理
+
+kstream.c - 实现视频流操作
+
+kuvc.c - 实现kuvc对象操作
+
+sample_venc.c - 通过mapi从大核获取编码图像的操作
+
+sample_yuv.c - 通过mapi从大核获取YUV图像的操作
+
+uvc-gadget.c - 实现uvc设备操作
+
+调试的步骤是先移植linux上通用的uvc_app,在linux上跑通standalone功能,也就是播放固定图像数据。然后再调试播放真实摄像头图像数据的功能。
+
+下面是K230 UVC APP的设计流程图
+
+![uvc_app_flow](images/uvc_app_flow.png)
+
+uvc app大部分操作都是通用的操作,互联网上资料比较多。这里说一下K230私有的操作,重点关注venc_normalp_classic函数的处理。
+
+- 首先配置vicap 设备属性信息,包括摄像头类型等
+kd_mapi_vicap_set_dev_attr
+- 获取摄像头信息,主要是获取摄像头输出的图像分辨率 k_vicap_sensor_info
+- 根据需要从vicap输出的图像计算出需要的vb buffer大小,并分配好buffer kd_mapi_media_init
+- 配置通道属性,包括输出的分辨率,格式等 kd_mapi_vicap_set_chn_attr
+- 启动video处理 kd_mapi_vicap_start
+ - 获取一帧图像 kd_mapi_vicap_dump_frame
+ - 释放图像 buffer kd_mapi_vicap_release_frame
+- 初始化venc模块,包括编码格式,帧率,分辨率等等 kd_mapi_venc_init
+- 注册编码完成后的回调函数 kd_mapi_venc_registercallback
+- 使能H264 GOP间隔产生IDR帧 kd_mapi_venc_enable_idr
+- 启动venc kd_mapi_venc_start
+- venc模块绑定vi模块 kd_mapi_venc_bind_vi
+ - 编码完成后的回调函数,获取编码后的图像数据 get_venc_stream
+
+### 3.4 参考资料学习推荐
+
+- [USB2.0官方文档下载](https://www.usb.org/document-library/usb-20-specification)
+- [UUV1.1官方文档下载](https://www.usb.org/document-library/video-class-v11-document-set)
+- [UUV1.5官方文档下载](https://www.usb.org/document-library/video-class-v15-document-set)
+- [USB中文网](https://www.usbzh.com/article/forum-12.html)
diff --git "a/zh/02_applications/tutorials/K230_\345\233\276\345\203\217\345\256\236\346\210\230_\345\274\200\346\234\272\350\247\206\351\242\221\345\222\214\345\274\200\346\234\272logo.md" "b/zh/02_applications/tutorials/K230_\345\233\276\345\203\217\345\256\236\346\210\230_\345\274\200\346\234\272\350\247\206\351\242\221\345\222\214\345\274\200\346\234\272logo.md"
new file mode 100755
index 0000000..292c161
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_\345\233\276\345\203\217\345\256\236\346\210\230_\345\274\200\346\234\272\350\247\206\351\242\221\345\222\214\345\274\200\346\234\272logo.md"
@@ -0,0 +1,106 @@
+# K230 图像实战 - 开机视频和开机logo
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 概述
+
+本文将讲解如何通过视频解码在k230 evb开发板上实现开机视频和开机logo。
+视频解码模块支持H.264/H.265/MJPEG解码,屏幕显示最大分辨率为1920x1080,可旋转。
+
+## 1. 环境准备
+
+### 1.1 硬件环境
+
+- K230-USIP-LP3-EVB-V1.0/K230-UNSIP-LP3-EVB-V1.1
+- Typec USB线,用于供电。
+- SD卡
+- 屏幕及连线
+- 摄像头子板(IMX335)
+
+### 1.2 软件环境
+
+k230_sdk中提供了工具链,分别在如下路径。
+
+- 大核rt-samrt工具链
+
+``` shell
+k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu
+```
+
+- 小核linux工具链
+
+``` shell
+k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0
+```
+
+也可通过以下链接下载工具链
+
+``` shell
+wget https://download.rt-thread.org/rt-smart/riscv64/riscv64-unknown-linux-musl-rv64imafdcv-lp64d-20230222.tar.bz2
+wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1659325511536/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0-20220715.tar.gz
+```
+
+## 2. 源码位置
+
+SDK中包含一个用户态解码demo,路径位于`k230_sdk/src/big/mpp/userapps/sample/sample_vdec`。编译生成的可执行文件在`k230_sdk/src/big/mpp/userapps/sample/elf/sample_vdec.elf`,默认没有加载到大核镜像中,需要按照执行方式章节修改Makefile才能在大核启动后的`/mnt`目录中生成可执行文件。
+
+## 源码解析
+
+1. `sample_vb_init`:配置vb pool cnt,并初始化vb。
+1. `vb_create_pool`:配置vb总各个pool的block大小和个数。
+1. `kd_mpi_vdec_create_chn`:创建解码通道。
+1. `kd_mpi_vdec_start_chn`:开启解码通道。
+1. `sample_vdec_bind_vo`:将解码绑定到vo。
+1. `input_thread`:从文件中读取数据,并调用`kd_mpi_vdec_send_stream`将数据送给VPU。
+1. `output_thread`:从VPU获取解码数据。
+
+## 3. 程序执行
+
+1. 修改`k230_sdk/Makefile`中`mpp-apps`的编译脚本。
+ 将
+
+ ```sh
+ cp userapps/sample/fastboot_elf/* $(RTSMART_SRC_DIR)/userapps/root/bin/; \
+ ```
+
+ 改为
+
+ ```sh
+ cp userapps/sample/elf/sample_vdec.elf $(RTSMART_SRC_DIR)/userapps/root/bin/; \
+ ```
+
+1. 将需要显示的H.264/H.265/MJPEG/JPEG文件拷贝到`k230_sdk/src/big/rt-smart/userapps/root/bin`目录中
+
+1. 修改`k230_sdk/src/big/rt-smart/init.sh`为如下命令:
+
+ ```sh
+ /bin/sample_vdec -i [-t ]
+ ```
+
+ - ``为上一步中拷贝的视频文件
+ - `-t`仅在显示图片时使用,为显示图片的时间。
+
+1. 在`k230_sdk`目录下执行`make`命令。
+1. 将编译生成的`k230_sdk/output/k230_evb_defconfig/images/sysimage-sdcard.img`烧写到SD卡中,EVB板拨码开关全拨到OFF(从SD卡启动),即可实现开机显示视频。
+
+显示效果如下:
+![boot_logo](images/boot_logo.png)
diff --git "a/zh/02_applications/tutorials/K230_\345\233\276\345\203\217\351\207\207\351\233\206\345\256\236\346\210\230_\345\246\202\344\275\225\346\224\257\346\214\201\344\270\200\346\254\276\346\226\260sensor.md" "b/zh/02_applications/tutorials/K230_\345\233\276\345\203\217\351\207\207\351\233\206\345\256\236\346\210\230_\345\246\202\344\275\225\346\224\257\346\214\201\344\270\200\346\254\276\346\226\260sensor.md"
new file mode 100755
index 0000000..e016304
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_\345\233\276\345\203\217\351\207\207\351\233\206\345\256\236\346\210\230_\345\246\202\344\275\225\346\224\257\346\214\201\344\270\200\346\254\276\346\226\260sensor.md"
@@ -0,0 +1,392 @@
+# K230图像采集实战 如何支持一款新sensor
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要描述K230平台Camera Sensor框架以及如何新增支持一款新的Camera Sensor。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ---- |
+| | |
+| | |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|---|---|---|---|
+| V1.0 | 初版 | 汪成根 | 2023-06-28 |
+| | | | |
+| | | | |
+
+## 1. 概述
+
+本文档主要描述K230平台Camera Sensor基本框架以及如何新增支持一款新的Camera Sensor。
+
+K230平台支持多种接口类型的sensor,我们以当前最常用的MIPI CSI接口Sensor为例进行说明。Sensor与主控平台的硬件连接示意图如下:
+
+![camera sensor连接示意图](images/camer_sensor_connect.png)
+
+主控通过I2C接口下发配置寄存器控制sensor的工作方式,sensor通过MIPI CSI接口将图像数据发送至主控SOC。
+
+## 2. Camera Sensor框架
+
+### 2.1 框架简介
+
+Camera Sensor框架如图2-1所示,最底层是sensor驱动层
+
+![camera sensor框架](images/camera_sensor_arch.png)
+
+图2-1 camera sensor框架
+
+从上到下依次是:媒体接口层,驱动层以及硬件层
+
+- 媒体接口层:该层向上提供kd_mpi_sensor_xxx接口给外部模块操作和访问sensor设备,向下通过ioctl命令操作具体的sensor设备
+- 驱动层:该层包括sensor公共操作接口具体的sensor设备驱动。公共操作接口主要是ioctl操作命令和sensor i2c读写接口,sensor驱动主要提供设备节点以及操作接口的实现。这部分也是sensor适配的主要工作。
+- 硬件层:对应各个具体的sensor硬件
+
+## 3. Sensor适配准备工作
+
+用户在适配新的sensor之前需要做以下一些准备工作:
+
+1. 从正规渠道获取 Sensor datasheet、初始化序列。
+1. 查看 Sensor datasheet 和相关应用手册,特别关注 Sensor 曝光、增益控制方法,不同模式下曝光和增益的限制,长曝光实现方法,黑电平值,bayer 数据输出顺序等。
+1. 跟 Sensor 厂家索要所需模式初始化序列,了解各序列的数据数率,Sensor 输出总的宽高,精确的帧率是多少等。
+1. 确认 Sensor 控制接口是 I2C、SPI 还是其他接口,Sensor 的设备地址可以通过硬件设置。对于多个摄像头的场景,sensor 尽量不要复用 I2C 总线。不同场景的Sensor IO 电平可能是 1.8V 或者 3.3V,设计时需要保证 sensor 的 IO 电平与SOC 对应的 GPIO 供电电压一致。如 sensor 电平是 1.8V,则用于 sensor 控制的GPIO,如 Reset,I2C,PRDN,需要使用 1.8V 供电。
+1. 确认 Sensor 输出数据接口和协议类型。当前仅支持MIPI CSI接口。
+1. 确认 wdr mode 是 VC、DT 或者 DOL 等。
+1. 确认不同时序是否需要图像裁剪。
+
+## 4. Sensor适配示例
+
+本节将按照如何增加支持一个新的camera sensor的步骤来进行详细描述。
+
+这里以ov9732驱动作为示例进行说明,对应的驱动文件源码路径如下:
+
+```shell
+src/big/mpp/kernel/sensor/src/ov9732_drv.c
+```
+
+### 4.1 定义支持的sensor类型
+
+系统支持的Sensor类型是由如下枚举变量定义:
+
+```c
+typedef enum {
+ OV_OV9732_MIPI_1920X1080_30FPS_10BIT_LINEAR,
+ OV_OV9732_MIPI_1920X1080_30FPS_10BIT_HDR,
+ OV_OV9732_MIPI_1280X720_30FPS_10BIT_LINEAR,
+ OV_OV9286_MIPI_1920X1080_30FPS_10BIT_LINEAR,
+ OV_OV9286_MIPI_1920X1080_30FPS_10BIT_HDR,
+ OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR,
+ OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE,
+ IMX335_MIPI_2LANE_RAW12_1920X1080_30FPS_LINEAR,
+ IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR,
+ IMX335_MIPI_4LANE_RAW12_2592X1944_30FPS_LINEAR,
+ SENSOR_TYPE_MAX,
+} k_vicap_sensor_type;
+```
+
+用户需要增加新的sensor支持类型时,首先需要在这里增加对应类型的定义,**该类型是应用程序获取sensor配置的唯一标志**
+
+### 4.2 sensor驱动适配
+
+sensor驱动适配在整个环节中最重要的环节,用户可以通过拷贝现有的sensor驱动文件来修改,其中关于sensor的AE相关寄存器配置和计算方式需要查看对应的手册或者寻求专业人事协助。
+
+#### 4.2.1 定义sensor寄存器配置列表
+
+sensor寄存器配置由数据类型 k_sensor_reg 定义:
+
+```c
+typedef struct {
+ k_u32 addr;
+ k_u32 val;
+} k_sensor_reg;
+```
+
+以下是ov9732的寄存器配置列表
+
+```c
+static k_sensor_reg ov9732_mipi2lane_720p_30fps_linear[] = {
+ {0x0103, 0x01},
+ {0x0100, 0x00},
+
+ ......
+
+ {0x400b, 0xc0},
+ {REG_NULL, 0x00},
+};
+```
+
+#### 4.2.2 定义sensor支持的模式
+
+sensor的模式参数由数据类型k_sensor_mode 定义
+
+```c
+typedef struct {
+ k_u32 index;
+ k_vicap_sensor_type sensor_type;
+ k_sensor_size size;
+ k_u32 fps;
+ k_u32 hdr_mode;
+ k_u32 stitching_mode;
+ k_u32 bit_width;
+ k_sensor_data_compress compress;
+ k_u32 bayer_pattern;
+ k_sensor_mipi_info mipi_info;
+ k_sensor_ae_info ae_info;
+ k_sensor_reg *reg_list;
+ k_u32 max_fps;
+ k_sensor_clk_info *clk_info;
+} k_sensor_mode;
+```
+
+以下是ov9732的支持的模式
+
+```c
+static k_sensor_mode ov9732_mode_info[] = {
+ ......
+
+ {
+ .index = 2,
+ .sensor_type = OV_OV9732_MIPI_1280X720_30FPS_10BIT_LINEAR,
+ .size = {
+ .bounds_width = 1280,
+ .bounds_height = 720,
+ .top = 0,
+ .left = 0,
+ .width = 1280,
+ .height = 720,
+ },
+ .fps = 30000,
+ .hdr_mode = SENSOR_MODE_LINEAR,
+ .bit_width = 10,
+ .bayer_pattern = BAYER_BGGR,
+ .mipi_info = {
+ .csi_id = 0,
+ .mipi_lanes = 1,
+ .data_type = 0x2B, //RAW10
+ },
+ .reg_list = ov9732_mipi2lane_720p_30fps_linear,
+ },
+
+}
+```
+
+#### 4.2.3 实现sensor操作接口
+
+sensor的操作接口由数据类型k_sensor_function定义,用户根据实际情况实现相关的操作接口,不是所有接口都必须实现。
+
+```c
+typedef struct {
+ k_s32 (*sensor_power) (void *ctx, k_s32 on);
+ k_s32 (*sensor_init) (void *ctx, k_sensor_mode mode);
+ k_s32 (*sensor_get_chip_id)(void *ctx, k_u32 *chip_id);
+ k_s32 (*sensor_get_mode)(void *ctx, k_sensor_mode *mode);
+ k_s32 (*sensor_set_mode)(void *ctx, k_sensor_mode mode);
+ k_s32 (*sensor_enum_mode)(void *ctx, k_sensor_enum_mode *enum_mode);
+ k_s32 (*sensor_get_caps)(void *ctx, k_sensor_caps *caps);
+ k_s32 (*sensor_conn_check)(void *ctx, k_s32 *conn);
+ k_s32 (*sensor_set_stream)(void *ctx, k_s32 enable);
+ k_s32 (*sensor_get_again)(void *ctx, k_sensor_gain *gain);
+ k_s32 (*sensor_set_again)(void *ctx, k_sensor_gain gain);
+ k_s32 (*sensor_get_dgain)(void *ctx, k_sensor_gain *gain);
+ k_s32 (*sensor_set_dgain)(void *ctx, k_sensor_gain gain);
+ k_s32 (*sensor_get_intg_time)(void *ctx, k_sensor_intg_time *time);
+ k_s32 (*sensor_set_intg_time)(void *ctx, k_sensor_intg_time time);
+ k_s32 (*sensor_get_exp_parm)(void *ctx, k_sensor_exposure_param *exp_parm);
+ k_s32 (*sensor_set_exp_parm)(void *ctx, k_sensor_exposure_param exp_parm);
+ k_s32 (*sensor_get_fps)(void *ctx, k_u32 *fps);
+ k_s32 (*sensor_set_fps)(void *ctx, k_u32 fps);
+ k_s32 (*sensor_get_isp_status)(void *ctx, k_sensor_isp_status *staus);
+ k_s32 (*sensor_set_blc)(void *ctx, k_sensor_blc blc);
+ k_s32 (*sensor_set_wb)(void *ctx, k_sensor_white_balance wb);
+ k_s32 (*sensor_get_tpg)(void *ctx, k_sensor_test_pattern *tpg);
+ k_s32 (*sensor_set_tpg)(void *ctx, k_sensor_test_pattern tpg);
+ k_s32 (*sensor_get_expand_curve)(void *ctx, k_sensor_compand_curve *curve);
+ k_s32 (*sensor_get_otp_data)(void *ctx, void *data);
+} k_sensor_function;
+```
+
+以下是ov9732的支持的模式
+
+```c
+ .sensor_func = {
+ .sensor_power = ov9732_sensor_power_on,
+ .sensor_init = ov9732_sensor_init,
+ .sensor_get_chip_id = ov9732_sensor_get_chip_id,
+ .sensor_get_mode = ov9732_sensor_get_mode,
+ .sensor_set_mode = ov9732_sensor_set_mode,
+ .sensor_enum_mode = ov9732_sensor_enum_mode,
+ .sensor_get_caps = ov9732_sensor_get_caps,
+ .sensor_conn_check = ov9732_sensor_conn_check,
+ .sensor_set_stream = ov9732_sensor_set_stream,
+ .sensor_get_again = ov9732_sensor_get_again,
+ .sensor_set_again = ov9732_sensor_set_again,
+ .sensor_get_dgain = ov9732_sensor_get_dgain,
+ .sensor_set_dgain = ov9732_sensor_set_dgain,
+ .sensor_get_intg_time = ov9732_sensor_get_intg_time,
+ .sensor_set_intg_time = ov9732_sensor_set_intg_time,
+ .sensor_get_exp_parm = ov9732_sensor_get_exp_parm,
+ .sensor_set_exp_parm = ov9732_sensor_set_exp_parm,
+ .sensor_get_fps = ov9732_sensor_get_fps,
+ .sensor_set_fps = ov9732_sensor_set_fps,
+ .sensor_get_isp_status = ov9732_sensor_get_isp_status,
+ .sensor_set_blc = ov9732_sensor_set_blc,
+ .sensor_set_wb = ov9732_sensor_set_wb,
+ .sensor_get_tpg = ov9732_sensor_get_tpg,
+ .sensor_set_tpg = ov9732_sensor_set_tpg,
+ .sensor_get_expand_curve = ov9732_sensor_get_expand_curve,
+ .sensor_get_otp_data = ov9732_sensor_get_otp_data,
+ },
+```
+
+#### 4.2.4 定义sensor驱动结构体
+
+sensor驱动结构体由 struct sensor_driver_dev 定义,主要包括sensor I2C配置信息,sensor驱动名称以及sensor操作集合
+
+```c
+struct sensor_driver_dev {
+ k_sensor_i2c_info i2c_info;
+ k_u8 *sensor_name;
+ k_sensor_function sensor_func;
+ k_sensor_mode *sensor_mode;
+ k_sensor_ae_info ae_info;
+ k_s32 pwd_gpio;
+ k_s32 reset_gpio;
+};
+```
+
+ov9732驱动结构体定义及初始化内容如下:
+
+```c
+struct sensor_driver_dev ov9732_sensor_drv = {
+ .i2c_info = {
+ .i2c_bus = NULL,
+ .i2c_name = "i2c1",
+ .slave_addr = 0x36,
+ },
+ .sensor_name = "ov9732",
+ .sensor_func = {
+ .sensor_power = ov9732_sensor_power_on,
+ .sensor_init = ov9732_sensor_init,
+ .sensor_get_chip_id = ov9732_sensor_get_chip_id,
+ .sensor_get_mode = ov9732_sensor_get_mode,
+ .sensor_set_mode = ov9732_sensor_set_mode,
+ ......
+ },
+};
+```
+
+#### 4.2.5 更新sensor驱动列表
+
+将上一节定义的sensor驱动结构体添加到sensor_drv_list数组中。
+当前系统支持的sensor列表如下:
+
+```c
+struct sensor_driver_dev *sensor_drv_list[] = {
+ &ov9732_sensor_drv,
+ &ov9286_sensor_drv,
+ &imx335_sensor_drv,
+};
+```
+
+### 4.3 更新sensor配置信息列表
+
+sensor配置信息有结构体k_vicap_sensor_info定义:
+
+```shell
+typedef struct {
+ const char *sensor_name; /*sensor名字*/
+ const char *calib_file; /*sensor标定文件名*/
+ k_u16 width; /*sensor输出图像宽度*/
+ k_u16 height; /*sensor输出图像高度*/
+ k_vicap_csi_num csi_num; /*sensor硬件连接使用的CSI总线标号*/
+ k_vicap_mipi_lanes mipi_lanes; /*sensor硬件连接使用的MIPI LANE个数*/
+ k_vicap_data_source source_id; /*数据源ID*/
+ k_bool is_3d_sensor; /*是否为3D sensor*/
+
+ k_vicap_mipi_phy_freq phy_freq; /*MIPI PHY速率*/
+ k_vicap_csi_data_type data_type; /*CSI数据类型*/
+ k_vicap_hdr_mode hdr_mode; /*HDR模式*/
+ k_vicap_vi_flash_mode flash_mode; /*flash模式选择*/
+ k_vicap_vi_first_frame_sel first_frame;
+ k_u16 glitch_filter;
+ k_vicap_sensor_type sensor_type; /*sensor类型*/
+} k_vicap_sensor_info;
+```
+
+以下是ov9732对应的配置信息:
+
+```shell
+const k_vicap_sensor_info sensor_info_list[] = {
+ {
+ "ov9732",
+ "ov9732",
+ 1920,
+ 1080,
+ VICAP_CSI0,
+ VICAP_MIPI_1LANE,
+ VICAP_SOURCE_CSI0,
+ K_FALSE,
+ VICAP_MIPI_PHY_800M,
+ VICAP_CSI_DATA_TYPE_RAW10,
+ VICAP_LINERA_MODE,
+ VICAP_FLASH_DISABLE,
+ VICAP_VI_FIRST_FRAME_FS_TR0,
+ 0,
+ OV_OV9732_MIPI_1920X1080_30FPS_10BIT_LINEAR
+ },
+```
+
+用户每增加一个sensor配置模式,就需要在sensor_info_list这个结构体中增加一项对应模式的配置。
+
+### 4.4 增加sensor配置文件
+
+当前SDK版本sensor配置文件包括xml文件和json文件,文件存放路径如下:
+
+```shell
+src/big/mpp/userapps/src/sensor/config/
+```
+
+以下是ov9732对应的配置文件:
+
+```shell
+ov9732.xml ov9732_auto.json ov9732_manual.json
+```
+
+对于新增加的sensor,可以通过拷贝修改现有文件实现支持,其中的calibration和tuning参数可以通过相关工具修改导出。
diff --git "a/zh/02_applications/tutorials/K230_\345\244\247\345\260\217\346\240\270\351\200\232\350\256\257_sharefs\347\224\250\346\263\225\344\273\213\347\273\215.md" "b/zh/02_applications/tutorials/K230_\345\244\247\345\260\217\346\240\270\351\200\232\350\256\257_sharefs\347\224\250\346\263\225\344\273\213\347\273\215.md"
new file mode 100644
index 0000000..238e0ff
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_\345\244\247\345\260\217\346\240\270\351\200\232\350\256\257_sharefs\347\224\250\346\263\225\344\273\213\347\273\215.md"
@@ -0,0 +1,160 @@
+# K230大小核通讯Sharefs使用简介
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 概述
+
+ShareFs通过对大小核各自/sharefs目录的访问,提供了大核访问小核文件系统的功能。在实际使用中,通常会将大核的可执行程序存放在/sharefs目录下,大核通过sharefs功能执行这些程序,方便大核上应用程序的开发和调试。
+
+## 环境准备
+
+### 硬件环境
+
+- K230-USIP-LP3-EVB-V1.0/K230-UNSIP-LP3-EVB-V1.1
+
+### 软件环境
+
+k230_SDK
+
+## 使用
+
+### sharefs运行
+
+sharefs底层依赖核间通讯的驱动组件以及上层的IPCMSG库,SDK镜像烧录后会默认开启sharefs功能,并将sd卡的最后一个分区挂载到/sharefs目录下
+
+``` shell
+/dev/mmcblk1p4 on /sharefs type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
+```
+
+如果空间不够的话,可以先解除挂载,然后删除掉sd卡的最后一个分区,重新分一个更大的分区,最后重启开发板,SDK会自动执行挂载。
+
+### 文件创建写入查看
+
+在大核rt-smart的msh命令行下,可通过echo的方式在/sharefs里创建一个文件。
+
+``` shell
+msh /sharefs>echo "hello wrold" hello.txt
+```
+
+在小核linux的shell终端下可以在/sharefs中查看这个文件内容
+
+``` shell
+[root@canaan ~ ]#cd /sharefs/
+[root@canaan /sharefs ]#cat hello.txt
+hello wrold[root@canaan /sharefs ]#
+```
+
+### 文件夹创建
+
+在大核rt-smart的msh命令行下,通过mkdir创建一个目录
+
+``` shell
+msh /sharefs>mkdir test
+```
+
+在小核的linux的shell中,使用ls查看新增的目录
+
+``` shell
+[root@canaan /sharefs ]#ls
+System Volume Information hello.txt test
+```
+
+### 文件读取
+
+在小核linux的shell中,通过echo创建一个文件
+
+``` shell
+[root@canaan /sharefs ]#echo "hello world this is linux" >> linux.txt
+```
+
+在大核rt-smart的msh命令行下,使用cat查看文件内容
+
+``` shell
+msh /sharefs>cat linux.txt
+hello world this is linux
+```
+
+### 文件加载
+
+将编译好的rt-smart用户态可执行的elf文件,拷贝到小核的/sharefs目录,然后通过大核rt-smart的msh命令行来执行
+
+``` shell
+msh /sharefs>./hello.elf
+Hello world
+```
+
+### 文件删除
+
+在大核rt-smart的msh命令行下,使用rm删除文件
+
+``` shell
+
+msh /sharefs>ls
+Directory /sharefs:
+.
+..
+System Volume Information
+hello.txt 11
+linux.txt 26
+msh /sharefs>rm hello.txt
+msh /sharefs>rm linux.txt
+msh /sharefs>ls
+Directory /sharefs:
+.
+..
+System Volume Information
+msh /sharefs>
+```
+
+在小核的linux的shell中,使用ls查看删除结果
+
+``` shell
+[root@canaan /sharefs ]#ls
+System Volume Information
+```
+
+### 其他
+
+sharefs在rt-smart上支持大多数的posix文件接口操作,包括
+
+- open
+- close
+- ioctl
+- read
+- write
+- flush
+- lseek
+- stat
+- statfs
+- opendir
+- rewinddir
+- mkdir
+- rmdir
+- rename
+
+等,感兴趣的读者可自行编写文件IO读写相关的测试代码体验
+
+### 注意事项
+
+- sharefs不适合高频次实时读写的场景,例如编码存盘
+- 大核在sharefs下创建的文件,在linux上的读写可执行权限都存在
+- sharefs不适合多进程使用,即避免在大核上启动多个进程同时读写/sharefs目录下的文件
diff --git "a/zh/02_applications/tutorials/K230_\345\256\236\346\210\230\345\237\272\347\241\200\347\257\207_hello_world.md" "b/zh/02_applications/tutorials/K230_\345\256\236\346\210\230\345\237\272\347\241\200\347\257\207_hello_world.md"
new file mode 100755
index 0000000..0f7e497
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_\345\256\236\346\210\230\345\237\272\347\241\200\347\257\207_hello_world.md"
@@ -0,0 +1,198 @@
+# K230 实战基础篇 - hello world
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 概述
+
+本文将讲解如果在pc端使用交叉编译工具编译一个hello world的基础程序,并在大核rt-smart或小核linux上运行。
+
+## 环境准备
+
+### 硬件环境
+
+- K230-USIP-LP3-EVB-V1.0/K230-USIP-LP3-EVB-V1.1
+- Ubuntu PC 20.04
+- Typec USB线 * 2 至少
+- USB TypeC转以太网(如果使用TFTP加载和NFS文件系统)
+- 网线一根
+- SD卡(如果使用SD卡启动,或软件需要访问SD卡)
+
+### 软件环境
+
+k230_sdk中提供了工具链,分别在如下路径。
+
+- 大核rt-samrt工具链
+
+``` shell
+k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu
+```
+
+- 小核linux工具链
+
+``` shell
+k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0
+```
+
+也可通过以下链接下载工具链
+
+``` shell
+wget https://download.rt-thread.org/rt-smart/riscv64/riscv64-unknown-linux-musl-rv64imafdcv-lp64d-20230222.tar.bz2
+wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1659325511536/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0-20220715.tar.gz
+```
+
+### 代码编写
+
+在ubuntu上创建一个C文件hello.c并加入如下代码
+
+```C
+#include
+int main (void)
+{
+ printf("hello world\n");
+ return 0;
+}
+```
+
+将hello.c放到与k230_sdk同一级目录下
+
+``` shell
+canaan@develop:~/work$ ls
+hello.c k230_sdk
+```
+
+### 编译适用于小核linux的可执行程序
+
+``` shell
+k230_sdk/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-gcc hello.c -o hello
+```
+
+### 编译适用于大核rt-smart的可执行程序
+
+``` shell
+k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc -o hello.o -c -mcmodel=medany -march=rv64imafdcv -mabi=lp64d hello.c
+
+k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc -o hello.elf -mcmodel=medany -march=rv64imafdcv -mabi=lp64d -T k230_sdk/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds -Lk230_sdk_src/big/rt-smart/userapps/sdk/rt-thread/lib -Wl,--whole-archive -lrtthread -Wl,--no-whole-archive -n --static hello.o -Lk230_sdk/src/big/rt-smart/userapps/sdk/lib/risc-v/rv64 -Lk230_sdk/src/big/rt-smart/userapps/sdk/rt-thread/lib/risc-v/rv64 -Wl,--start-group -lrtthread -Wl,--end-group
+```
+
+### 运行程序
+
+将编译好的hello以及hello.elf拷贝到sd卡的vfat分区内(sd卡烧写完镜像后可以在pc端看到一个可用的盘符),或通过其他方式(参考sdk使用说明文档)将可执行程序拷贝到小核的/sharefs目录下。
+
+- 开发板启动后,在小核端运行测试程序,小核启动后输入`root`进入控制台
+
+``` shell
+Welcome to Buildroot
+canaan login: root
+[root@canaan ~ ]#cd /sharefs
+[root@canaan /sharefs ]#./hello
+hello world
+```
+
+- 在大核端运行测试程序
+
+``` shell
+msh /sharefs>hello.elf
+hello world
+```
+
+### 大核程序编译进阶
+
+大核如果用musl-gcc直接编译的话,编译参数是比较多的,对于初学者来说很不方便,也不太好理解,当前sdk中提供了两种用于编译大核程序的方式,分别是scons和Makefile,这里我们介绍scons的编译方式,Makefile的编译构建较为复杂,不是rt-smart官方提供的编译方式,感兴趣的读者可参考`src/big/mpp/userapps/sample`中的Makefile结构来编译。
+
+到`k230_sdk/src/big/rt-smart/userapps`目录下创建一个文件夹,命名为hello
+
+``` shell
+cd k230_sdk/src/big/rt-smart/userapps
+mkdir hello
+cd hello
+```
+
+创建以下三个文件
+
+- hello.c
+- SConscript
+
+``` python
+# RT-Thread building script for component
+
+from building import *
+
+cwd = GetCurrentDir()
+src = Glob('*.c')
+CPPPATH = [cwd]
+
+CPPDEFINES = [
+ 'HAVE_CCONFIG_H',
+]
+group = DefineGroup('hello', src, depend=[''], CPPPATH=CPPPATH, CPPDEFINES=CPPDEFINES)
+
+Return('group')
+```
+
+- SConstruct
+
+``` python
+import os
+import sys
+
+# add building.py path
+sys.path = sys.path + [os.path.join('..','..','tools')]
+from building import *
+
+BuildApplication('hello', 'SConscript', usr_root = '../')
+
+```
+
+之后回到`k230_sdk/src/big/rt-smart/`目录,配置环境变量
+
+``` shell
+canaan@develop:~/k230_sdk/src/big/rt-smart$ source smart-env.sh riscv64
+Arch => riscv64
+CC => gcc
+PREFIX => riscv64-unknown-linux-musl-
+EXEC_PATH => /home/canaan/k230_sdk/src/big/rt-smart/../../../toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
+
+```
+
+进入`k230_sdk/src/big/rt-smart/userapps`目录,编译程序
+
+``` shell
+canaan@develop:~/k230_sdk/src/big/rt-smart/userapps$ scons --directory=hello
+scons: Entering directory `/home/canaan/k230_sdk/src/big/rt-smart/userapps/hello'
+scons: Reading SConscript files ...
+scons: done reading SConscript files.
+scons: Building targets ...
+scons: building associated VariantDir targets: build/hello
+CC build/hello/hello.o
+LINK hello.elf
+/home/canaan/k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/../lib/gcc/riscv64-unknown-linux-musl/12.0.1/../../../../riscv64-unknown-linux-musl/bin/ld: warning: hello.elf has a LOAD segment with RWX permissions
+scons: done building targets.
+```
+
+编译好的程序在hello文件夹下
+
+``` shell
+canaan@develop:~/k230_sdk/src/big/rt-smart/userapps$ ls hello/
+build cconfig.h hello.c hello.elf SConscript SConstruct
+```
+
+之后即可将hello.elf拷贝到小核linux上,然后大核rt-smart通过/sharefs即可运行该程序
diff --git "a/zh/02_applications/tutorials/K230_\347\274\226\347\240\201\345\256\236\346\210\230_rtsp_server\346\220\255\345\273\272\345\222\214\346\216\250\346\265\201.md" "b/zh/02_applications/tutorials/K230_\347\274\226\347\240\201\345\256\236\346\210\230_rtsp_server\346\220\255\345\273\272\345\222\214\346\216\250\346\265\201.md"
new file mode 100755
index 0000000..17c02e8
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_\347\274\226\347\240\201\345\256\236\346\210\230_rtsp_server\346\220\255\345\273\272\345\222\214\346\216\250\346\265\201.md"
@@ -0,0 +1,195 @@
+# K230 编码实战 - rtsp sever搭建和推流
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 1. 环境准备
+
+### 1.1 硬件环境
+
+- K230-USIP-LP3-EVB-V1.0/K230-UNSIP-LP3-EVB-V1.1
+- Ubuntu PC 20.04
+- Typec USB线 * 2。
+ - 一根连接到UART0/3,用于串口收发,UART0对应小核,UART3对应大核。
+ - 一根连接到DC:5V接口,用于供电。
+- USB TypeC转以太网,连接到USB0。
+- 网线一根
+- SD卡(如果使用SD卡启动,或软件需要访问SD卡)
+- 摄像头子板(IMX335,用于rtsp推音视频流)
+- 耳机(用于语音对讲)
+- 杜邦线一根,按下图连接USB0_OTG_EN和高电平
+
+![usb_ethnet_pin](images/usb_ethnet_pin.png)
+
+注意:音频对讲需要两套设备。
+
+### 1.2 软件环境
+
+- K230 SDK
+- VLC播放器
+
+### 1.3 运行准备
+
+在EVB上执行rtsp程序需要启动网络服务,并保证PC和EVB板在同一个网段。
+
+## 2. 源码介绍
+
+### 2.1 源码位置
+
+在SDK中包含的rtsp相关demo位于`k230_sdk/src/common/cdk/user/samples`目录下,其中
+
+- `rtsp_demo`:语音推音视频流程序
+- `rtsp`:语音对讲服务器端程序
+- `backchannel_client`:语音对讲客户端程序
+
+### 2.2 源码介绍
+
+K230 SDK采用双核架构,小核运行linux系统,实现网络控制服务。大核运行RTT系统,实现对音视频硬件的控制。小核在启动过程中负责引导大核。大小核通过核间通信进行消息通信和内存共享。多媒体软件架构如下:
+
+![mpp_sturcture](images/mpp_structure.png)
+
+小核网络服务移植了live源码,路径为`k230_sdk/src/common/cdk/user/thirdparty/live`
+音频使用G711编码。
+音视频推流中,视频默认最大分辨率与配置的sensor_type相关,默认最大分辨率为1920x1080。
+
+#### 2.2.1 程序主要步骤
+
+##### 2.2.1.1 音视频推流程序
+
+1. `new StreamingPlayer`
+ - 初始化核间通信。
+ - 配置video buffer。
+1. `InitVicap`:初始化摄像头。
+1. `CreateSession`:
+ - 创建server session。
+ - 创建并开启音频输入通道,音频采样率为44.1k,采样宽度16bit。
+ - 初始化音频编码,音频采用G711A编码。
+ - 创建视频编码通道,使能IDR帧。
+1. `Start`:
+ - 开启视频编码通道并绑定到vo。
+ - 开启视频编码通道,并将视频输入绑定到视频编码。
+ - 开始音视频推流。
+
+##### 2.2.1.2 语音对讲程序
+
+1. `Init`:
+ - 创建server session。
+ - 初始化核间通信。
+ - 配置video buffer。
+ - 创建并开启音频输入通道,音频采样率为8k,采样宽度为16bit。
+ - 创建音频编码通道,音频采用G711U编码。
+ - 创建音频输出通道和音频解码通道,并将音频解码绑定到音频输出。
+1. `Start`:
+ - 开始推音频流。
+ - 开启视频编码通道,并将视频输入绑定到视频编码。
+
+## 3.程序执行
+
+### 3.1 rtsp推音视频流
+
+#### 3.1.1 参数说明
+
+| 参数名 | 描述 |参数范围 | 默认值 |
+|:--|:--|:--|:--|
+| help | 打印命令行参数信息 | - | - |
+| n | session个数 | `[1, 3]` | 1 |
+| t | 编码类型 | h264、h265、mjpeg | h264 |
+| w | 视频编码宽度 | `[128, 1920]` | 1280 |
+| h | 视频编码高度 | `[64, 1080]` |720 |
+| s | sensor类型。| 0: ov9732;1: ov9286 ir;2: ov9286 speckle;3: imx335 2LANE 1920Wx1080H;4: imx335 2LANE 2592Wx1944H;5: imx335 4LANE 2592Wx1944H;6: imx335 2LANE MCLK 7425 1920Wx1080H;7: imx335 2LANE MCLK 7425 2592Wx1944H;8: imx335 4LANE MCLK 7425 2592Wx1944H | 7 |
+
+#### 3.1.2 编译程序
+
+在`k230_sdk`目录下执行`make cdk-user`,在`k230_sdk/src/common/cdk/user/out/little/`目录下生成`rtsp_demo`
+
+程序源码目录`k230_sdk/src/common/cdk/user/samples/rtsp_demo`
+
+#### 3.1.3 运行程序
+
+支持音视频码流同时推流到rtsp server上,其中通过`mapi venc&aenc`接口实现对音视频的编码;推流之后通过url进行拉取,目前支持两路url推拉流。
+
+1. 在大核上执行:`cd /sharefs; ./sample_sys_init.elf`
+1. 在小核上执行:`./rtsp_demo`
+1. 小核上运行rtsp_demo后,会打印出形如:`rtsp://ip:8554/session0` 和 `rtsp://ip:8554/session01` 的url地址,可通过vlc拉取对应的流进行播放。
+ vlc拉流方式:媒体->打开网络串流->在打开的窗口中输入对应的url。
+ ![vlc](images/vlc.png)
+
+### 3.2 语音对讲
+
+用于实现音频数据的双向传输和处理。
+语音对讲涉及到两端,两端均能实时采集编码发送音频数据到对端,同时也能接收对端来的音频数据进行解码和输出。
+当前实现参照了ONVIF,在rtsp协议的基础上扩展backchannel,从而支持从client向server发送音频数据;下文使用server和client分别代指语音对讲的两端。
+
+1. 音频码流格式为G711 mu-Law;
+1. sever端实现了实时的音频采集编码和发送,以及通过backchannel接收来自client的音频数据进行解码和输出;
+1. client端实现了音频码流的接收,解码和播放,以及实时采集音频,G711 mu-Law编码,并通过backchannel发送到server端
+1. 仅支持一对一的对讲(仅支持一路backchannel);
+1. 不支持回声消除等处理(设备侧需要音频输出到耳机,不能使用外放speaker);
+
+#### 3.2.1 编译程序
+
+在`k230_sdk`目录下执行`make cdk-user`,在`k230_sdk/src/common/cdk/user/out/little/`目录下生成`rtsp_server`和`backclient_test`
+
+程序源码目录:
+`k230_sdk/src/common/cdk/user/samples/rtsp_demo/rtsp_server`
+`k230_sdk/src/common/cdk/user/samples/rtsp_demo/backchannel_client`
+
+#### 3.2.2 运行程序
+
+两块EVB连到同一个网段,一个作为server,一个作为client。大小核完全启动后。
+
+server端运行如下命令:
+
+- 在大核上执行:`cd /sharefs; ./sample_sys_init.elf`
+- 在小核上执行:`cd /mnt; ./rtsp_server`(运行rtsp_server后,会打印出形如:`rtsp://:8554/BackChannelTest` 的url地址)
+
+client端运行如下命令:
+
+- 在大核上执行:`cd /sharefs; ./sample_sys_init.elf`
+- 在小核上执行:`./backclient_test rtsp://:8554/BackChannelTest`)
+
+## 4. 运行sharefs
+
+大核的`sample_sys_init.elf`默认没有装载到大核。可以通过下面两中方式将其在大核运行。
+
+1. 修改`k230_sdk/Makefile`中`mpp-apps`的编译脚本,在`cd -;`前增加如下命令,并在`k230_sdk`目录下执行`make rt-smart;make build-image`,生成的镜像文件中,在大核的`/bin`目录下即包含`sample_sys_init.elf`
+
+ ```sh
+ cp userapps/sample/elf/sample_sys_init.elf $(RTSMART_SRC_DIR)/userapps/root/bin/; \
+ ```
+
+1. 启动大小核之后,通过sharefs和tftp将可执行程序传输到EVB板上运行。
+/sharefs用于在大小核之间共享文件,大小核均可以通过访问各自的/sharefs目录来实现共享文件系统的功能。大核的自身文件系统为只读模式。可以在小核将/sharefs目录mount到SD卡分区或者PC的nfs目录等,并可通过tftp实现文件传输功能。
+
+ ```sh
+ mount /dev/mmcblk1p4 /sharefs #将/sharefs mount到SD卡分区
+ ```
+
+ ```sh
+ mount -t nfs -o nolock : /sharefs/ #将/sharefs mount到ipaddr的nfs_path目录
+ ```
+
+ tftp的命令如下:
+
+ ```sh
+ tftp -gr #从ipaddr的主机上将文件传输到板卡上
+ tftp -pl #将文件从板卡传输到ipaddr的主机上
+ ```
diff --git "a/zh/02_applications/tutorials/K230_\351\237\263\351\242\221\345\256\236\346\210\230_\351\237\263\351\242\221\351\207\207\351\233\206_\346\222\255\346\224\276\345\222\214\347\274\226\350\247\243\347\240\201.md" "b/zh/02_applications/tutorials/K230_\351\237\263\351\242\221\345\256\236\346\210\230_\351\237\263\351\242\221\351\207\207\351\233\206_\346\222\255\346\224\276\345\222\214\347\274\226\350\247\243\347\240\201.md"
new file mode 100644
index 0000000..707980d
--- /dev/null
+++ "b/zh/02_applications/tutorials/K230_\351\237\263\351\242\221\345\256\236\346\210\230_\351\237\263\351\242\221\351\207\207\351\233\206_\346\222\255\346\224\276\345\222\214\347\274\226\350\247\243\347\240\201.md"
@@ -0,0 +1,486 @@
+# K230 音频实战 - 音频采集、播放和编解码
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ------------ |
+| ai | 音频输入模块 |
+| ao | 音频输出模块 |
+| aenc | 音频编码模块 |
+| adec | 音频解码模块 |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|---|---|---|---|
+| V1.0 | 初版 | 孙小朋 | 2023-07-03 |
+| | | | |
+| | | | |
+
+## 1. 概述
+
+本文讲解如何使用音频demo在大核rt-smart或小核linux上实现音频采集、播放、编码、解码等功能。
+
+## 2. 环境准备
+
+### 2.1 硬件环境
+
+- K230-UNSIP-LP3-EVB-V1.0/K230-UNSIP-LP3-EVB-V1.1
+
+- Ubuntu PC 20.04
+
+- Typec USB线 * 2。
+ - 一根连接到UART0/3,用于串口收发,UART0对应小核,UART3对应大核。
+ - 一根链接到DC:5V接口,用于供电。
+
+- USB TypeC转以太网,连接到USB0。
+
+- 网线一根
+
+- SD卡(如果使用SD卡启动,或软件需要访问SD卡)
+
+- 音频子板(使用外置音频通路时需要),如下图所示,注意安装位置及跳线帽接法。当使用pdm音频传输接口及外置i2s音频传输接口时需要使用音频子板;仅使用内置i2s音频传输接口不需要音频子板。
+
+ ![image-20230703161821233](./images/audio-board.png)
+
+### 2.2 编译程序
+
+#### 2.2.1 编译方法
+
+在`k230_sdk`目录下执行`make rt-smart`,在`k230_sdk/src/big/mpp/userapps/sample/elf`目录下生成`sample_audio.elf`,为大核rt-smart下的音频demo。
+在`k230_sdk`目录下执行`make cdk-user`,在`k230_sdk/src/common/cdk/user/out/little/`目录下生成`sample_audio`,为小核linux下执行的音频demo。
+默认情况下,板子启动后大核rt-smart系统下sample_audio.elf在/sharefs下,小核audio demo sample_audio在/mnt下。
+
+#### 2.2.2 代码位置
+
+程序源码目录:
+大核音频demo源码位置:`k230_sdk/src/big/mpp/userapps/sample/sample_audio`
+小核音频demo源码位置:`k230_sdk/src/common/cdk/user/mapi/sample/sample_audio`
+
+## 3. 大核音频实战
+
+大核demo文件为sample_audio.elf,支持音频采集(ai),音频播放(ao),音频编码(aenc),音频解码(adec)等功能。
+
+### 3.1 参数说明
+
+| 参数名 | 描述 | 默认值 |
+|:--|:--|:--|
+| help | 打印命令行参数信息 | - |
+| samplerate | 设置音频采样率,有效值`[8000,12000,16000,24000,32000,44100,48000,96000,192000]` | 44100 |
+| enablecodec | i2s使用内置(1)或外置(0)链路,有效值:0、1 | 0 |
+| bitwidth | 采样精度,有效值:16、24、32 | 16 |
+| channels | 声道数,有效值:1、2 | 2 |
+| filename | 输入或输出的文件名称 | - |
+| type | 功能类型,有效值:[0,12],具体值参考下表 | 0 |
+
+| type值 | 功能描述 |
+| :----- | :----------------------------------------------------------- |
+| 0 | i2s 音频采集功能 |
+| 1 | pdm音频采集功能 |
+| 2 | i2s音频播放功能 |
+| 3 | ai->ao回环功能:使用api接口实现。ai为i2s接口,ao为i2s接口。 |
+| 4 | ai->ao回环功能:使用模块绑定(ai绑定ao)实现。ai为i2s接口,ao为i2s接口。 |
+| 5 | ai->ao回环功能:使用api接口实现。ai为pdm接口,ao为i2s接口。 |
+| 6 | ai->ao回环功能:使用模块绑定(ai绑定ao)实现。ai为pdm接口,ao为i2s接口。 |
+| 7 | 音频编码功能:ai->aenc,使用模块绑定(ai绑定aenc)实现,ai为i2s接口,aenc为g711a编码格式。 |
+| 8 | 音频解码功能:adec->ao,使用模块绑定(adec绑定ao)实现,ao为i2s接口,adec为g711a解码格式。 |
+| 9 | 音频编码功能:ai->aenc,使用api接口实现,ai为i2s接口,aenc为g711a编码格式。 |
+| 10 | 音频解码功能:adec->ao,使用api接口实现,ao为i2s接口,adec为g711a解码格式。 |
+| 12 | ai->aenc、adec->ao回环功能:使用模块绑定(ai绑定aenc,adec绑定ao)实现。ai为i2s接口,ao为i2s接口。 |
+
+### 3.2 音频采集
+
+音频采集支持i2s和pdm两种音频传输接口。i2s音频采集共支持两组,可同时工作;pdm音频采集共支持四组,可同时工作。
+
+i2s音频采集:共支持两组,其中第一组可选择为内置或外置通路,第二组固定为外置通路。当第一组作为内置通路使用时,左声道声音为耳机线性模拟输入,右声道声音为板载模拟麦输入,且当设置为单声道工作模式时,声音固定为板载模拟麦输入。当作为外置通路使用时,左右声道声音均为子板上数字麦输入。
+
+![image-20230704100947965](./images/audio-capture-i2s.png)
+
+pdm音频采集:需接外置子板,共支持四组,且可同时工作。每组均支持单/双声道采集,且各声道声音均为子板上数字麦输入。
+
+![image-20230704101309168](./images/audio-capture-pdm.png)
+
+### 3.2.1 i2s音频采集
+
+开发板启动后,在大核上运行如下测试程序:`/sharefs/sample_audio.elf -type 0 -enablecodec 1 -samplerate 48000 -bitwidth 24 -channels 2 -filename /sharefs/test.wav`
+demo使用采样率48000,使用内置codec通路,采样精度24bit,双声道,采集数据以wav格式保存到/sharefs/test.wav文件中,采集15s数据后退出。
+
+``` shell
+/sharefs/sample_audio.elf -type 0 -enablecodec 1 -samplerate 48000 -bitwidth 24 -channels 2 -filename /sharefs/test.wav
+audio type:0,sample rate:48000,bit width:24,channels:2,enablecodec:1
+mmz blk total size:8.12 MB
+vb_set_config ok
+sample ai i2s module
+audio i2s set clk freq is 3072000(3072000),ret:1
+audio codec adc clk freq is 12288000(12288000)
+audio_save_init get vb block size:4320044
+======kd_mpi_sys_mmap total size:4320044
+[0s] timestamp 0 us,curpts:3232823
+[1s] timestamp 1000000 us,curpts:4232823
+[2s] timestamp 2000000 us,curpts:5232823
+[3s] timestamp 3000000 us,curpts:6232823
+[4s] timestamp 4000000 us,curpts:7232823
+[5s] timestamp 5000000 us,curpts:8232823
+[6s] timestamp 6000000 us,curpts:9232823
+[7s] timestamp 7000000 us,curpts:10232823
+[8s] timestamp 8000000 us,curpts:11232823
+[9s] timestamp 9000000 us,curpts:12232823
+[10s] timestamp 10000000 us,curpts:13232823
+[11s] timestamp 11000000 us,curpts:14232823
+[12s] timestamp 12000000 us,curpts:15232823
+[13s] timestamp 13000000 us,curpts:16232823
+dump binary memory test1.wav 0x18242000 0x18660b2c
+[14s] timestamp 14000000 us,curpts:17232823
+destroy vb block
+sample done
+```
+
+### 3.2.2 pdm音频采集
+
+开发板启动后,在大核上运行如下测试程序:`/sharefs/sample_audio.elf -type 1 -samplerate 16000 -bitwidth 16 -channels 2 -filename /sharefs/test.wav`
+demo采样率16000,外置音频通路(需要接音频子板),采样精度16bit,双声道,采集数据以wav格式保存到/sharefs/test.wav文件中,采集15s数据后退出。
+
+``` shell
+/sharefs/sample_audio.elf -type 1 -samplerate 16000 -bitwidth 16 -channels 2 -filename /sharefs/test.wav
+audio type:1,sample rate:16000,bit width:16,channels:2,enablecodec:0
+mmz blk total size:2.71 MB
+vb_set_config ok
+sample ai pdm module
+audio_sample_get_ai_pdm_data channel_total:1,rec_channel:0,oversample:0
+pdm in init clk freq is 1536000
+pdm in set clk freq is 512000(512000)
+audio_save_init get vb block size:960044
+======kd_mpi_sys_mmap total size:960044
+[0s] timestamp 0 us,curpts:1006669
+[1s] timestamp 1000000 us,curpts:2006669
+[2s] timestamp 2000000 us,curpts:3006669
+[3s] timestamp 3000000 us,curpts:4006669
+[4s] timestamp 4000000 us,curpts:5006669
+[5s] timestamp 5000000 us,curpts:6006669
+[6s] timestamp 6000000 us,curpts:7006669
+[7s] timestamp 7000000 us,curpts:8006669
+[8s] timestamp 8000000 us,curpts:9006669
+[9s] timestamp 9000000 us,curpts:10006669
+[10s] timestamp 10000000 us,curpts:11006669
+[11s] timestamp 11000000 us,curpts:12006669
+[12s] timestamp 12000000 us,curpts:13006669
+[13s] timestamp 13000000 us,curpts:14006669
+dump binary memory test1.wav 0x180c1000 0x181ab62c
+[14s] timestamp 14000000 us,curpts:15006669
+destroy vb block
+sample done
+```
+
+### 3.3 音频播放
+
+音频播放支持i2s音频传输接口。i2s音频采集共支持两组,可同时工作。其中第一组可选择为内置或外置通路,第二组固定为外置通路。当第一组作为内置通路使用时,声音输出为板载耳机输出口;当使用外置通路时,声音输出为子板耳机输出口。
+
+![image-20230704104012443](./images/audio-play-i2s.png)
+
+#### 3.3.1 i2s音频播放
+
+开发板启动后,在大核上运行如下测试程序:`./sample_audio.elf -type 2 -filename test.wav -enablecodec 1`
+demo根据wav文件格式自动设置音频属性,循环播放wav文件,使用耳机插入板载耳机插口,即可听到声音。按任意键退出demo。
+
+``` shell
+./sample_audio.elf -type 2 -filename test.wav -enablecodec 1
+audio type:2,sample rate:44100,bit width:16,channels:2,enablecodec:1
+mmz blk total size:7.46 MB
+vb_set_config ok
+enter any key to exit
+sample ao i2s module
+========read_wav_header:headerlen:44,channel:2,samplerate:16000,bitpersample:16
+open file:test.wav ok,file size:960044,data size:960000,wav header size:44
+=======_get_audio_frame virt_addr:0x10010e000
+audio i2s set clk freq is 1024000(1024000),ret:1
+audio init codec dac clk freq is 11289600
+audio set codec dac clk freq is 4096000(4096000)
+read file again
+q
+diable ao audio
+destroy vb block
+sample done
+```
+
+### 3.4 音频编解码
+
+内置g711a/u编解码模块,如需支持其他编解码格式,可通过注册外部编解码器来实现。所有编解码模块均使用CPU软件编解码且只支持16bit采样精度。
+
+音频编码存储流程如下,数据流向为ai->aenc。
+
+![image-20230704105447088](./images/audio-capture-i2s-encode.png)
+
+音频解码播放流程如下,数据流向为adec->ao。
+
+![image-20230704105603766](./images/audio--i2s-decode-play.png)
+
+#### 3.4.1 音频编码
+
+开发板启动后,在大核上运行如下测试程序:`./sample_audio.elf -type 7 -filename /sharefs/test.g711a -channels 2 -samplerate 8000 -bitwidth 16 -enablecodec 1`
+将ai采集到的数据(双声道,采样率8000,内置codec链路,采样精度16)编码成g711a格式后存到文件中,按任意键退出demo。
+
+``` shell
+./sample_audio.elf -type 7 -filename /sharefs/test.g711a -channels 2 -samplerate 8000 -bitwidth 16 -enablecodec 1
+audio type:7,sample rate:8000,bit width:16,channels:1,enablecodec:1
+mmz blk total size:1.35 MB
+vb_set_config ok
+enter any key to exit
+sample aenc module (sysbind)
+audio i2s set clk freq is 512000(512000),ret:1
+audio codec adc clk freq is 2048000(2048000)
+q
+destroy vb block
+sample done
+```
+
+#### 3.4.2 音频解码
+
+开发板启动后,在大核上运行如下测试程序:`./sample_audio.elf -type 8 -filename /sharefs/test.g711a -channels 2 -samplerate 8000 -bitwidth 16 -enablecodec 1`
+将g711a格式(采样率8000,声道数2,采样精度16)文件解码后通过ao(内置codec通路)播放输出,按任意键退出demo。
+
+``` shell
+./sample_audio.elf -type 8 -filename /sharefs/test.g711a -channels 2 -samplerate 8000 -bitwidth 16 -enablecodec 1
+audio type:8,sample rate:8000,bit width:16,channels:2,enablecodec:1
+mmz blk total size:1.35 MB
+vb_set_config ok
+enter any key to exit
+sample adec module (sysbind)
+audio i2s set clk freq is 512000(512000),ret:1
+audio init codec dac clk freq is 4096000
+audio set codec dac clk freq is 2048000(2048000)
+adec_bind_call_back dev_id:0 chn_id:0
+read file again
+q
+adec_bind_call_back dev_id:0 chn_id:0
+destroy vb block
+sample done
+```
+
+### 3.5 回环测试
+
+### 3.5.1 i2s采集播放回环
+
+开发板启动后,在大核上运行如下测试程序:`./sample_audio.elf -type 4 -enablecodec 1 -bitwidth 16 -samplerate 48000 -channels 2`
+同时运行ai和ao模块,将ai(采样精度16,采样率48000,双声道)采集到的声音数据实时输出到ao(采样精度16,采样率48000,双声道)播放,使用内置codec通路,按任意键退出demo。具体流程图如下。
+
+![image-20230704111434384](./images/audio-i2s-ai-ao-loopback.png)
+
+``` shell
+./sample_audio.elf -type 4 -enablecodec 1 -bitwidth 16 -samplerate 48000 -channels 2
+audio type:4,sample rate:48000,bit width:16,channels:2,enablecodec:1
+mmz blk total size:8.12 MB
+vb_set_config ok
+enter any key to exit
+sample ai(i2s) bind ao module
+audio i2s set clk freq is 3072000(3072000),ret:1
+audio codec adc clk freq is 12288000(12288000)
+audio i2s set clk freq is 3072000(3072000),ret:1
+audio init codec dac clk freq is 2048000
+audio set codec dac clk freq is 12288000(12288000)
+q
+diable ao module
+diable ai module
+release vb block
+destroy vb block
+sample done
+```
+
+### 3.5.2 pdm采集播放回环
+
+开发板启动后,在大核上运行如下测试程序:`./sample_audio.elf -type 6 -bitwidth 32 -samplerate 48000 -channels 2 -enablecodec 0`
+同时运行ai和ao模块,将ai(采样精度32,采样率48000,双声道)采集到的声音数据实时输出到ao(采样精度32,采样率48000,双声道)播放,使用外置子板通路,按任意键退出demo。具体流程图如下。
+
+![image-20230704111057270](./images/audio-pdm-ai-ao-loopback.png)
+
+``` shell
+./sample_audio.elf -type 6 -bitwidth 32 -samplerate 48000 -channels 2 -enablecodec 0
+audio type:6,sample rate:48000,bit width:32,channels:2,enablecodec:0
+mmz blk total size:8.12 MB
+vb_set_config ok
+enter any key to exit
+sample ai(pdm) bind ao module
+pdm in init clk freq is 3072000
+pdm in set clk freq is 3072000(3072000)
+audio i2s set clk freq is 3072000(3072000),ret:1
+q
+diable ao module
+diable ai module
+release vb block
+destroy vb block
+sample done
+```
+
+### 3.5.3 编解码回环
+
+开发板启动后,在大核上运行如下测试程序:`./sample_audio.elf -type 12 -samplerate 44100`
+同时运行ai、adec、aenc、ao模块,将ai绑定aenc,adec绑定ao,从aenc获取到的数据发送到adec,进而实现回环效果。音频采样精度固定为16bit,固定使用内置codec通路,按任意键退出demo。数据流如下图:
+
+![image-20230704105940599](./images/audio-ai-aenc-adec-ao-loopback.png)
+
+``` shell
+./sample_audio.elf -type 12 -samplerate 44100
+audio type:12,sample rate:44100,bit width:16,channels:2,enablecodec:0
+mmz blk total size:7.46 MB
+vb_set_config ok
+enter any key to exit
+sample ai->aenc adec->ao module (loopback)
+Force the sampling accuracy to be set to 16,use inner cocdec
+audio i2s set clk freq is 2822400(2822400),ret:1
+audio codec adc clk freq is 11289600(11289600)
+audio i2s set clk freq is 2822400(2822400),ret:1
+audio init codec dac clk freq is 12288000
+audio set codec dac clk freq is 11289600(11289600)
+adec_bind_call_back dev_id:0 chn_id:0
+[0s] g711 stream timestamp 0 us,curpts:1059296
+[1s] g711 stream timestamp 1000000 us,curpts:2059296
+[2s] g711 stream timestamp 2000000 us,curpts:3059296
+[3s] g711 stream timestamp 3000000 us,curpts:4059296
+[4s] g711 stream timestamp 4000000 us,curpts:5059296
+[5s] g711 stream timestamp 5000000 us,curpts:6059296
+[6s] g711 stream timestamp 6000000 us,curpts:7059296
+[7s] g711 stream timestamp 7000000 us,curpts:8059296
+[8s] g711 stream timestamp 8000000 us,curpts:9059296
+q
+adec_bind_call_back dev_id:0 chn_id:0
+destroy vb block
+sample done
+```
+
+## 4. 小核音频实战
+
+小核demo文件为sample_audio,支持音频采集(ai),音频播放(ao),音频编码(aenc),音频解码(adec)等功能。
+
+### 4.1 参数说明
+
+| 参数名 | 描述 | 默认值 |
+|:--|:--|:--|
+| help | 打印命令行参数信息 | - |
+| samplerate | 设置音频采样率,有效值`[8000,12000,16000,24000,32000,44100,48000,96000,192000]` | 44100 |
+| enablecodec | i2s使用内置(1)或外置(0)链路,有效值:0、1 | 0 |
+| channels | 声道数,有效值:1、2 | 2 |
+| filename | 输入或输出的文件名称 | - |
+| type | 功能类型,有效值:[0,2],具体值参考下表 | 0 |
+
+| type值 | 功能描述 |
+| :----- | :----------------------------------------------------------- |
+| 0 | 音频采集编码功能:ai->aenc,使用模块绑定(ai绑定aenc)实现,ai为i2s接口,aenc为g711a编码格式,采样精度固定16bit。 |
+| 1 | 音频解码播放功能:adec->ao,使用模块绑定(adec绑定ao)实现,ao为i2s接口,adec为g711a解码格式,采样精度固定16bit。 |
+| 2 | ai->aenc、adec->ao回环功能:使用模块绑定(ai绑定aenc,adec绑定ao)实现。ai为i2s接口,aenc为g711a格式,adec为g711a格式,ao为i2s接口,采样精度固定16bit。 |
+
+### 4.2 音频采集编码
+
+开发板启动后,在大核上运行程序:/sharefs/sample_sys_init.elf &
+在小核上运行如下程序:`./sample_audio -type 0 -samplerate 8000 -enablecodec 1 -channels 1 -filename test.g711a`
+将ai采集到的数据(单声道,采样率8000,内置codec链路,采样精度16)编码成g711a格式后存到文件中,按q键退出demo。数据流程图如下:
+
+![image-20230704115247002](./images/audio-capture-i2s-encode-mapi.png)
+
+``` shell
+./sample_audio -type 0 -samplerate 8000 -enablecodec 1 -channels 1 -filename test.g711a
+audio type:0,sample rate:8000,channels:1,enablecodec:1,filename:test.g711a
+mmz blk total size:0.38 MB
+[AENC_S] [Func]:_init_datafifo [Line]:174 [Info]:_aenc_datafifo_init_slave ok,datafifo_phyaddr:0x18061000,data_hdl:0x18061000
+enter 'q' key to exit
+_aenc_dataproc chn_num:0,stream data:0x18003c00,data len:320,seq:0,timestamp:99306
+_aenc_dataproc chn_num:0,stream data:0x18005a00,data len:320,seq:1,timestamp:139306
+_aenc_dataproc chn_num:0,stream data:0x18007800,data len:320,seq:2,timestamp:179306
+_aenc_dataproc chn_num:0,stream data:0x18009600,data len:320,seq:3,timestamp:219306
+_aenc_dataproc chn_num:0,stream data:0x1800b400,data len:320,seq:4,timestamp:259306
+_aenc_dataproc chn_num:0,stream data:0x1800d200,data len:320,seq:5,timestamp:299306
+_aenc_dataproc chn_num:0,stream data:0x1800f000,data len:320,seq:6,timestamp:339306
+_aenc_dataproc chn_num:0,stream data:0x18010e00,data len:320,seq:7,timestamp:379306
+_aenc_dataproc chn_num:0,stream data:0x18012c00,data len:320,seq:8,timestamp:419306
+_aenc_dataproc chn_num:0,stream data:0x18014a00,data len:320,seq:9,timestamp:459306
+_aenc_dataproc chn_num:0,stream data:0x18016800,data len:320,seq:10,timestamp:499306
+_aenc_dataproc chn_num:0,stream data:0x18018600,data len:320,seq:11,timestamp:539306
+_aenc_dataproc chn_num:0,stream data:0x1801a400,data len:320,seq:12,timestamp:579306
+_aenc_dataproc chn_num:0,stream data:0x1801c200,data len:320,seq:13,timestamp:619306
+_aenc_dataproc chn_num:0,stream data:0x1801e000,data len:320,seq:14,timestamp:659306
+_aenc_dataproc chn_num:0,stream data:0x1801fe00,data len:320,seq:15,timestamp:699306
+_aenc_dataproc chn_num:0,stream data:0x18021c00,data len:320,seq:16,timestamp:739306
+_aenc_dataproc chn_num:0,stream data:0x18023a00,data len:320,seq:17,timestamp:779306
+_aenc_dataproc chn_num:0,stream data:0x18025800,data len:320,seq:18,timestamp:819306
+_aenc_dataproc chn_num:0,stream data:0x18027600,data len:320,seq:19,timestamp:859306
+_aenc_dataproc chn_num:0,stream data:0x18029400,data len:320,seq:20,timestamp:899306
+_aenc_dataproc chn_num:0,stream data:0x1802b200,data len:320,seq:21,timestamp:939306
+_aenc_dataproc chn_num:0,stream data:0x1802d000,data len:320,seq:22,timestamp:979306
+_aenc_dataproc chn_num:0,stream data:0x1802ee00,data len:320,seq:23,timestamp:1019306
+_aenc_dataproc chn_num:0,stream data:0x18030c00,data len:320,seq:24,timestamp:1059306
+_aenc_dataproc chn_num:0,stream data:0x18032000,data len:320,seq:25,timestamp:1099306
+_aenc_dataproc chn_num:0,stream data:0x18033400,data len:320,seq:26,timestamp:1139306
+_aenc_dataproc chn_num:0,stream data:0x18034800,data len:320,seq:27,timestamp:1179306
+_aenc_dataproc chn_num:0,stream data:0x18035c00,data len:320,seq:28,timestamp:1219306
+_aenc_dataproc chn_num:0,stream data:0x18037000,data len:320,seq:29,timestamp:1259306
+q
+sample done
+```
+
+### 4.3 音频解码播放
+
+开发板启动后,在大核上运行程序:/sharefs/sample_sys_init.elf &
+在小核上运行如下测试程序:`./sample_audio -type 1 -samplerate 8000 -enablecodec 1 -channels 1 -filename test.g711a`
+将g711a格式(采样率8000,声道数1,采样精度16)文件解码后通过ao(内置codec通路)输出,按q键退出demo。
+
+![image-20230704115817994](./images/audio-decode-i2s-play-mapi.png)
+
+``` shell
+./sample_audio -type 1 -samplerate 8000 -enablecodec 1 -channels 1 -filename test.g711a
+audio type:1,sample rate:8000,channels:1,enablecodec:1,filename:test.g711a
+mmz blk total size:0.38 MB
+[ADEC_S] [Func]:_init_datafifo [Line]:189 [Info]:_adec_datafifo_init_slave ok,datafifo_phyaddr:0x18061000,data_hdl:0x18061000
+enter 'q' key to exit
+[ADEC_S] [Func]:_datafifo_release_func [Line]:157 [Info]:_datafifo_release_func,adec_hdl:0
+read file again
+read file again
+read file again
+q
+sample done
+```
+
+### 4.4 编解码回环
+
+开发板启动后,在大核上运行程序:`/sharefs/sample_sys_init.elf &`
+在小核上运行如下测试程序:`./sample_audio -type 2 -samplerate 48000 -enablecodec 1 -channels 2`
+同时运行ai、adec、aenc、ao模块,将ai(采样率48000,声道数2,采样精度16)绑定aenc(g711a),adec(g711a)绑定ao(采样率48000,声道数2,采样精度16),从aenc获取到的数据发送到adec,进而实现回环效果。
+
+![image-20230704151614911](./images/audio-loopback-mapi.png)
+
+``` shell
+./sample_audio -type 2 -samplerate 48000 -enablecodec 1 -channels 2
+audio type:2,sample rate:48000,channels:2,enablecodec:1,filename:
+mmz blk total size:2.26 MB
+[AENC_S] [Func]:_init_datafifo [Line]:174 [Info]:_aenc_datafifo_init_slave ok,datafifo_phyaddr:0x18242000,data_hdl:0x18242000
+[ADEC_S] [Func]:_init_datafifo [Line]:189 [Info]:_adec_datafifo_init_slave ok,datafifo_phyaddr:0x18243000,data_hdl:0x18243000
+enter 'q' key to exit
+[ADEC_S] [Func]:_datafifo_release_func [Line]:157 [Info]:_datafifo_release_func,adec_hdl:0
+q
+sample done
+```
diff --git a/zh/02_applications/tutorials/images/audio--i2s-decode-play.png b/zh/02_applications/tutorials/images/audio--i2s-decode-play.png
new file mode 100644
index 0000000..61df209
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio--i2s-decode-play.png differ
diff --git a/zh/02_applications/tutorials/images/audio-ai-aenc-adec-ao-loopback.png b/zh/02_applications/tutorials/images/audio-ai-aenc-adec-ao-loopback.png
new file mode 100644
index 0000000..0461534
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-ai-aenc-adec-ao-loopback.png differ
diff --git a/zh/02_applications/tutorials/images/audio-ai-ao-loopback.png b/zh/02_applications/tutorials/images/audio-ai-ao-loopback.png
new file mode 100644
index 0000000..0461534
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-ai-ao-loopback.png differ
diff --git a/zh/02_applications/tutorials/images/audio-board.png b/zh/02_applications/tutorials/images/audio-board.png
new file mode 100644
index 0000000..62be7e3
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-board.png differ
diff --git a/zh/02_applications/tutorials/images/audio-capture-i2s-encode-mapi.png b/zh/02_applications/tutorials/images/audio-capture-i2s-encode-mapi.png
new file mode 100644
index 0000000..010af0b
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-capture-i2s-encode-mapi.png differ
diff --git a/zh/02_applications/tutorials/images/audio-capture-i2s-encode.png b/zh/02_applications/tutorials/images/audio-capture-i2s-encode.png
new file mode 100644
index 0000000..f469fac
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-capture-i2s-encode.png differ
diff --git a/zh/02_applications/tutorials/images/audio-capture-i2s.png b/zh/02_applications/tutorials/images/audio-capture-i2s.png
new file mode 100644
index 0000000..166696d
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-capture-i2s.png differ
diff --git a/zh/02_applications/tutorials/images/audio-capture-pdm.png b/zh/02_applications/tutorials/images/audio-capture-pdm.png
new file mode 100644
index 0000000..4eebf17
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-capture-pdm.png differ
diff --git a/zh/02_applications/tutorials/images/audio-decode-i2s-play-mapi.png b/zh/02_applications/tutorials/images/audio-decode-i2s-play-mapi.png
new file mode 100644
index 0000000..f342ab1
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-decode-i2s-play-mapi.png differ
diff --git a/zh/02_applications/tutorials/images/audio-i2s-ai-ao-loopback.png b/zh/02_applications/tutorials/images/audio-i2s-ai-ao-loopback.png
new file mode 100644
index 0000000..b183fe1
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-i2s-ai-ao-loopback.png differ
diff --git a/zh/02_applications/tutorials/images/audio-loopback-mapi.png b/zh/02_applications/tutorials/images/audio-loopback-mapi.png
new file mode 100644
index 0000000..8f573bc
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-loopback-mapi.png differ
diff --git a/zh/02_applications/tutorials/images/audio-pdm-ai-ao-loopback.png b/zh/02_applications/tutorials/images/audio-pdm-ai-ao-loopback.png
new file mode 100644
index 0000000..261063c
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-pdm-ai-ao-loopback.png differ
diff --git a/zh/02_applications/tutorials/images/audio-play-i2s.png b/zh/02_applications/tutorials/images/audio-play-i2s.png
new file mode 100644
index 0000000..3fe9f29
Binary files /dev/null and b/zh/02_applications/tutorials/images/audio-play-i2s.png differ
diff --git a/zh/02_applications/tutorials/images/boot_logo.png b/zh/02_applications/tutorials/images/boot_logo.png
new file mode 100755
index 0000000..05f2716
Binary files /dev/null and b/zh/02_applications/tutorials/images/boot_logo.png differ
diff --git a/zh/02_applications/tutorials/images/camer_sensor_connect.png b/zh/02_applications/tutorials/images/camer_sensor_connect.png
new file mode 100755
index 0000000..3273784
Binary files /dev/null and b/zh/02_applications/tutorials/images/camer_sensor_connect.png differ
diff --git a/zh/02_applications/tutorials/images/camera_sensor_arch.png b/zh/02_applications/tutorials/images/camera_sensor_arch.png
new file mode 100755
index 0000000..309a1d6
Binary files /dev/null and b/zh/02_applications/tutorials/images/camera_sensor_arch.png differ
diff --git a/zh/02_applications/tutorials/images/canaan-cover.png b/zh/02_applications/tutorials/images/canaan-cover.png
new file mode 100755
index 0000000..0319765
Binary files /dev/null and b/zh/02_applications/tutorials/images/canaan-cover.png differ
diff --git a/zh/02_applications/tutorials/images/canaan-lable.png b/zh/02_applications/tutorials/images/canaan-lable.png
new file mode 100755
index 0000000..009a662
Binary files /dev/null and b/zh/02_applications/tutorials/images/canaan-lable.png differ
diff --git a/zh/02_applications/tutorials/images/gpu-1.jpg b/zh/02_applications/tutorials/images/gpu-1.jpg
new file mode 100755
index 0000000..859b8b7
Binary files /dev/null and b/zh/02_applications/tutorials/images/gpu-1.jpg differ
diff --git a/zh/02_applications/tutorials/images/gpu-2.jpg b/zh/02_applications/tutorials/images/gpu-2.jpg
new file mode 100755
index 0000000..4337387
Binary files /dev/null and b/zh/02_applications/tutorials/images/gpu-2.jpg differ
diff --git a/zh/02_applications/tutorials/images/gpu-3.jpg b/zh/02_applications/tutorials/images/gpu-3.jpg
new file mode 100755
index 0000000..dae2af1
Binary files /dev/null and b/zh/02_applications/tutorials/images/gpu-3.jpg differ
diff --git a/zh/02_applications/tutorials/images/logo.png b/zh/02_applications/tutorials/images/logo.png
new file mode 100755
index 0000000..aa48558
Binary files /dev/null and b/zh/02_applications/tutorials/images/logo.png differ
diff --git a/zh/02_applications/tutorials/images/lvgl_demo_widgets.png b/zh/02_applications/tutorials/images/lvgl_demo_widgets.png
new file mode 100644
index 0000000..06d3432
Binary files /dev/null and b/zh/02_applications/tutorials/images/lvgl_demo_widgets.png differ
diff --git a/zh/02_applications/tutorials/images/media_linux_menuconfig.png b/zh/02_applications/tutorials/images/media_linux_menuconfig.png
new file mode 100755
index 0000000..ec5656f
Binary files /dev/null and b/zh/02_applications/tutorials/images/media_linux_menuconfig.png differ
diff --git a/zh/02_applications/tutorials/images/mpp_structure.png b/zh/02_applications/tutorials/images/mpp_structure.png
new file mode 100755
index 0000000..14f1d3f
Binary files /dev/null and b/zh/02_applications/tutorials/images/mpp_structure.png differ
diff --git a/zh/02_applications/tutorials/images/udc_linux_menuconfig.png b/zh/02_applications/tutorials/images/udc_linux_menuconfig.png
new file mode 100755
index 0000000..3b6a422
Binary files /dev/null and b/zh/02_applications/tutorials/images/udc_linux_menuconfig.png differ
diff --git a/zh/02_applications/tutorials/images/usb_bulk.png b/zh/02_applications/tutorials/images/usb_bulk.png
new file mode 100755
index 0000000..20c2dc8
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_bulk.png differ
diff --git a/zh/02_applications/tutorials/images/usb_control.png b/zh/02_applications/tutorials/images/usb_control.png
new file mode 100755
index 0000000..0af7508
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_control.png differ
diff --git a/zh/02_applications/tutorials/images/usb_ethnet_pin.png b/zh/02_applications/tutorials/images/usb_ethnet_pin.png
new file mode 100755
index 0000000..0d3e16e
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_ethnet_pin.png differ
diff --git a/zh/02_applications/tutorials/images/usb_gadget.png b/zh/02_applications/tutorials/images/usb_gadget.png
new file mode 100755
index 0000000..797e00c
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_gadget.png differ
diff --git a/zh/02_applications/tutorials/images/usb_interrupt.png b/zh/02_applications/tutorials/images/usb_interrupt.png
new file mode 100755
index 0000000..cd4a084
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_interrupt.png differ
diff --git a/zh/02_applications/tutorials/images/usb_iso.png b/zh/02_applications/tutorials/images/usb_iso.png
new file mode 100755
index 0000000..b8fbf3d
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_iso.png differ
diff --git a/zh/02_applications/tutorials/images/usb_packet.png b/zh/02_applications/tutorials/images/usb_packet.png
new file mode 100755
index 0000000..e78721a
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_packet.png differ
diff --git a/zh/02_applications/tutorials/images/usb_phy.png b/zh/02_applications/tutorials/images/usb_phy.png
new file mode 100755
index 0000000..5309334
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_phy.png differ
diff --git a/zh/02_applications/tutorials/images/usb_transaction.png b/zh/02_applications/tutorials/images/usb_transaction.png
new file mode 100755
index 0000000..d3489f3
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_transaction.png differ
diff --git a/zh/02_applications/tutorials/images/usb_unit.png b/zh/02_applications/tutorials/images/usb_unit.png
new file mode 100755
index 0000000..5199f79
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_unit.png differ
diff --git a/zh/02_applications/tutorials/images/usb_uvc_layout.png b/zh/02_applications/tutorials/images/usb_uvc_layout.png
new file mode 100755
index 0000000..c65f298
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_uvc_layout.png differ
diff --git a/zh/02_applications/tutorials/images/usb_vs.png b/zh/02_applications/tutorials/images/usb_vs.png
new file mode 100755
index 0000000..7e0b672
Binary files /dev/null and b/zh/02_applications/tutorials/images/usb_vs.png differ
diff --git a/zh/02_applications/tutorials/images/uvc_app_flow.png b/zh/02_applications/tutorials/images/uvc_app_flow.png
new file mode 100755
index 0000000..e79c3e6
Binary files /dev/null and b/zh/02_applications/tutorials/images/uvc_app_flow.png differ
diff --git a/zh/02_applications/tutorials/images/uvc_framework.png b/zh/02_applications/tutorials/images/uvc_framework.png
new file mode 100755
index 0000000..857c532
Binary files /dev/null and b/zh/02_applications/tutorials/images/uvc_framework.png differ
diff --git a/zh/02_applications/tutorials/images/uvc_linux_menuconfig.png b/zh/02_applications/tutorials/images/uvc_linux_menuconfig.png
new file mode 100755
index 0000000..14ddc87
Binary files /dev/null and b/zh/02_applications/tutorials/images/uvc_linux_menuconfig.png differ
diff --git a/zh/02_applications/tutorials/images/uvc_payload.png b/zh/02_applications/tutorials/images/uvc_payload.png
new file mode 100755
index 0000000..088465d
Binary files /dev/null and b/zh/02_applications/tutorials/images/uvc_payload.png differ
diff --git a/zh/02_applications/tutorials/images/uvc_payload_header.png b/zh/02_applications/tutorials/images/uvc_payload_header.png
new file mode 100755
index 0000000..012d34e
Binary files /dev/null and b/zh/02_applications/tutorials/images/uvc_payload_header.png differ
diff --git a/zh/02_applications/tutorials/images/vlc.png b/zh/02_applications/tutorials/images/vlc.png
new file mode 100755
index 0000000..e554cd6
Binary files /dev/null and b/zh/02_applications/tutorials/images/vlc.png differ
diff --git "a/zh/03_other/K230_SDK_\347\211\210\346\234\254\350\257\264\346\230\216.md" "b/zh/03_other/K230_SDK_\347\211\210\346\234\254\350\257\264\346\230\216.md"
new file mode 100755
index 0000000..5f1d0b5
--- /dev/null
+++ "b/zh/03_other/K230_SDK_\347\211\210\346\234\254\350\257\264\346\230\216.md"
@@ -0,0 +1,222 @@
+# K230 SDK版本说明
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍了K230 SDK V0.8.0 版本发布相关的内容,包括当前版本支持的硬件、功能、使用限制等。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+|--------------------|--------------------------------------------------------|
+| K230 USIP LP3 EVB | USIP封装形式的K230芯片搭载LPDDR3的开发板 |
+| VENC | Video Encoder,视频编码模块 |
+| VDEC | Video Decoder,视频解码模块 |
+| VICAP | Video Input Capture,图像输入采集模块 |
+| VO | Video Output,视频输出模块 |
+| AI | Audio Input,音频输入模块 |
+| AO | Audio Output,音频输出模块 |
+| AENC | Audio Encoder,音频编码模块 |
+| ADEC | Audio Decoder,音频解码模块 |
+| NonAI-2D | 2D图形加速处理模块,支持OSD叠加,画框,CSC变换等功能。 |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+|------------|----------|------------|----------|
+| V1.0 | 初版 | SDK部 | 2023-7-4 |
+
+## 1. 版本信息
+
+| 所属产品 | 版本号 | 发布日期 |
+|----------|--------|----------|
+| K230 SDK | V0.8.0 | 2023-7-4 |
+
+## 2. 支持的硬件
+
+K230 USIP LP3 EVB:具体硬件信息参考《K230 EVB硬件使用文档》。
+
+## 3. 版本使用限制说明
+
+当前SDK的USIP LP3 EVB上内存布局如下图所示:
+
+![EVB](images/70c84709960aa37885bfaabcc29d0538.jpg)
+
+图-1 SDK内存布局
+
+可通过在k230_sdk目录下输入`make menuconfig` 选择`Memory->Configuration`来配置各模块的内存区间,暂不支持配置
+参数区和核间通讯区域的内存配置
+
+## 4. 版本功能统计
+
+### 4.1 多媒体
+
+| ID | 支持版本 | 功能概要 | 功能描述 | 备注 |
+|----|---------------|----------------------|--------------------------------------------------------------------------------------------|------|
+| 1 | K230 SDK V0.5 | venc | H264/H265/JPEG编码 | |
+| 2 | K230 SDK V0.5 | vdec | H264/H265/JPEG解码 | |
+| 3 | K230 SDK V0.5 | vicap bind venc | vicap输入绑定到venc输出 | |
+| 4 | K230 SDK V0.5 | vdec bind vo | vdec绑定到vo输出图像 | |
+| 5 | K230 SDK V0.5 | venc_2d | OSD叠加后编码 | |
+| 6 | K230 SDK V0.5 | nonai_2d | OSD叠加 | |
+| 7 | K230 SDK V0.5 | i2s 音频输入 | 采样精度(16/24/32),采样率(8k-192k),时间戳(us),双声道,每帧采样点可配。 | |
+| 8 | K230 SDK V0.5 | pdm 音频输入 | 采样精度(16/24),采样率(8k-192k),过采样(32/64/128),单双声道,时间戳(us),每帧采样点可配。 | |
+| 9 | K230 SDK V0.5 | i2s 音频输出 | 采样精度(16/24/32),采样率(8k-192k),双声道,每帧采样点可配。 | |
+| 10 | K230 SDK V0.5 | 内置audio codec | 支持adc、dac、采样精度(16/24),采样率(8k-192k) | |
+| 11 | K230 SDK V0.5 | ai(i2s) bind ao(i2s) | ai 绑定ao,i2s音频采集到i2s音频输出回环 | |
+| 12 | K230 SDK V0.5 | ai(pdm) bind ao(i2s) | ai 绑定ao,pdm音频采集到i2s音频输出回环 | |
+| 13 | K230 SDK V0.6 | venc | 多路编码,旋转和镜像 | |
+| 14 | K230 SDK V0.6 | venc_2d | 画框 | |
+| 15 | K230 SDK V0.6 | venc MAPI | VI-\>VENC-\>小核存文件 | |
+| 16 | K230 SDK V0.6 | aenc | 音频编码,内置g711a/u | |
+| 17 | K230 SDK V0.6 | adec | 音频解码,内置g711a/u | |
+| 18 | K230 SDK V0.6 | ai bind aenc | ai绑定aenc,采集编码后的数据 | |
+| 19 | K230 SDK V0.6 | adec bind ao | adec绑定ao,播放输出解码后的音频 | |
+| 20 | K230 SDK V0.6 | audio 3a | AEC(回声消除),ANS(噪声抑制),AGC(自动增益) | |
+| 21 | K230 SDK V0.7 | venc gop | 支持设置编码GOP | |
+| 22 | K230 SDK V0.7 | venc mirror | 支持设置编码水平、垂直翻转 | |
+| 23 | K230 SDK V0.7 | venc idr | 支持编码IDR帧enable/disable | |
+| 24 | K230 SDK V0.7 | venc multi channel | mapi_venc_2路 h264编码 | |
+| 25 | K230 SDK V0.7 | audio i2s mapi | mapi-audio_i2S采集音频编码后传递给大核 | |
+| 26 | K230 SDK V0.7 | audio enc mapi | mapi-audio_小核编码文件传给大核解码并播放 | |
+| 27 | K230 SDK V0.7 | audio volume | 增加内置audio codec 数字、模拟音量控制接口。 | |
+| 28 | K230 SDK V0.7 | mapi rtsp | mapi-网络传输-rtsp 音视频推流 | |
+| 29 | K230 SDK V0.8 | mapi vdec | 小核视频编码文件传给大核解码并播放 | |
+| 30 | K230 SDK V0.8 | venc mpi | deblock, sao, entropy: enable/disable | |
+| 31 | K230 SDK V0.8 | vdec mpi | 支持down scale | |
+| 32 | K230 SDK V0.8 | dpu demo | 屏显深度图:vicap->dma->dpu->vo | |
+| 32 | K230 SDK V0.8 | 语音对讲 demo | 增加语音对讲demo | |
+
+### 4.2 图像
+
+| ID | 支持版本 | 功能概要 | 功能描述 | 备注 |
+|----|---------------|---------------|---------------------------------------------------------------------------------------------------------------------------------------|------|
+| 1 | K230 SDK V0.5 | vicap | 支持sensor图像采集(OV9732、OV9286) | |
+| 2 | K230 SDK V0.5 | AE | 支持AE自动曝光 | |
+| 3 | K230 SDK V0.5 | vicap bind vo | vicap 绑定到 vo输出图像 | |
+| 4 | K230 SDK V0.5 | GPU绘图 | 矢量绘制填充(直线、二次贝塞尔曲线、三次贝塞尔曲线、椭圆曲线) 线性渐变 颜色查找表 图像合成/混合,BLIT | |
+| 5 | K230 SDK V0.5 | 图像调优 | tuning tool 通过网络、串口连接开发板进行图像调优。 black level correction lens shading correction color calibration AWB CAC gamma | |
+| 6 | K230 SDK V0.5 | display bind | 支持vo和vicap,vo 和 vdec 绑定 | |
+| 7 | K230 SDK V0.5 | display 显示 | 支持osd和yuv 显示 支持dump 帧功能 支持dsi 和 vo timing 可配 支持插帧功能 | |
+| 8 | K230 SDK V0.6 | 图像调优 | tuning tool可以配置sensor寄存器 | |
+| 9 | K230 SDK V0.6 | 时间戳、帧号 | 支持时间戳、帧号 | |
+| 10 | K230 SDK V0.6 | ISP+KPU Demo | 人脸检测联动demo | |
+| 11 | K230 SDK V0.7 | dewarp | 添加dewarp功能,可以实现畸变校正 | |
+| 12 | K230 SDK V0.7 | Face AE | 添加了FaceAE的功能及对应的FaceAE demo | |
+| 13 | K230 SDK V0.7 | 添加Imx335 | 添加Imx335 sensor驱动及demo | |
+| 14 | K230 SDK V0.8 | 添加DRM | Linux小核添加DRM驱动及demo | |
+| 15 | K230 SDK V0.8 | 添加LVGL | Linux小核添加LVGL及demo | |
+| 16 | K230 SDK V0.8 | 快启APP | 快启APP Sensor改为Imx335(带晶振) | |
+
+### 4.3 平台
+
+| ID | 支持版本 | 功能概要 | 功能描述 | 备注 |
+|----|---------------|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|
+| 1 | K230 SDK V0.5 | 启动外设 | 支持eMMC、1/4线SD card | |
+| 2 | K230 SDK V0.5 | 大核DPU驱动 | 图像输入、输出驱动开发;基本功能,eg读取参数、支持动态更新长周期参数、输出缓冲、时间戳、算法等;支持pipeline绑定 | |
+| 3 | K230 SDK V0.5 | 小核UBOOT | DDR训练、磁盘驱动(emmc、sd、spi 1线); 支持pufs和gzip解压缩 | |
+| 4 | K230 SDK V0.5 | 小核SPI驱动 | 1线 | |
+| 5 | K230 SDK V0.5 | 小核SDIO驱动 | 支持SDIO0/1挂接SDCard | |
+| 6 | K230 SDK V0.5 | 小核USB(UVC)驱动 | 支持UVC驱动(K230芯片做slave) | |
+| 7 | K230 SDK V0.5 | 小核GPIO驱动 | 支持每个IO单独作为逻辑资源分配;支持IO和中断 | |
+| 8 | K230 SDK V0.5 | 小核磁盘和文件系统 | 支持SDIO0/1挂接SDCard、支持SDIO0/1挂接eMMC;支持ext2/3/4, fat32文件系统 | |
+| 9 | K230 SDK V0.5 | I2C驱动 | 大小核I2C总线驱动 | |
+| 10 | K230 SDK V0.5 | uart驱动 | 大小核uart驱动 | |
+| 11 | K230 SDK V0.5 | UVC基础demo | uvc camera,将板子作为摄像头 | |
+| 12 | K230 SDK V0.5 | GSDMA(大核驱动) | 支持使用 gdma 进行图像搬移,通过配置通道属性来实现图像的旋转和镜像,搬运多种图像格式(例如YUV400,YUV420,YUV444),搬运多种像素位宽的图像(例如 8bit, 10bit,16bit); 支持使用 sdma 进行数据搬移,支持 1d 模式和 2d 模式的搬运。支持pipeline绑定。 | |
+| 13 | K230 SDK V0.6 | 大核GPIO驱动 | 支持独立配置和使用IO功能,独立配置和触发中断,加入了硬件互斥锁以保证寄存器访问的互斥。 | |
+| 14 | K230 SDK V0.6 | 启动外设 | 支持spi nor flash镜像生成和启动 | |
+| 15 | K230 SDK V0.6 | uboot SPI norflash驱动 | 支持8线 DMA | |
+| 16 | K230 SDK V0.6 | 大核 ADC 驱动 | 支持 ADC 读取电压值 | |
+| 17 | K230 SDK V0.7 | 大小核WDT驱动 | 支持watchdog复位soc | |
+| 18 | K230 SDK V0.7 | 大核SPI驱动 | 支持spi单线模式,支持nandflash | |
+| 19 | K230 SDK V0.7 | 小核SPI驱动 | 支持spi单线、八线模式,支持nordflash | |
+| 20 | K230 SDK V0.7 | 快起功能 | sdk默认快起,非快起版本可通过make menuconfig关闭CONFIG_QUICK_BOOT宏。快起版本uboot不会进命令行。 | |
+| 21 | K230 SDK V0.7 | 安全镜像 | sdk默认不产生安全镜像,可通过make menuconfig配置CONFIG_GEN_SECURITY_IMG产生安全镜像 | |
+| 22 | K230 SDK V0.7 | UVC基础demo | 增加支持H264格式,当前存在bug,只能运行一会儿时间 | |
+| 23 | K230 SDK V0.7 | DPU、GSDMA | buffer数量可配置 | |
+| 24 | K230 SDK V0.8 | 大核timer、rtc、pwm | 大核新增timer 驱动及demo;大核新增pwm驱动及demo;大核新增rtc驱动及demo。 | |
+| 25 | K230 SDK V0.8 | spi nand 支持 | 小核(uboot,linux)支持4线spi nand驱动, sdk支持从spinand启动; | |
+| 26 | K230 SDK V0.8 | UVC基础demo | UVC支持IMX335摄像头,UVC支持MJPEG格式 | |
+| 27 | K230 SDK V0.8 | spinor 增加人脸特性等参数分区 | spi nor 新增人脸特性、ai模型、标定参数、大核app、散斑、快起参数等参数分区;从spinor启动时uboot会解析并加载各个分区数据。 | |
+
+### 4.4 架构
+
+| ID | 支持版本 | 功能概要 | 功能描述 | 备注 |
+|----|---------------|----------------|-------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|
+| 1 | K230 SDK V0.5 | 多媒体内存管理 | 多媒体区域内存管理驱动、MPI、MAPI;视频缓存池驱动、MPI、MAPI | |
+| 2 | K230 SDK V0.5 | 日志管理 | 多媒体日志管理驱动、MPI、MAPI | |
+| 3 | K230 SDK V0.5 | 系统绑定 | 多媒体系统绑定驱动、MPI | |
+| 4 | K230 SDK V0.5 | 大核多媒体调试 | 提供proc文件系统用于调试 | |
+| 5 | K230 SDK V0.5 | 核间通讯 | 核间通讯驱动 | |
+| 6 | K230 SDK V0.5 | 核间控制通信 | IPCMSG库 | |
+| 7 | K230 SDK V0.5 | 核间数据通信 | DATAFIFO库 | |
+| 8 | K230 SDK V0.5 | 共享文件系统 | sharefs | 小核做server,大核做client |
+| 9 | K230 SDK V0.5 | 系统控制 | 大小核时钟电源与复位驱动 | |
+| 10 | K230 SDK V0.5 | KPU | KPU驱动 | |
+| 11 | K230 SDK V0.5 | 大核系统调试 | JTAG调试;本地串口;CPU占用率统计分析等 | |
+| 12 | K230 SDK V0.5 | 小核系统调试 | JTAG调试、串口调试、网口调试、CPU占用率统计分析、性能调试手段、调试及log输出端口(物理串口)、kernel及异常信息输出、转储、debug版本 | perf没有默认配置到内核和buildroot中 |
+| 13 | K230 SDK V0.7 | 软件SHA256 | 大核MPP下增加SHA256软件实现 | |
+| 14 | K230 SDK V0.7 | OTP读写功能 | 大核rt-smart中增加OTP读写功能,小核Linux中增加OTP读功能 | |
+| 15 | K230 SDK V0.7 | Tsensor读功能 | 大核rt-smart中增加Tsensor读功能,小核Linux中增加Tsensor读功能,用于读取芯片结温 | |
+| 16 | K230 SDK V0.7 | TRNG读功能 | 小核Linux中增加TRNG读功能 | |
+| 17 | K230 SDK V0.7 | 快起demo | 添加大核快速启动人脸检测demo | |
+| 18 | K230 SDK V0.7 | PMU功能 | 添加小核linux的PMU待机和唤醒功能 | |
+| 19 | K230 SDK V0.8 | 门锁POC | 大核添加POC门锁功能,小核添加UI功能,通过UI界面或SD卡注册人脸并完成识别 | |
+
+### 4.5 其它
+
+| ID | 支持版本 | 功能概要 | 功能描述 | 备注 |
+|----|---------------|----------------------|------------------------------------------------------------------|------|
+| 1 | K230 SDK V0.5 | ai demo | 提供三个ai demo 分别是door_lock、object_detect、image_classify; | |
+| 2 | K230 SDK V0.5 | AiW4211LV10 WiFi驱动 | 支持网络数据通信;支持控制指令发送; | |
+| 3 | K230 SDK V0.6 | AiW4211LV10 WiFi固件 | 固件兼容指令及网络配置,支持断网重连,支持k230电平监测及唤醒 | |
+| 4 | K230 SDK V0.6 | 触摸屏支持 | 触摸屏支持 | |
+| 5 | K230 SDK V0.7 | 软件镜像 | sdk编译会生成demo 可执行文件,但默认不打包到镜像;安全镜像文件默认不生成,可需手动配置 | |
+| 6 | K230 SDK V0.7 | 工具链 | 大核工具链版本更新为:riscv64-unknown-linux-musl-rv64imafdcv-lp64d-20230420.tar.bz2 | |
+| 7 | K230 SDK V0.8 | 软件镜像 | Emmc/Sdcard镜像打包时,会将大核的demo打包到小核/sharefs | |
+| 8 | K230 SDK V0.8 | Demo | 为了适配不同的camera模组而修改相关的demo,比如编码/UVC,demo具体使用可查看《K230 SDK Demo使用指南》 | |
+
+## 5. 版本的遗留问题及限制说明
+
+| ID | 功能模块 | 问题/限制描述 | 备注 |
+|----|---------------|---------------------------------------------------------------------------------------|------|
+| 1 | VPU编码 | VPU重复编码多次,有概率性卡住 | |
+| 2 | VO | VO显示动态画面时,中间会有一条折线 | |
+| 3 | VO | 重复启动摄像头,有概率vo仅背光亮,没有画面 | |
+| 4 | 推流 | rtsp推流不稳定 | |
+| 5 | usb | 通过usb传输h264编码长时间运行会异常 | |
+| 5 | 大核SPI | 有些主板nandflash 擦除卡住 | |
diff --git a/zh/03_other/images/5405a8e58a3314ae95f2d737dd0c01d9.png b/zh/03_other/images/5405a8e58a3314ae95f2d737dd0c01d9.png
new file mode 100644
index 0000000..3a98d83
Binary files /dev/null and b/zh/03_other/images/5405a8e58a3314ae95f2d737dd0c01d9.png differ
diff --git a/zh/03_other/images/70c84709960aa37885bfaabcc29d0538.jpg b/zh/03_other/images/70c84709960aa37885bfaabcc29d0538.jpg
new file mode 100644
index 0000000..51635ea
Binary files /dev/null and b/zh/03_other/images/70c84709960aa37885bfaabcc29d0538.jpg differ
diff --git a/zh/03_other/images/canaan-cover.png b/zh/03_other/images/canaan-cover.png
new file mode 100644
index 0000000..0319765
Binary files /dev/null and b/zh/03_other/images/canaan-cover.png differ
diff --git a/zh/03_other/images/k230_unsip_board.png b/zh/03_other/images/k230_unsip_board.png
new file mode 100755
index 0000000..9708b8b
Binary files /dev/null and b/zh/03_other/images/k230_unsip_board.png differ
diff --git a/zh/03_other/images/logo.png b/zh/03_other/images/logo.png
new file mode 100644
index 0000000..aa48558
Binary files /dev/null and b/zh/03_other/images/logo.png differ
diff --git "a/zh/03_other/\345\205\215\350\264\243\345\243\260\346\230\216_\345\214\227\344\272\254\345\230\211\346\245\240\346\215\267\346\200\235\344\277\241\346\201\257\346\212\200\346\234\257\346\234\211\351\231\220\345\205\254\345\217\270.txt" "b/zh/03_other/\345\205\215\350\264\243\345\243\260\346\230\216_\345\214\227\344\272\254\345\230\211\346\245\240\346\215\267\346\200\235\344\277\241\346\201\257\346\212\200\346\234\257\346\234\211\351\231\220\345\205\254\345\217\270.txt"
new file mode 100644
index 0000000..28fdbd3
--- /dev/null
+++ "b/zh/03_other/\345\205\215\350\264\243\345\243\260\346\230\216_\345\214\227\344\272\254\345\230\211\346\245\240\346\215\267\346\200\235\344\277\241\346\201\257\346\212\200\346\234\257\346\234\211\351\231\220\345\205\254\345\217\270.txt"
@@ -0,0 +1,8 @@
+免责声明
+
+ 嘉楠提醒您,本文档所提供的交付件仅供客户开发参考。在使用本文件夹所提供的交付件前,请您务必仔细阅读并透彻理解本声明。您可以选择不使用本文件夹中的交付件,但如果您使用,您的使用行为将被视为对本声明全部内容的认可。
+ 本文档所提供的交付件仍然是“按现状”提供,不附有任何种类的陈述与保证,在法律许可的最大范围内,嘉楠声明免除所有默示的陈述与保证,包括但不限于默示的有关适销、非侵权和适用于某种特定用途的陈述与保证。本清单中所提供的数据在不同的测试环境下可能存在一定的偏差,因使用本清单中所提供的数据而导致的所有设计、开发错误,或其他一切因使用本目录中所提供的数据而可能遭致的意外、疏忽、侵权及其造成的损失(包括但不限于直接的、间接的、后果性的或附带性的损失),其后果由您自行承担,嘉楠对其概不负责,亦不承担任何法律责任。
+
+
+ 声明单位:北京嘉楠捷思信息技术有限公司
+ 日 期:2023-5-31
diff --git "a/zh/template/K230_XX\344\275\277\347\224\250\346\214\207\345\215\227_\346\250\241\346\235\277.md" "b/zh/template/K230_XX\344\275\277\347\224\250\346\214\207\345\215\227_\346\250\241\346\235\277.md"
new file mode 100644
index 0000000..af1691e
--- /dev/null
+++ "b/zh/template/K230_XX\344\275\277\347\224\250\346\214\207\345\215\227_\346\250\241\346\235\277.md"
@@ -0,0 +1,234 @@
+# K230 xx使用指南
+
+![cover](images/canaan-cover.png)
+
+版权所有©2023北京嘉楠捷思信息技术有限公司
+
+
+
+## 免责声明
+
+您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。
+
+由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
+
+## 商标声明
+
+![logo](images/logo.png)、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
+
+**版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。**
+非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
+
+
+
+## 目录
+
+[TOC]
+
+## 前言
+
+### 概述
+
+本文档主要介绍xxx。
+
+### 读者对象
+
+本文档(本指南)主要适用于以下人员:
+
+- 技术支持工程师
+- 软件开发工程师
+
+### 缩略词定义
+
+| 简称 | 说明 |
+| ---- | ---- |
+| XXX | xx |
+| XXX | xx |
+
+### 修订记录
+
+| 文档版本号 | 修改说明 | 修改者 | 日期 |
+| ---------- | -------- | ---------- | ---------- |
+| V1.0 | 初版 | 系统软件部 | 2023-03-10 |
+| V1.1 | | | |
+| V1.2 | | | |
+
+## 1. 概述
+
+此文档介绍xxx等。
+
+## 2.xx模块介绍
+
+### 2.1 xx模块
+
+#### 2.1.1 xx模块简介
+
+xxx
+
+#### 2.1.2 Feature说明
+
+xx 包含了。
+
+#### 2.1.3 依赖资源
+
+需要屏幕
+
+## 3. Markdown语法参考(完成文档时删除)
+
+### 插入图片
+
+语法
+![图片描述](图片相对路径)
+
+Example:
+![描述](./Images/图片11.png)
+
+### 插入表格
+
+| Column1 |Column2 | Column3 |
+| - |- |- |
+| Cell1 | Cell2 | Cell3 |
+| Cell4 | Cell5 | Cell6 |
+| Cell7 | Cell8 | Cell9 |
+
+### 斜体&加粗
+
+*斜体* **加粗**
+
+### 插入网页链接
+
+[链接文字](https://www.zhihu.com/question/20409634/answer/90728572)
+
+### 图片链接
+
+[文字描述](图片链接地址)
+
+### 引用文字
+
+>这里是引用文字
+
+### 插入代码
+
+语法:
+
+```语言
+ Code
+ Code
+```
+
+Example:
+
+```Python
+ #!/usr/bin/env python3
+ print("Hello, World!")
+```
+
+### 分割线
+
+---
+
+### 有序列表
+
+1. 条目1
+ (1) 条目1
+ (2) 条目2
+ (3) 条目3
+1. 条目2
+1. 条目3
+
+### 无序列表
+
+- 条目1
+- 条目2
+
+### 显示符号本身
+
+\+
+\-
+\*
+\!
+\!
+
+### 注意/提示
+
+**注意/提示:**
+>注意内容
+
+### API描述
+
+#### kd_xxx_func
+
+【描述】
+
+示例API
+
+【语法】
+
+```c
+k_s32 kd_xxx_func(k_s32 a)
+```
+
+【参数】
+
+| 参数名称 | 描述 | 输入/输出 |
+|-----------------|-------------------------------|-----------|
+| a | 示例参数 | 输入 |
+
+【返回值】
+
+| 返回值 | 描述 |
+|---------|---------------------------------|
+| 0 | 成功。 |
+| 非 0 | 失败,其值为\[错误码\] |
+
+【芯片差异】
+
+无
+
+【需求】
+
+- 头文件:k_xxx.h
+- 库文件:libxxx.a
+
+【注意】
+无
+
+【举例】
+
+无
+
+【相关主题】
+
+无
+
+## 数据结构描述
+
+### k_xxx_type
+
+【说明】
+
+示例数据结结构
+
+【定义】
+
+```c
+typedef struct
+{
+ int a;
+} k_xxx_type
+```
+
+【注意事项】
+
+无
+
+【相关数据类型及接口】
+
+无
+
+## 调试及打印信息
+
+``` shell
+haohaibo@develop:/proc$ cat /proc/version
+Linux version 5.4.0-139-generic (buildd@lcy02-amd64-112) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #156-Ubuntu SMP Fri Jan 20 17:27:18 UTC 2023
+```
diff --git a/zh/template/images/canaan-cover.png b/zh/template/images/canaan-cover.png
new file mode 100644
index 0000000..0319765
Binary files /dev/null and b/zh/template/images/canaan-cover.png differ
diff --git a/zh/template/images/canaan-lable.png b/zh/template/images/canaan-lable.png
new file mode 100644
index 0000000..009a662
Binary files /dev/null and b/zh/template/images/canaan-lable.png differ
diff --git a/zh/template/images/logo.png b/zh/template/images/logo.png
new file mode 100755
index 0000000..aa48558
Binary files /dev/null and b/zh/template/images/logo.png differ