当前位置:  编程技术>移动开发
本页文章导读:
    ▪某通讯公司 SNDCP LOG 分析        某通信公司 SNDCP LOG 分析 1.     缩略语 1)SNDCP:SubnetworkDependence Converage Protocol,子网相关汇聚协议 2)NSAPI:Network Layer Service Access Point Identifier,网络层服务接入点标识,其实就是在使用SND.........
    ▪ 用jQuery-mobile作的一个记事本(前台界面)        用jQuery-mobile做的一个记事本(前台界面)             今天没事干,就做了一个记事本。用jQuery-mobile+html5做的,感觉界面做的还行吧,就是没有后台的操作,不过,后台的东西很快就会做.........
    ▪ 基于avd7181c解决视频输入效果差的有关问题<一>驱动移植、调试手记       基于avd7181c解决视频输入效果差的问题<一>---驱动移植、调试手记基于avd7181c解决视频输入效果差的问题<一>---驱动移植、调试手记             做过全志A10平台的人都知道,在视.........

[1]某通讯公司 SNDCP LOG 分析
    来源: 互联网  发布时间: 2014-02-18
某通信公司 SNDCP LOG 分析
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_IND

PDP 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_IND

SNDCP实体用该原语传递请求的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_IND

LLC层使用该原语来通知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_IND

SNDCP层使用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_IND

SGSN的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_IND

LLC 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的投递顺序.



    
[2] 用jQuery-mobile作的一个记事本(前台界面)
    来源: 互联网  发布时间: 2014-02-18
用jQuery-mobile做的一个记事本(前台界面)

             今天没事干,就做了一个记事本。用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,这东西挺好用的呦,有时间把这一块东西在和大家分享一下下!呵呵)



       


    
[3] 基于avd7181c解决视频输入效果差的有关问题<一>驱动移植、调试手记
    来源: 互联网  发布时间: 2014-02-18
基于avd7181c解决视频输入效果差的问题<一>---驱动移植、调试手记

基于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驱动的修改等。敬请期待!


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3