1. 缩略语
1)SNDCP:SubnetworkDependence Converage Protocol,子网相关汇聚协议
2)NSAPI:Network Layer Service Access Point Identifier,网络层服务接入点标识,其实就是在使用SNDCP层的服务的PDP的PDP上下文的一个索引,SNDCP向上层提供的服务访问点;
3)SAPI: LLC 向上层提供的服务访问点
3)Qos:quality ofservice
4)BSS:Base StationSystem
5)SGSN:Service GPRSSupport Node
6)PDP:Packet DataProtocol
2. SNDCP功能1)PDP的多路复用, 如图一,将不同协议的数据复用成 LLC PDU;
2)用户数据的压缩和解压缩;
3)协议控制信息的压缩和解压缩;
4)将网络协议数据单元(N-PDU)的分片层逻辑链路控制协议(LLC)的数据单元(LL_PDU),以及将逻辑链路控制协议的数据单元(LL_PDU)重组成网络协议数据单元(N-PDU);
图一 SNDCP 多路复用
§ SNDCP作用就为了让LLC不用管N-PDU是来自哪种网络协议,即复用;
§ SNDCP可以将网络数据进行分段或者重组,还有压缩或者解压缩等作用,其中有是否进行分段标识符 segment,因为LLC对数据包有限制;
§ BSSGP使用TLLI来区别不同的LLC,即区别不同的用户;
§ LLC中的user-data的SAPI必须与SNDCP中的NSAPI一一对应,因此NSAPI受限于SAPI数目;
SNDCP 向上层提供服务访问点 NSAPI,上层协议通过 NSAPI发送 N-PDU给SNDCP 实体,SNDCP 将数据根据配置压缩、分段后SN-PDU,通过 SAPI 发给 LLC 实体。N-PDU 对应 SPRD 协议栈中的SN_DATA_REQ (reliability_class=1 or 2) 和 SN_UNITDATA_REQ (reliability_class=3or 4),对应关系如表一,图二 SNDCP 上下层关系,图三 LLC 承载 SNDCP 已经其他协议数据;
表一 NSAPI 与SAPI 对应关系
SAPI
MESSAGE
RELIABILITY CLASS
3
SN_DATA_REQ
1
5
SN_DATA_REQ
2
9
SN_UNITDATA_REQ
3
11
SN_UNITDATA_REQ
4
1
GMM移动性管理
7
短消息
图二 SNDCP 上下层关系
图三 LLC 承载上层数据
3. SNDCP 逻辑结构SNDCP 逻辑结构如图三,网络侧有对等待逻辑实体,上层是 TCP/UDP等应用层协议,下层是 LLC 协议;
图四 SNDCP 逻辑结构
SNDCP SPRD 实现结构如图四,所有配置信息都来自 SM,信令面只与SM有关系,数据面上层是TCP/IP,下层是LLC。
图五 SPRD SNDCP 实现结构
4. SPRD SNDCP 消息 4.1 SNSM_ACTIVATE_IND
pdp_accept 后 SM 通知 SNDCP相关参数,激活(配置)SNDCP实体;
4.2 SNSM_DEACTIVATE_INDPDP DEACTIVATE IND 后或者PS 域 DETACH 后,SM 通知 SNDCP;
4.3 SNSM_MODIFY_IND
SM实体使用该原语来触发某个NSAPI的Qos配置的改变和要使用的SAPI。SGSN的SM实体用它来通知SNDCP实体必须以一个重新协商的Qos配置和分配的SAPI创建一个NSAPI,移动台的SM实体还可以用它来指示RLC/MAC使用的射频优先级。在收到SNSM_MODIFY_IND原语时,SNDCP如果必要,必须为指定SAPI建立确认方式点对点LLC操作,并释放原来分配SAPI
4.2 SN_XID_REQ
SNDCP用户使用该原语来传递请求的XID(exchangeidentity)参数给对等实体。
4.4 LL_SNDC_XID_INDSNDCP实体用该原语传递请求的XID参数列表给SNDCP用户。
TlliAssigned_HandleSndcLlXidReq
4.5 LL_SNDC_XID_CNF
SNDCP实体使用该原语来确认SN_XID_REQ,这个确认应该是在SNDCP收到LLC-XID.cnf之后(也就是已经收到对端的确认)。
4.6 SNSM_SEQUENCE_IND在SGSN路由区切换的时候使用,并且只用于确认方式点对点LLC操作。当MS收到该原语时,接收到的N-PDU数值参数指示了在SGSN接收到了N-PDU数值,如果缓冲中的N-PDU被对端SNDCP已经收到的N-PDU数值确认,该N-PDU必须从buffer中删除。另外,SNDCP层在收到该原语后,将继续那个NSAPI的SN-PDU传输,且所有的缓冲N-PDU(比如那些未经确认或者未发的)必须从最老的N-PDU开始传输。如果这个NSAPI使用的SAPI并未建立,缓冲N-PDU只能在收到LL_ESTABLISH_IND或者LL_ESTABLISH_CNF原语之后才能使用。SNSM_SEQUENCE_RSP是对SNSM_SEQUENCE_IND的响应。移动台在接收到SNSM_SEQUENCE_IND后可以发送该原语来返回接收到的N-PDU数值给SGSN。
4.7 SN_UNITDATA_REQ
该原语被SNDCP用来进行非确认模式(unacknowledged)的N-PDU的传输.该原语包含了用来标识PDP的NSAPI
4.8 SN_DATA_REQ该原语主要给SNDCP user使用,用于确认模式(acknowledged)的N-PDU的传输,SN-PDU的成功传输将由LLC层进行确认。该原语的参数包括N-PDU,NSAPI和N-PDU号码.
4.9 LL_SNDC_ESTABLISH_INDLLC层使用该原语来通知SNDCP层某个SAPI的确认模式点对点操作的建立或者重建.所请求的XID用来传递请求的SNDCP XID参数给SNDCP层.在重建的情况下,映射到受影响的SAPI的所有NSAPI必须进入recovery状态,所有缓冲的N-PDUs(比如那些完全接收没有得到确认的,以及那些尚未被传输的)当连接重建后必须以最老的N-PDU开始被传输.并且所有的在这个SAPI上使用确认模式的点对点LLC操作的压缩实体被重置.
4.10 LL_SNDC_ESTABLISH_CNF
LLC层使用该原语来告知SNDCP层某个SAPI的确认模式点对点操作的成功发起,XID参数用来传递协商过的SNDCP XID参数.在重建的情况下,映射到受影响的SAPI的所有NSAPI将进入recovery状态,所有的缓冲的N-PDU(比如那些完全接收还未得到确认,或者那些还未传输的)在连接重建的时候将以最老的N-PDU开始被传输.并且所有在这个SAPI上使用确认模式点对点LLC操作的压缩实体将重置.
4.11 LL_SNDC_RELEASE_INDSNDCP层使用LL_RELEASE_REQ来释放确认方式的点对点操作,LL_RELEASE_CNF被LLC层用来进行对LL_RELEASE_REQ的确认。LL_RELEASE_IND则被LLC层用来通知SNDCP层某个SAPI的确认方式点对点操作的终止,该indication的cause参数用来表示终止的原因。SNDCP层在收到LL_RELEASE_IND或者LL_RELEASE_CNF以后,受影响的SAPI的压缩N-PDU队列将从SNDCP层中被删除,在这个SAPI上使用确认的点对点操作的压缩实体将被重置.
4.12 LL_SNDC_RELEASE_CNF参加 4.9
4.13 LL_SNDC_RESET_INDSGSN的LLC层使用该原语来指示SNDCP层重置的XID参数已经被传输,移动台的LLC层使用该原语来指示SNDCP层收到重置的XID参数.
在收到LL_RESET_IND时, SNDCP层必须
§ 将所有未完成的SNDCP<---->LLC请求类型原语视为没有发送
§ 重置所有的SNDCPXID参数为默认值
§ 在移动台,对每个使用非确认模式的点对点操作的NSAPI,设置发送的N-PDU号码(非确认的)为0,并且
§ 对每个使用确认模式的点对点操作的NSAPI,进入recovery状态,挂起所有的N-PDU的传输,直到收到针
对于该NSAPI的SNSM-SEQUENCE_IND原语.在SGSN,SNDCP层必须为LLC层中受影响的SAPIs重建确认模式点对点操作
4.14 LL_SNDC_SUSPENDSENDDATA
用于流量控制?该消息有 LLC 上报给 SNDCP,具体功能未知,可能是用于流控。
4.15 LL_SNDC_RESUMESENDDATA用于流量控制?该消息有 LLC 上报给 SNDCP,具体功能未知,可能是用于流控。
4.16 LL_SNDC_UNITDATA_IND非确认模式数据传输涉及的两个原语。在LL_UNIDATA_REQ中,SGSN的QoS参数优先级级别,延迟级别,可靠性级别和最高吞吐量。移动台的Qos参数包括最高吞吐量和可靠性级别。可靠性级别指示了指示了携带SN-PDU的LLC祯是否以保护模式传输,以及RLC/MAC是使用确认模式还是非确认模式。射频优先级仅在移动台中包括,指示了RLC/MAC使用的无线优先级级别。
4.17 LL_SNDC_DATA_IND
确认模式下进行SN-PDU的传输涉及到的3个LLC层的原语。sndcp层使用LL_DATA_REQ来请求数据传输,并为每个请求关联一个参考参数,在SGSN的Qos参数中包括优先级级别,延迟级别和最大吞吐量。在移动台的Qos参数中包括最大吞吐量,Qos参数是3GPP TS04.08中定义的服务信息元素的质量。射频优先级只包括在移动台中,指定了RLC/MAC使用的射频优先级别。在LL_DATA_REQ使用前,必须先用LL_ESTABLISH建立SAPI的确认方式点对点操作。LL_DATA_CNF被LLC层用来告知sndcp SN-PDU的成功传输,该原语包含了一个参考参数,通过该参数可以标识与之相应的LL_DATA_REQ,那些收到完全接收的confirm的缓冲N-PDU将被删除.
4.18 LL_SNDC_DATA_CNF
见 4.14
4.19 SNSM_TLLI_IND
SM 通知 SNDCP TLLI。
4.20 LL_SNDC_DEACTIVED_INDLLC Entity 发给 SNDCP的消息,去激活指示?不确定。
4.21 LL_SNDC_ACTIVED_IND 4.22 LL_SNDC_ESTABLISH_IND 4.23 LL_SNDC_XID_IND 4.24 LL_SNDC_DATA_IND 4.25 SN_DATA_REQ 4.26 LL_SNDC_ESTABLISH_CNF 4.27 LL_SNDC_XID_CNF 4.28 gprs_disable_LL_SNDC_UNITDATA_IND
5. SNDCP数据传输实例 5.1 具体功能
§ 将SN-DATA原语映射到LL_DATA原语
§ 将SN-UNIDATA原语映射到LL_UNIDATA原语
§ 复用一个到多个的网络层实体的N-PDU到恰当的LLC连接建立,重建和释放确认方式的点对点LLC操作
§ 确认方式点对点LLC操作中,通过缓冲和重传机制来使LLC层实现了数据的完整性
§ 独立为每个NSAPI管理投递系列号
§ 在传输端对冗长的协议控制信息进行压缩,在接收端进行解压缩。压缩方法特定用于在使用的网络层和传输层。
§ 在传输端对冗长的数据信息进行压缩,在接收端进行解压缩。对每个SAPI,数据压缩独立执行,也可能对每个PDP上下文独立执行。压缩参数可以在MS和SGGN间进行协商
§ 分片和重组。压缩功能的输出是分片为LL_PDU的最大长度。这个程序同在使用的特定网络层协议无关。
§ 在对等SNDCP实体间协商XID参数。
图六 SNDCP在发送端的数据流程
5.2 N-PDU的多路复用
网络层使用的协议由动态分配的NSAPI来标识(该NSAPI应该是在PDP激活时在SM层生成的,然后通过SNSM-ACTIVE_IND传递给SNDCP层的,其实相当于在此建立了网络层协议和NSAPI之间的对应关系)。SNDCP在收到N-PDU后,在发向下层之前会插入该NSAPI,对等实体收到底层数据后,会根据NSAPI来确定所使用的网络协议。
5.3 确认方式点对点LLC操作的建立和释放
1)建立准则
§ 收到SNSM-ACTIVE.ind,该NSAPI的Qos配置要求使用acknowledgedpeer-to-peer LLC operation,但是对应的SAPI还未建立acknowledged peer-to-peer LLC operation(Qos中的Reliabilityclass参数)
§ 收到SNSM-MODIFY.ind(dlmu2001:此时Qos profile发生了变化,此时可能从unacknowledged模式改变成acknowledged模式,或者从一个老的SAPI更新到一个新的SAPI上)
2)重建准则
§ V.42数据压缩算法检测到错误
§ 分片重组时候,处于Receivefirst segment 状态,收到F位置0的SN-DATA PDU(此时该PDU将被丢弃,LLC operation进行重建)
§ 分片重组时,处于Receivesubsequent segment状态,收到F位置1的SN-DATA PDU,且DCOMP,PCOMP或 者N-PDU number同第一个分片不同(此时属于同一个N-PDU的之前的分片将被丢弃,对应的SAPI的 LLC operation将重建)
3)SNDCP发起的建立/重建流程
说明:
§ LL_ESTAB.req中可以包含XID参数,如果包含该参数
§ 可能的结果:成功;失败;发生冲突后成功解决
§ 收到LL_ESTAB.cnf表示建立成功;收到LL_RELEASE.ind表示建立失败,根据失败的原因,SNDCP层需要作出恰 当的动作(比如通知SM子层)
§ 如果SNDCP实体在发出LL_ESTAB.req或者LL_XID.req之后收到LL_ESTAB.ind或者LL_XID.req,此时即发生冲突,这种情况下,SNDCP实体就当做没有发过LL_ESTAB.req,正常处理接收到的LL_ESTAB.ind或者LL_ XID.req,如果之前发出的LL_ESTAB.req或者LL_XID.req包含一个或者多个XID参数,或者在XID参数中包含了一个或者多个压缩字段,或者在一个压缩字段中包含了一个或者多个参数,而这些参数没有在LL_ESTAB.ind或者LL_XID.ind中协商,则sndcp实体此时再LL_XID.req进行协商。
4)acknowledged peer-to-peer LLC operation的释放
§ 释放准则:收到SNSM-DEACTIVE.ind或者SNSM-MODIFY.ind且对应的SAPI不再有使用acknowledgedpeer-to-peer的NSAPI。
§ 过程:调用LL_RELEASE.req,收到LL_RELEASE.cnf表示释放成功
5.4 N-PDU缓冲
§ N-PDU在压缩成分片并传输到LLC层之前,必须缓冲.这个缓冲使用哪一层的buffer比较好?网络层?
§ 收到SNSM-DEACTIVE.ind会删除相关的NSAPI的对应缓冲
§ 对于acknowledged方式的数据传输,缓冲必须被确认后才能删除(LL_DATA.cnf和SNSM.SEQUENCE可以完成该确认)
§ 对于unacknowledged方式的数据传输,传输完成就删除
5.5.投递顺序管理SNDCP层负责维护对等实体间每个NSAPI的N-PDU的投递顺序.
今天没事干,就做了一个记事本。用jQuery-mobile+html5做的,感觉界面做的还行吧,就是没有后台的操作,不过,后台的东西很快就会做完的,今天就把我今天几个小时的成果给大家看一看吧!我直接上代码了,大家看看就行了,前台的东西也不是很难!嘿嘿!
<!DOCTYPE html> <html> <head> <title>main.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="/blog_article/styles.css">--> <script type="text/javascript" src="/blog_article/jquery-1.6.4.min.js"></script><link rel="stylesheet" href="/blog_article/jquery.mobile-1.0.min.css" type="text/css"></link><script type="text/javascript" src="/blog_article/jquery.mobile-1.0.min.js"></script></head> <body> <!-- 主页面 --> <section id="page1" data-role="page" > <div data-role="header"> <a href="#about" data-rel="dialog" data-transition="pop" data-role="button">关于</a> <h1>记事本</h1> <a href="#page2" data-transition="slidedown" data-role="button" >编辑</a> </div> <div data-role="content"> <ul data-role="listview"> <li data-role="list-divider">2013/2/1</li> <li><a href="/blog_article/index.html">题目四</a></li> <li><a href="/blog_article/index.html">题目三</a></li> <li><a href="/blog_article/index.html">题目二</a></li> <li data-role="list-divider">2012/1/31</li> <li><a href="/blog_article/index.html">题目一</a></li> </ul> </div> <div data-role="footer" data-position="fixed"> <h1>IMUDGES</h1> </div> </section> <!-- 编辑界面 --> <div id="page2" data-role="page"> <div data-role="header"> <a data-role="button" href="#page1" data-transition="slideup">主页</a> <h1>编辑</h1> <a data-role="button" >保存</a> </div> <div data-role="content"> <label>文本题目:</label> <input type="text" /> <label>输入内容:</label> <textarea ></textarea> </div> <div data-role="footer" data-position="fixed"> <h1>IMUDGES</h1> </div> </div> <!-- 关于界面 --> <section id="about" data-role="page"> <header data-role="header"><h1>记事本</h1></header> <div data-role="content" > <p>本软件由IMUDGES团队blackberry小组所做,所有版权blackberry所有!</p> </div> <footer data-role="footer"><h1>IMUDGES</h1></footer> </section> </body> </html>
下面是效果图:
过几天把后台操作都加上,大家就可以放到自己的手机里可以用了!(这个一直到手机上的话,用phoneGap,这东西挺好用的呦,有时间把这一块东西在和大家分享一下下!呵呵)
基于avd7181c解决视频输入效果差的问题<一>---驱动移植、调试手记
做过全志A10平台的人都知道,在视频输入方面,虽然有4路TV Decoder,但是做的效果真的不敢恭维。笔者基于全志平台做车载互动娱乐系统以及车载导航主机,客户对视频输入效果有强烈要求,怎么办呢?
加芯片弥补平台的不足。笔者选用的是AVD7181C芯片,可以支持CVBS\S-Video\YPbPr\RGB等多种输入格式,通过该芯片可以输出YUV 4:2:2信号、656信号。YPbPr输入信号的情况下,输出YUV 4:2:2信号,CVBS视频输入的情况下,输出656信号。刚好这两种格式全志平台的CSI都可以支持。那怎么调试呢?
如果想快速的调试出图像,从下到上自己做一套会非常耗费时间,也不利于调试,那还是利用现有的资源来做。笔者就是基于android camera APK来完成前期调试的,我们就把AVD7181C芯片当着是一颗camera芯片,利用camera应用来完成yuv的数据存取以及显示,我们负责把底层打通就可以了。
第一步:基于一个具体camera驱动移植到AVD7181C上。笔者基于gc0308驱动来做的。复制一份改个名字,把里面所有关于gc0308寄存器设置的数组都先清空,这个时候代码就会减少几百行,留着下面的驱动框架,iic操作sensor_read, sensor_write接口也留着。在其他地方都可以大刀阔斧的砍下去,留一个空函数即可。大结构代码如下:
static const struct v4l2_subdev_core_ops sensor_core_ops = { .g_chip_ident = sensor_g_chip_ident, .g_ctrl = sensor_g_ctrl, .s_ctrl = sensor_s_ctrl, .queryctrl = sensor_queryctrl, .reset = sensor_reset, .init = sensor_init, .s_power = sensor_power, .ioctl = sensor_ioctl, }; static const struct v4l2_subdev_video_ops sensor_video_ops = { .enum_mbus_fmt = sensor_enum_fmt,//linux-3.0 .try_mbus_fmt = sensor_try_fmt,//linux-3.0 .s_mbus_fmt = sensor_s_fmt,//linux-3.0 .s_parm = sensor_s_parm,//linux-3.0 .g_parm = sensor_g_parm,//linux-3.0 }; static const struct v4l2_subdev_ops sensor_ops = { .core = &sensor_core_ops, .video = &sensor_video_ops, }; /* ----------------------------------- */ static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct v4l2_subdev *sd; struct sensor_info *info; struct regval_list regs; int ret = -1; int i = 0; avd7181c_dev_dbg("fuction=%s, line=%d\n",__FUNCTION__, __LINE__); info = kzalloc(sizeof(struct sensor_info), GFP_KERNEL); if (info == NULL) return -ENOMEM; sd = &info->sd; v4l2_i2c_subdev_init(sd, client, &sensor_ops); info->ccm_info = &ccm_info_con; info->gain = 0; info->wb = 0; info->clrfx = 0; avd7181c_dev_dbg("fuction=%s, line=%d\n",__FUNCTION__, __LINE__); init_avd7181c_proc(); gsd = sd; return 0; } static int sensor_remove(struct i2c_client *client) { struct v4l2_subdev *sd = i2c_get_clientdata(client); v4l2_device_unregister_subdev(sd); kfree(to_state(sd)); return 0; } static const struct i2c_device_id sensor_id[] = { { "7181c", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, sensor_id); static struct i2c_driver sensor_driver = { .driver = { .owner = THIS_MODULE, .name = "7181c", }, .probe = sensor_probe, .remove = sensor_remove, .id_table = sensor_id, };
第二步:根据需要的视频输入格式写好对应寄存器设置。如果需要支持CVBS就加一个cvbs格式的一长串寄存器,ypbpr也一样。笔者以ypbpr为例,列出部分寄存器设置:
static const struct regval_list reg_ypbpr[]= { {{0x05},{0x01}},// ; PRIM_MODE = 001b COMP {{0x06},{0x06}},// ; VID_STD for 525P 2x1 {{0x03},{0x08}}, {{0xC3},{0x46}},// ; ADC1 to Ain4, ADC0 to Ain6, {{0xC4},{0xB5}},// ; ADC2 to Ain5 and enables manual override of mux {{0x1D},{0x47}},// ; Enable 28.63636MHz crystal {{0x3A},{0x11}},// ; Set Latch Clock 01b. Power down ADC3. {{0x3B},{0x81}},// ; Enable Internal Bias {{0x3C},{0x3d}},// ; PLL QPUMP to 011b {{0x6B},{0x83}}, //0xc3,//0x83,// ; 422 8bit out {{0xC9},{0x00}},// ; SDR mode #if 1 {{0x73},{0xD0}},// ; Enable Manual Gain and set CH_A gain {{0x74},{0xE6}},// ; Set CH_A and CH_B Gain - 0FAh {{0x75},{0x81}},// ; Set CH_B and CH_C Gain {{0x76},{0xa0}},// ; Set CH_C Gain {{0x77},{0x06}}, {{0x78},{0x08}}, {{0x79},{0x02}}, {{0x7A},{0x00}}, #endif ........... }
第三部:在设置fmt的接口中去控制输入格式。在sensor_s_fmt函数中可以去控制是选择CVBS还是ypbpr,当然是通过这个接口中传递下来的参数来控制。这部分完全可以自定义,笔者介绍一下ypbpr 480P情况下的设置:
info->fmt = sensor_fmt; info->width = 720; info->height = 480; /*write reg_ypbpr setting*/ ret = sensor_write_array(sd, reg_ypbpr , ARRAY_SIZE(reg_ypbpr)); //reg_ypbpr avd7181c_dev_dbg("==========sensor_write at wirte reg_ypbpr ret=%d\n", ret);
第四步:为了调试方便增加便捷调试功能。怎么才能在运行的时候,可以很便利的去修改寄存器,读出当前设置的寄存器值呢?可以通过proc来完成。通过串口来输入控制命令,这样想读哪个寄存器就读哪个寄存器,想怎么调试方便,就可以按需要很方便的去调试。
static void init_avd7181c_proc(void) { struct proc_dir_entry *read_r, *write_r; avd7181c_dev_dbg("%s\n", __func__); dir = proc_mkdir("avd7181ctest", NULL); read_r = create_proc_entry("read_r", 0666, dir); if (read_r) read_r->write_proc = avd7181cTest_proc_read; write_r = create_proc_entry("write_r", 0666, dir); if (write_r) write_r->write_proc = avd7181cTest_proc_write; }
第五步:在system_config1.fex中添加配置。主要是打开csi,设置名称、iic地址等,还有就是复位、standby供电的gpio设置。
csi_used = 1 csi_mname = "7181c" csi_twi_id = 1 csi_twi_addr = 0x42 csi_if = 0 csi_d15 = csi_reset = port:PH13<1><default><default><0> csi_power_en = port:PI11<1><default><default><0> csi_stby = port:PH18<1><default><default><0> csi_reset_b =
通过以上几步,我们已经搭建好一个初步的AVD7181C驱动框架,编译通过就可以跑测试了。笔者使用DVD输出ypbpr信号给AVD7181C,在camera apk中查看图像。先贴一副截屏图像:
在这个调试过程中,笔者遇到了很多的问题,多问问,多试试,一步步解决,总能解决好。笔者将在后续文章中介绍遇到的AVD7181C iic读寄存器兼容性问题、CVBS输入情况下CSI驱动的修改等。敬请期待!