uusky

uusky

0个粉丝

1

问答

0

专栏

0

资料

uusky  发布于  2018-09-18 20:18:08
采纳率 0%
1个问答
11525

关于视频缓冲池

 
刚接触海思的平台,真心想说,内心是一万个***在奔腾。
VB 这个鬼玩意,到处出现,文档也不说清楚。
就问一个:公共视频缓冲池和视频缓冲池是啥关系?还有什么模块公共缓冲池,又是TMD什么鬼?分配了,是谁在用?如果程序自己用,分配接口呢? 就靠一个 HI_MPI_VB_GetBlock 怎么解决四种缓冲池?
[code]    typedef enum hiVB_SOURCE_E
    {
            VB_SOURCE_COMMON  = 0, // 公共 VB
            VB_SOURCE_MODULE  = 1, // 模块 VB
            VB_SOURCE_PRIVATE = 2, // 私有 VB
            VB_SOURCE_USER    = 3, // 用户 VB
            VB_SOURCE_BUTT
    } VB_SOURCE_E;[/code]

MMZ 又是干什么用的?

给出sample里面的代码,简直就是 show 出 SDK 开发人员下限。具体就不贴代码了。看 linux 和 android 看习惯了之后,看这个 SDK 代码,真的无力再吐了……

我来回答
回答32个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 09:54:38
认可2
本帖最后由 zhuangweiye 于 2018-9-19 09:56 编辑

海思文档写的还算清楚

先来看看VB, 看中文文档可能是找不到定义, 但是如果看看英文文档, 如下


比较清楚了VB就是video buffer, 对应中文版, 视频缓存池就是VB pool, VB一般来说是指视频缓存池中的缓存块

再来看视频缓存池和公共视频缓存池, 文档是这么说的


从文档上看视频缓存池的定义是很明确的即"一组大小相同、物理地址连续的缓存块"
要注意的点是大小相同和物理地址连续, 也就是说一个视频缓存池中的缓存块(也可以简称为VB)是一样大的, 而且物理地址是连续的, 这个非常重要, 因为VB的使用者主要是海思的硬件模块,比如vi/vpss/venc等等, 需要连续的物理地址, 有点类似早期的linux为硬件DMA分配内存也要求物理地址连续

公共视频缓存池好像没有象视频缓存池那么明确的定义, 但是从图中最后一段的文字和接下去的图可以知道以下几点:
1. 公共视频缓存池是在系统初始化中分配的, 如果看过被楼主鄙视的sample, 可以知道相关函数是HI_MPI_VB_SetConf()和HI_MPI_VB_Init()
2. 公共视频缓存池中的VB的使用者, 是VI/VPSS/VENC/VDA/VO, 而且以VI为主要的使用者, 也就是说公共视频缓存池一般主要针对VI的需求,同时兼顾其他模块的需求,比如说公共视频缓存池中的VB的大小和个数.
因此, 可以这样理解公共视频缓存池, 首先他是视频缓存池, 然后是主要用于VI同时兼顾其他模块,为系统提供图像数据源

然后来看看楼主说的模块公共缓冲池, 这里先说明一下,可能我理解的和楼主说的不是一个东西.
既然是"模块"的那么就要说是哪个模块了, 在海思里好像只有VENC和VDEC有模块视频缓存池
先看VENC, 主要是PrivateVB 池和UserVB 池, 主要用于存放编码器的参考帧和工作帧
PrivateVB 池 (只要驱动加载时用默认参数即可),分配的VB pool只能对应的编码通道用. 这种方法有一个缺点,即每路编码器都有一个工作帧VB, 是没有必要的, 因此就有了 UserVB 池, 原理上就是为所有的编码通道分配一个VB pool, 可以减少一些工作帧VB, 但是能得到好处的前提是这些编码器要一样大

再看VDEC, 主要是PrivateVB 池, ModuleVB 池和UserVB 池
其中PrivateVB 池和UserVB 池比较类似编码器的情况, 而ModuleVB 池有点类似UserVB 池,
ModuleVB 池用HI_MPI_VB_SetModPoolConf() 加HI_MPI_VB_InitModCommPool()来初始化
UserVB 池用HI_MPI_VB_CreatePool()来初始化 HI_MPI_VDEC_AttachVbPool()来绑定

MMZ是什么?
MMZ 是 media memory zone 的简写, 是海思模块使用的内存(比如说公共视频缓存池, 海思模块的工作内存等等), 也就是说一个用海思芯片的嵌入式系统,内存至少要分两块, 一块给linux用,另外一块给海思各个模块用(简称MMZ), 一个重要的原因是海思模块要用到物理地址连续的内存, 这对于linux来说比较不舒服.

HI_MPI_VB_GetBlock()
这个是linux用户态下获取VB, 一般来说这个是高级用法, 可能楼主暂时还用不到

最后来说说sample的代码, 可能不入楼主的法眼, 但至少还是看得下去的.
www
www   回复   zhuangweiye  2021-11-02 14:25:15
0

海思SDK为啥要设计MMZ,linux kernel 不是提供cma 分配连续内存吗?

uusky

0个粉丝

1

问答

0

专栏

0

资料

uusky 2018-09-19 10:49:02
认可0
感谢回答!zhuangweiye 兄,码了这么多字还挺感谢的。说实话,我们老板让我们学习3559平台,说是后面可能有用。我看了两天,觉得这玩意学习成本不是一般的高!我不知道zhuangweiye是不是海斯的工程师,还是跟海斯有工作交集。我声明真心得不是反对谁,我也算是干 Linux BSP 工作十多年了,也给 Linux 社区提交补丁,对代码有着比较执着的洁癖。看到这样的 SDK,内心是十分抵制的。希望,你们能反馈给海斯的 SDK 工程师,倒不是一定要开源,最起码让用户看文档能很快上手,搞越多的概念,定义越多的类型,用户就得花越多的时间。而且我拿到资料中,就没有英文文档,而且都没有听说过 VI service. 我能理解你说的多媒体模块需要连续的内存,但是搞出那么多的接口出来,真的很难搞明白。

如果 zhuangweiye 兄,有时间,我还想问具体一点:
1. 针对下面这一组:
[code]     #define VB_MAX_COMM_POOLS        16
     typedef struct hiVB_CONFIG_S
     {
             HI_U32 u32MaxPoolCnt;    /* max count of pools, (0,VB_MAX_POOLS] */
             struct hiVB_CPOOL_S
             {
                     HI_U64  u64BlkSize;
                     HI_U32  u32BlkCnt;
                     HI_CHAR acMmzName[MAX_MMZ_NAME_LEN];
             } astCommPool[VB_MAX_COMM_POOLS]; /* 公共缓冲池属性结构体 */
     } VB_CONFIG_S;

     HI_S32 HI_MPI_VB_SetConfig(const VB_CONFIG_S *pstVbConfig);
     HI_S32 HI_MPI_VB_SetConfig(const VB_CONFIG_S *pstVbConfig);

     HI_S32 HI_MPI_VB_Init(HI_VOID);
     HI_S32 HI_MPI_VB_Exit(HI_VOID);[/code]
这个分配出来的缓冲池,给谁用?是否是指程序只需执行配置,然后各个多媒体组件的 service 会从这个之中拿内存?那么问题,
[code]        u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_10, COMPRESS_MODE_NONE, DEFAULT_ALIGN);
        stVbConf.astCommPool[0].u64BlkSize  = u32BlkSize;
        stVbConf.astCommPool[0].u32BlkCnt   = 10;

        u32BlkSize = VI_GetRawBufferSize(stSize.u32Width, stSize.u32Height, PIXEL_FORMAT_RGB_BAYER_16BPP, COMPRESS_MODE_NONE, 32);
        stVbConf.astCommPool[1].u64BlkSize  = u32BlkSize;
        stVbConf.astCommPool[1].u32BlkCnt   = 4;

        s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);[/code]
我怎么确定系统知道我第一个是 COMMON 的,第二个是 VI的?我若顺序反着来,行不行?这个内存缓冲池是否跟用户程序没有啥关系。API 中说是可以指定 DDR Name,内心真的很抵触。DDR 还有Name,那么有几个 name,换个缓冲池name还能接受一些。实际上,都是指定为 NULL,也不知道万一,我指定会有啥效果。

2. 如果有上面那个,下面这个设计又是怎么用?
[code]     #define VB_MAX_MOD_COMM_POOLS        16

     typedef enum hiVB_UID_E
     {
             VB_UID_VI        = 0,
             VB_UID_VO        = 1,
             VB_UID_VGS       = 2,
             VB_UID_VENC      = 3,
             VB_UID_VDEC      = 4,
             VB_UID_H265E     = 5,
             VB_UID_H264E     = 6,
             VB_UID_JPEGE     = 7,
             VB_UID_H264D     = 8,
             VB_UID_JPEGD     = 9,
             VB_UID_VPSS      = 10,
             VB_UID_DIS       = 11,
             VB_UID_USER      = 12,
             VB_UID_PCIV      = 13,
             VB_UID_AI        = 14,
             VB_UID_AENC      = 15,
             VB_UID_RC        = 16,
             VB_UID_VFMW      = 17,
             VB_UID_GDC       = 18,
             VB_UID_AVS       = 19,
             VB_UID_DPU_RECT  = 20,
             VB_UID_DPU_MATCH = 21,
             VB_UID_BUTT      = 22,
     } VB_UID_E;

     #define VB_MAX_COMM_POOLS        16
     typedef struct hiVB_CONFIG_S
     {
             HI_U32 u32MaxPoolCnt;    /* max count of pools, (0,VB_MAX_POOLS] */
             struct hiVB_CPOOL_S
             {
                     HI_U64  u64BlkSize;
                     HI_U32  u32BlkCnt;
                     HI_CHAR acMmzName[MAX_MMZ_NAME_LEN];
             } astCommPool[VB_MAX_COMM_POOLS]; /* 公共缓冲池属性结构体 */
     } VB_CONFIG_S;

     HI_S32 HI_MPI_VB_SetModPoolConfig(VB_UID_E enVbUid, const VB_CONFIG_S *pstVbConfig);
     HI_S32 HI_MPI_VB_GetModPoolConfig(VB_UID_E enVbUid, VB_CONFIG_S *pstVbConfig);

     HI_S32 HI_MPI_VB_InitModCommPool(VB_UID_E enVbUid);
     HI_S32 HI_MPI_VB_ExitModCommPool(VB_UID_E enVbUid);[/code]
似乎按照文档,代码说明只给 VENC, VDEC 用。但是它提供了很多个模块阿?我设置其他模块,又会又什么不一样的?我就不知道这套 API 设计跟前面那套又有什么区别?有什么好处,或者尽量用哪个?

3. 稍微能懂的就是这组了:
[code]     1. HI_MPI_VB_CreatePool and HI_MPI_VB_DestroyPool
     2. HI_MPI_VB_MmapPool and HI_MPI_VB_MunmapPool and HI_MPI_VB_GetBlockVirAddr
     4. HI_MPI_VB_Handle2PhysAddr
     5. HI_MPI_VB_Handle2PoolId[/code]
先码到这里吧!还是希望国产芯片,能够Open一些,开个社区,让别人有机会提供更高质量的代码……

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 11:33:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=106985&ptid=52277]uusky 发表于 2018-9-19 10:49[/url]
感谢回答!zhuangweiye 兄,码了这么多字还挺感谢的。说实话,我们老板让我们学习3559平台,说是后面可能有 ...[/quote]

一个一个回答

基本概念:
一般来说视频缓存池只要初始化(或者加上一个attach)就好了, 海思模块会自己去申请和释放VB, 不需要人工干预

第一个问题:
上面的贴子说的很清楚了, 主要给VI用兼顾VPSS/VENC/VDA, 这是海思初始化必须要做的事情

第一个问题的续
代码的意思是开了两个vb pool, 第一个是10个大小为XXX(具体多少不知道),第二个是4个大小为XXX的
COMMON_GetPicBufferSize和VI_GetRawBufferSize,只是计算vb大小的函数或者宏,没人规定用在哪里

这里要讲一下海思模块使用VB的原则,简单说就是选择满足要求的最小的VB
举例:初始化开了两个vb pool一个是10个100k的,一个是10个200k,当海思模块要用一个90k的VB时,会优先从100k的那个vb pool中去申请,有就用,没有就去200k那个vb pool中申请,再没有就会报vb fail的错误

关于DDR 的name,不用抵触,有用的东西,只是楼主还没有到那个阶段,MMZ是可以分段的,即一块内存可分成几段,每段分别起个名字
举个3520D的例子,在加载驱动的脚本中会有下面的命令
    insmod mmz.ko mmz=anonymous,0,0x84000000,186M:jpeg,0,0x8fa00000,5M anony=1 || report_error

表示MMZ分了两块,一块名字叫anonymous(也就是程序中默认的那块)起始物理地址为0x84000000,长度为186M, 一块叫jpeg起始地址0x8fa00000,长度5M

好处简单说就是可以自己控制一些模块放在一些特定的位置上

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 11:40:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=106985&ptid=52277]uusky 发表于 2018-9-19 10:49[/url]
感谢回答!zhuangweiye 兄,码了这么多字还挺感谢的。说实话,我们老板让我们学习3559平台,说是后面可能有 ...[/quote]

第二个问题
楼主可以用其他参数试一下那几个函数,估计是会返回0xaxxx8003,即参数非法(我没试过)

函数接口写在那里,并不是所有的的枚举都是可以用的,不然每个接口的参数都要写自己特定的枚举,另外考虑到升级,现在不支持,说不定以后就支持了呢,所以我认为这个不是问题

关于用哪个函数的问题,建议还是看sample,跑sample,改sample的三部曲,实践出真知

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 11:52:17
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=106985&ptid=52277]uusky 发表于 2018-9-19 10:49[/url]
感谢回答!zhuangweiye 兄,码了这么多字还挺感谢的。说实话,我们老板让我们学习3559平台,说是后面可能有 ...[/quote]

关于open和社区的问题

楼主可能是个高手,有这方面的需求,对于大多数海思开发人员来说,做的事情只是用好这些API来开发产品而已

从另一个角度来看,楼主希望open的东西是和硬件强相关的东西(海思没有open只是驱动及相关的东西),这部分对于任何一个硬件厂商来说并不是人人都愿意的,楼主熟悉android应该理解吧,不然google也不会搞一套被骂得东西了

uusky

0个粉丝

1

问答

0

专栏

0

资料

uusky 2018-09-19 11:52:35
认可0
1. 我的问题不是 COMMON_GetPicBufferSize和VI_GetRawBufferSize 怎么算大小的,而是
[code]     typedef struct hiVB_CONFIG_S
     {
             HI_U32 u32MaxPoolCnt;    /* max count of pools, (0,VB_MAX_POOLS] */
             struct hiVB_CPOOL_S
             {
                     HI_U64  u64BlkSize;
                     HI_U32  u32BlkCnt;
                     HI_CHAR acMmzName[MAX_MMZ_NAME_LEN];
             } astCommPool[VB_MAX_COMM_POOLS]; /* 公共缓冲池属性结构体 */
     } VB_CONFIG_S;[/code]
中astCommPool 是一个数组,数组每个成员都是一个缓冲池,我把 COMMON_GetPicBufferSize和VI_GetRawBufferSize 调用顺序对调一下,会不会有影响?我多初始化几个成员,或者少几个成员有没有关系?
或者这样问,其实,大部分情况下,camera 模组确定了,每一帧的画面大小基本就确定了,我们自己算:
[code]        stVbConf.astCommPool[0].u64BlkSize  = 等于或者略大于camera 每一帧画面size;
        stVbConf.astCommPool[0].u32BlkCnt   = 10;
        s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);[/code]
只初始化一个成员,即缓冲池也可以?

2. 关于DDR Name,我不是反对起名字,我是反对起这样的名字,通常,DDR是指内存,DDR Name? 不太合适吧?起码叫内存块名,或者其他的名字。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 11:59:24
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=106991&ptid=52277]uusky 发表于 2018-9-19 11:52[/url]
1. 我的问题不是 COMMON_GetPicBufferSize和VI_GetRawBufferSize 怎么算大小的,而是

中astCommPool 是 ...[/quote]

1。这个楼主想开几个就开几个,不要超过最大就可以,不开也可以(比如纯NVR的情况)

2。海思的MMZ是和实际的物理内存(DDR)一一对应的,而内存可以是物理内存,也可以是虚拟内存,感觉有歧义

uusky

0个粉丝

1

问答

0

专栏

0

资料

uusky 2018-09-19 12:53:44
认可0
[quote]第二个问题
楼主可以用其他参数试一下那几个函数,估计是会返回0xaxxx8003,即参数非法(我没试过)

函数接口写在那里,并不是所有的的枚举都是可以用的,不然每个接口的参数都要写自己特定的枚举,另外考虑到升级,现在不支持,说不定以后就支持了呢,所以我认为这个不是问题[/quote]
这个纯粹添加用户的烦恼,如果后续添加了,那么前面 API 是否也得变,这个纯粹丑陋的设计,名字定义不好,就会让人有恶心的感觉。而且如果sample本应充当 API example用的,感觉这么sample意思,就是要把芯片应用范围限在这个里面。你想突破这个应用范围,代价非常大。

[quote]从另一个角度来看,楼主希望open的东西是和硬件强相关的东西(海思没有open只是驱动及相关的东西),这部分对于任何一个硬件厂商来说并不是人人都愿意的,楼主熟悉android应该理解吧,不然google也不会搞一套被骂得东西了[/quote]
我说的不是open这些硬件强相关的,SDK设计人员根本不知道用户怎么看待(骂)这些API或者sample,又如何得知怎么改进呢?光开个论坛不是不够的。我举个简单的例子:
[code]#define SAMPLE_MEM_DEV_OPEN if (s_s32SampleMemDev <= 0)\
{\
    s_s32SampleMemDev = open("/dev/mem", O_RDWR|O_SYNC);\
    if (s_s32SampleMemDev < 0)\
    {\
        perror("Open dev/mem error");\
        return NULL;\
    }\
}\


HI_VOID * SAMPLE_SYS_IOMmap(HI_U64 u64PhyAddr, HI_U32 u32Size)
{
    HI_U32 u32Diff;
    HI_U64 u64PagePhy;
    HI_U8 * pPageAddr;
    HI_UL    ulPageSize;

    SAMPLE_MEM_DEV_OPEN;
[/code]
我工作尽十五年了,还真是第一次看到这样的写法!!难道这就是 SDK 工程师的才华???没错,可以工作。随便写,都可以工作。这样的代码,我也不列举了,真是一遍看,一遍骂娘。这些代码,就感觉是刚毕业的大学生写的一样。这样,没有社区维护这个,不知道迭代多少版本,才能更新?

[quote]2。海思的MMZ是和实际的物理内存(DDR)一一对应的,而内存可以是物理内存,也可以是虚拟内存,感觉有歧义[/quote],我觉得这完全是强辩护。那我换个说法,memory block name,怎么样?DDR本身是硬件,再加上个name,我不知道别人怎么看,反正我就是觉得有点恶心。

uusky

0个粉丝

1

问答

0

专栏

0

资料

uusky 2018-09-19 13:04:48
认可0
本帖最后由 uusky 于 2018-9-19 13:08 编辑

[quote]海思的MMZ是和实际的物理内存(DDR)一一对应的[/quote]
这句话,就有点不理解。怎么能说一一对应的?有多少MMZ,就有多少个 DDR?
MMZ 只是用了一些 CMA 的方法预留了整个系统内存中的一块,方便用户分配一些大的而连续的内存。说是因为跟 DDR 一一对应,所以叫 DDR name。真是有点不能接受。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 13:05:04
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=106996&ptid=52277]uusky 发表于 2018-9-19 12:53[/url]
这个纯粹添加用户的烦恼,如果后续添加了,那么前面 API 是否也得变,这个纯粹丑陋的设计,名字定义不好 ...[/quote]

好吧,您说什么就是什么了

如果您觉得人家写的都是垃圾,不看就好了。

如果您认为是“强辩护”就是“强辩护”吧,俗话说“道不同不相为谋”

uusky

0个粉丝

1

问答

0

专栏

0

资料

uusky 2018-09-19 13:16:28
认可0
zhuangweiye,也不是硬是要跟你较劲。如果你是真正喜爱这个 SDK,就应该让它变得更好,而不是认为它已经是最好的了,应该思考一下用户的理解和感受,难道一片掌声,就是好事?

SAMPLE_MEM_DEV_OPEN 宏定义,起码加个 do xxx while(0) 吧?你觉得呢?内核,以及相当一部分开源代码,都是这样写的。为啥别人要加 do while(0),难道没有道理吗?

stoneLinux

0个粉丝

3

问答

0

专栏

0

资料

stoneLinux 2018-09-19 13:20:16
认可0
楼主,牛B啊。
等你看完sample之后你搞个sample给大伙学习一下。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 13:30:36
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=107001&ptid=52277]uusky 发表于 2018-9-19 13:16[/url]
zhuangweiye,也不是硬是要跟你较劲。如果你是真正喜爱这个 SDK,就应该让它变得更好,而不是认为它已经是 ...[/quote]

我不是海思的工程师,只是义务为大家解答一些力所能及的问题,对于海思SDK的理解仅限于有什么用什么的阶段

对于您说的开源啦,open啦没有那个能力也没有那个兴趣,我的层次还太低,没有楼主那么高大上

但我觉得如果楼主要想玩海思,多读几遍文档可能比写do while更有用些

uusky

0个粉丝

1

问答

0

专栏

0

资料

uusky 2018-09-19 13:35:45
认可0
不是牛不牛的问题好吧。唉。我有代码洁癖,看到质量不高的代码,就感觉要折寿。

本来我不想来这里,真是不爽到极致了,特地来注册吐槽一把。工作这么多年,我自己也写一些东西,写SDK或者库代码时,有相当一部分时间,在思考变量名,函数名之类的。就算反复琢磨,反复改进之后,还是很希望别人给写的东西,提提意见,哪个概念,哪个变量名,或者接口名导致到用户理解困难,也会解释设计的意图跟我同事们一起讨论讨论。我觉得这才是真正的热爱……要不然我也不会工作这么多年,还是强留在一线……o(∩∩)o...哈哈

有同事说我的代码是自注释的。我会很开心,我知道因为那是我追求的境界。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-09-19 13:42:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=107006&ptid=52277]uusky 发表于 2018-9-19 13:35[/url]
不是牛不牛的问题好吧。唉。我有代码洁癖,看到质量不高的代码,就感觉要折寿。

本来我不想来这里,真是 ...[/quote]

如果要不爽,可以去海思网站上去,这里只是一些没有海思支持的小玩家互相取暖的地方

都说了您是高大上了,考虑的问题都是阳春白雪的东西,我们还在考虑温饱的问题,不过话说回来了,吃不饱肚子就是搞阳春白雪也搞不像,您说是吧

stoneLinux

0个粉丝

3

问答

0

专栏

0

资料

stoneLinux 2018-09-19 14:44:07
认可0
深有同感——“如果要不爽,可以去海思网站上去,这里只是一些没有海思支持的小玩家互相取暖的地方”

yanghongtian

0个粉丝

0

问答

0

专栏

0

资料

yanghongtian 2019-09-19 20:24:55
认可0
讲道理,海思的SDK代码是观感真的差,整个github都没有人这么写代码的

goohoo

0个粉丝

0

问答

0

专栏

0

资料

goohoo 2019-09-29 18:51:00
认可0
同感,还有通道的概念,文档中也没清到的是什么?

H伟伯爵H

0个粉丝

0

问答

0

专栏

0

资料

H伟伯爵H 2019-12-09 16:57:11
认可1
神仙打架,儒生学习;

idotce

0个粉丝

0

问答

0

专栏

0

资料

idotce 2019-12-21 15:04:31
认可0
说实话,受益匪浅,zhuangweiye解答的很好,但也非常认同楼主,sample的代码说实话真的非常乱,看过这么多平台的代码,包括mtk,高通,rk,Intel,allwinner的代码架构,就没见过这么没有结构乱的代码,mipiconfig,sensor init,app,全是一团
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区