博远CA移植文档说明

举报
aiot_bigbear 发表于 2022/09/25 02:16:14 2022/09/25
【摘要】 博远CA移植文档说明201212 为了方便CA在各种不同系统和平台上使用和CA系统的保密性,将CA重要部分做成库。 现在将CA分成如下几个个部分: CA提供给机顶盒函数接口 1.1 BU8  BYCASTB_Init(BU8 byReaderNo); /================================...

博远CA移植文档说明201212

为了方便CA在各种不同系统和平台上使用和CA系统的保密性,将CA重要部分做成库。

现在将CA分成如下几个个部分:

  • CA提供给机顶盒函数接口

1.1

BU8  BYCASTB_Init(BU8 byReaderNo);

/====================================================/

功能:机顶盒启动的时候调用,对CAS模块初始化。

参数:byReaderNo:默认值为1,当为0xff,CA库函数重新初始化。

返回值:

BYCA_OK 初始化成功。

BYCA_ERROR 初始化失败。

/====================================================/

1.2

BU8  BYCASTB_GetVer(BU32*pdwVer, BU8*pCaSysSp, BU8*pCaSysCt)

/====================================================/

功能:机顶盒获得CA模块的版本。

参数:pdwVer: 返回版本号。

pCaSysSp:     CA厂家名称  最大长度 64字节

   pCaSysCt:    CA所有权者   最大长度 32字节

返回值:

BYCA_OK 成功。

BYCA_ERROR 失败。

说明:返回CA模块的版本号。举例: 如果是0x00000104意思就是0.0.1.4。

/====================================================/

1.3

BU8  BYCASTB_GetCardID(BU32 *pdwCardID)

/====================================================/

功能:调用CAS模块,获得智能卡内部ID。

参数:pdwCardID: 返回智能卡内部ID。

返回值:

BYCA_OK 成功

BYCA_ERROR 失败

/====================================================/

1.4

BU8  BYCASTB_CASIDVerify(BU16 wCaSystemID)

/====================================================/

功能:机顶盒获得CASID后调用该接口判断CASID是否有效,如果有效则返回BYCA_OK,否则返回BYCA_ERROR。

本锐科公司正式使用时候CA_SYSTEM_ID  0x4b07  测试时候为CA_SYSTEM_ID  0x5971

参数:wCaSystemID: 机顶盒分析SI/PSI信息获得的CASID。

返回值:

BYCA_OK CASID有效

BYCA_ERROR CASID无效

/====================================================/

1.5

BVOID  BYCASTB_SCInsert(BVOID)

/====================================================/

功能:当用户插卡时机顶盒主程序调用,通知CAS模块

/====================================================/

1.6

BVOID BYCASTB_SCRemove(BVOID)

/====================================================/

功能:当用户拔出智能卡时机顶盒主程序调用,通知CAS模块。

/====================================================/

1.7

BVOID  BYCASTB_SetCurEcmInfos(BU8 byCount,

const SBYCAServiceInfo* pServiceInfos)

/====================================================/

功能:设置当前正在收看的节目的详细信息。

参数: pServiceInfos: SBYCAServiceInfo结构,描述节目的详细信息。

byCount:        设置类型。

说明:

/*-----  ECM_PID设置的操作类型----- */

#define BYCAS_LIST_START     0x10   开始设置

#define BYCAS_LIST_END 0x11  设置结束

#define BYCAS_LIST_ADD 0x12    增加节目

当用户换频道时,机顶盒需要调用CAS提供的此函数,将当前节目的原始信息及ECM PID传递给CAS模块,CAS模块会根据当前频道的信息处理与当前频道相关的操作,如果当前频道为不加扰的频道,则需要将 byCount = 0或 pServiceInfos = NULL,可以停止ECM数据。

if(用户切换频道||或者当前频道中ECMPID发生增加或者减少)

{

BYCASTB_SetCurEcmInfos (BYCAS_LIST_START,BNULL);

if(如果当前频道中有ECMPID,既节目是加扰的) //有几个ECMPID送几次,ECMPID相同送一次就可以,一般情况只送一次。

BYCASTB_SetCurEcmInfos (BYCAS_LIST_ADD, pServiceInfos);

BYCASTB_SetCurEcmInfos (BYCAS_LIST_END,BNULL);

}

{   //解扰单个节目时候,这样设置

   BYCASTB_SetCurEcmInfos(BYCAS_LIST_START,BNULL);

ServiceInfo.m_wServiceID[0] = ServiceId;

ServiceInfo.m_wEcmPid = EcmPid;

ServiceInfo.m_byServiceCount = 1;

BYCASTB_SetCurEcmInfos(BYCAS_LIST_ADD,&ServiceInfo);设置当前解扰的节目

BYCASTB_SetCurEcmInfos(BYCAS_LIST_END,BNULL);

最多同时解扰8个节目,一般情况,同一个节目的音频和视频的CW是一致的。

/====================================================/

1.8

BVOID  BYCASTB_SetEmmPids(BU8 nEmmCount,BU16* pwEmmPids);

/====================================================/

功能:设置EMMPID,CAS模块将根据设置的EMMPID信息进行EMM数据接收处理。

参数:

pwEmmPids: CAT表中包含的descriptor中将有CA_system_ID及CA_PID,调用BYCASTB_CASIDVerify()校验有效的CA_PID即为EMM PID。

nEmmCount: EmmPid的个数,目前只支持nEmmCount=1,当为0时,停止EMM数据。

说明:

当机顶盒收到CAT表后,机顶盒需要调用CA提供的此函数,将EMM PID传过来,这样CA程序就可以根据此PID收取私有表,更新用户卡里的授权及为用户提供增值服务,当设置nEmmCount = 0或pwEmmPids = NULL时,CA模块会停止收取EMM。

if(BYCASTB_CASIDVerify(CaSystemId)==true)

{ BYCASTB_SetEmmPids(1, &EmmPid);}

/====================================================/

1.9

BVOID BYCASTB_StreamGuardDataGot(BU8 byReqID,BU8 bSuccess,BU16 wPID,BU8* byszReceiveData,BU32 wLen); 

/====================================================/

功能:机顶盒主程序在收到CAS私有数据或者Time_Out,调用这个接口将数据提供给CAS模块处理。

参数:

byReqID:当前请求收取私有表的请求号,与BYSTBCA_SetStreamGuardFilter里的byReqID对应,申请表的TABLE_ID

{

EMM_TABLE_ID 0x81

ECM_TABLE_ID 0x82

PubEmail_Table_ID 0x91

PriEmail_Table_ID 0x92

PubAdress_Table_ID 0x93

CA_MENU_Table_ID 0x95

}

bSuccess: 收取数据有没有成功,成功为true,失败为false

wPID: 接收的数据的流的PID。

byszReceiveData: 收取的私有数据

wLen: 收取到的私有数据的长度

/====================================================/

1.10

BVOID  BYCASTB_AddDebugMsg(BU8 bDebugFlag); 

/====================================================/

功能:打开或关闭调试信息。

参数:bDebugFlag: 打开调试信息标志,1:打开调试信息;0:关闭调试信息。

BYCASTB_AddDebugMsg(1);该函数在初始化之前调用

BYCASTB_Init(1);

/====================================================/

1.11

BVOID BYCASTB_ShowOSDMsgOver(BU16 wDuration);

/====================================================/

这个函数暂时可以不用实现

/====================================================/

1.12

BU8 BYCASTB_GetEmailCount(BU16 *pEmailCount,BU16 *pNewEmailCount); 

/====================================================/

功能:机顶盒获取E-mail个数接口。

参数:

*pEmailCount: 机顶盒中E-mail总个数。

*pNewEmailCount: 机顶盒中未读过的E-mail个数。

返回值:

BYCA_OK 成功

BYCA_ERROR     失败

/====================================================/

1.13

BU8 BYCASTB_GetEmailContent(BU16 icount,MAIL_DATA *pEmail); 

/====================================================/

功能:机顶盒获取一个E-mail的内容。

参数:

icount: 当前读过第几封邮件号。0—表示第一封

*pEmail: 获取的E-mail结构。

返回值:

BYCA_OK: 获取E-mail成功。

BYCA_ERROR: 没有此E-mail。

/====================================================/

1.14

BU8 BYCASTB_EmailRead(BU16 icount); 

/====================================================/

功能:机顶盒看完E-mail后,通知CAS的接口。

参数:

icount: 当前读过第几封邮件号,0—表示第一封。

返回值:

BYCA_OK: 设置E-mail为已读成功。

BYCA_ERROR: 失败

/====================================================/

1.15

BU8 BYCASTB_DelEmail(BU16 icount);

/====================================================/

功能:机顶盒删除E-mail接口。

参数:  icount:

如果为0,表示删除邮箱中所有email;

1 表示第一封

返回值:

BYCA_OK: 删除E-mail成功。

BYCA_ERROR: 失败

/====================================================/

1.16

BU8 BYCASTB_GetProductCount(BU16 *pProductCount);

/====================================================/

    参数:*pProductCount,返回实际产品个数

返回:如果有产品,返回BYCA_OK

  如果没有产品,返回BYCA_ERROR

/====================================================/

1.17

BU8 BYCASTB_GetCaMenuProduct(CAMenu_Product *pCaMenu_product);

/====================================================/

参数:

pCaMenu_product->CaMenu_Product_Init   返回参数中这个变量没有意义

返回:

产品内容,如果成功返回BYCA_OK,否则BYCA_ERROR

/====================================================/

1.18

BVOID BYCA_ParseBAT(BU8* psibuffer);

/====================================================/

功能:为了实现区域漫游功能,需要用户调用的功能,当用户收到BAT数据后,

      调用该函数,CI移植时候,只写函数,不实现

/====================================================/

1.19

BVOID BYCAS_NitZONEDes(BU8* databuf);

/====================================================/

功能:调用CAS模块,设置当前的区域。NIT插入的描述子结构为:

tag                    8bit(0x9c)

length 8bit

zoneID 16BIT

CI移植时候,只写函数,不实现

/====================================================/

二、STB机顶盒给CA接口

2.1

BVOID BYSTBCA_GetSCStatus(BU8 * pbyStatus); 

/====================================================/

功能:返回智能卡当前状态。

参数:pbyStatus: 返回智能卡状态,为BYCAS_SC_OUT、BYCAS_SC_IN两种之一。

/====================================================/

2.2

BU8 BYSTBCA_GetDataBufferAddr(BU32* lSize,BU32 * ppStartAddr); 

/====================================================/

功能:获得机顶盒分配给CAS的存储空间的起点地址和大小(以字节为单位)。

参数:

ppStartAddr: 机顶盒分配给CAS的存储空间的开始地址。

lSize: 输出机顶盒分配给CAS的储存空间的大小。

默认分配64 * 1024 byte

/====================================================/

2.3

BU8 BYSTBCA_ReadDataBuffer(BU32 pStartAddr,BU32* plDataLen,BU8* pData);

/====================================================/

功能:读取保存在机顶盒中的信息。

参数:

pStartAddr: 要读取的存储空间的开始地址。

plDataLen: 输入为要读取的最长数据值;输出为实际读取的大小。

pData: 存放输出数据。

/====================================================/

2.4

BU8 BYSTBCA_WriteDataBuffer(BU32 pStartAddr,BU32 DataLen,BU8* pData); 

/====================================================/

功能:向机顶盒的存储空间写信息。

参数:

pStartAddr: 要写的存储空间的开始地址。

DataLen: 输入为要写的数据的长度;输出为写入的实际长度。

pData: 要写的数据。

/====================================================/

2.5

BU8 BYSTBCA_Sleep(BU32 dwmsec); 

/====================================================/

功能:挂起当前线程。

参数:

dwmsec: 毫秒。

/====================================================/

2.6

BU8 BYSTBCA_SemaphoreInit(BY_Semaphore *pSemaphore,BU8 flag);

/====================================================/

功能:初始化信号量,初始化后信号量没有信号。

参数:pSemaphore: 指向信号量的指针。

/====================================================/

2.7

BU8 BYSTBCA_SemaphoreDestory(BY_Semaphore *pSemaphore ); 

/====================================================/

功能:释放一个信号量。

参数:pSemaphore: 指向信号量的指针。

/====================================================/

2.8

BU8 BYSTBCA_SemaphoreSignal(BY_Semaphore *pSemaphore ); 

/====================================================/

功能:给信号量加信号。

参数:pSemaphore: 指向信号量的指针。

/====================================================/

2.9

BU8 BYSTBCA_SemaphoreWait(BY_Semaphore *pSemaphore ); 

/====================================================/

功能:等待信号量,等待成功之后,信号量为无信号。

参数:pSemaphore: 指向信号量的指针。

/====================================================/

2.10

BU8 BYSTBCA_RegisterTask(const BS8* szName,pThreadFunc pTaskFun); 

/====================================================/

功能:CAS模块向机顶盒注册线程。

参数:

szName: 注册的线程名称。

pTaskFun: 要注册的线程函数。

/====================================================/

2.11

BU8 BYSTBCA_SetStreamGuardFilter(BU8 byReqID,BU16 wPID,BU8* szFilter,BU8* szMask,BU8 byLen,BU16 nWaitSecs); 

/====================================================/

功能:设置过滤器接收CAS私有数据。

参数:

byReqID: 请求收表table_id。机顶盒应该保存该数据,接收到CAS私有数据后调用BYCASTB_StreamGuardDataGot()时应该将该数据返回。

wPID: 需要过滤的流的PID。

szFilter: 过滤器的值,为一个8个字节的数组,相当于8*8的过滤器。

szMask: 过滤器的掩码,为一个8个字节的数组,与8*8的过滤器对应,当szMask的某一bit位为0时表示要过滤的表对应的bit位不需要与szFilter里对应的bit位相同,当szMask某一位为1时表示要过滤的表对应的bit位一定要与szFilter里对应的bit位相同。(不包含数据长度的过滤)

byLen: 过滤器的长度,为8。

nWaitSecs: 收此表最长的等待时间,如果为0则无限等待,单位秒。

/====================================================/

2.12

BU8 BYSTBCA_SetDescrCW(BU16 wEcmPid,BU8 byKeyLen,const BU8* szOddKey,const BU8* szEvenKey,BU8 bTaingControl)

/====================================================/

功能:CA程序用此函数设置解扰器。将当前周期及下一周期的CW送给解扰器。

参数:

wEcmPID: CW所属的ECMPID。

szOddKey: 奇CW的数据。

szEvenKey: 偶CW的数据。

byKeyLen: CW的长度。8字节

bTaingControl: true:允许录像,false:不允许录像。

/====================================================/

2.13

void BYSTBCA_AddDebugMsg(BU32 Param1,BU32 Param2,const BS8 *pszMsg);

/====================================================/

功能:打印调试信息。

参数:Param1,Param2,pszMsg: 调试信息内容。

printf("[0x%x][0x%x] %s \n",Param1,Param2,pszMsg);

/====================================================/

2.14

BU8 BYSTBCA_SCAPDU(BU8 byReaderNo,const BU8* byszCommand,BU16* pbyLen,BU8* byszReply); 

/====================================================/

功能:实现与智能卡之间的通讯。采用7816标准。

参数:

byReaderNo: 对应的读卡器编号。默认值设置为1

pbyLen: 输入为待发送命令字节的长度;输出为返回字节长度。

byszCommand:    待发送的一串命令字节。

byszReply:    返回的数据,空间长度恒为256字节。

/====================================================/

2.15

BVOID BYSTBCA_ShowPromptMessage(BU8 byMesageNo);

/====================================================/

功能:显示用户不能观看节目等提示信息,下面两个函数对应使用。

参数:

byMesageNo: 要显示的消息编号。

/====================================================/

2.16

BVOID BYSTBCA_HidePromptMessage(BVOID); 

/====================================================/

该函数可以不需要实现

/====================================================/

2.17

BVOID BYSTBCA_ShowFingerPrinting(BU16 wEcmPid,BU32 dwCardID,BU32 wDuration);

/====================================================/

功能:显示指纹信息。

参数:

wEcmPid: ECM PID

dwCardID: 卡号。

wDuration: 持续秒数(可以不考虑显示时间,一直显示,直到收到消息取消)。

if((wEcmPid != 0x1fff) && (dwCardID != 0xffffffff))

显示 BOY 的水印图片 ,如果没有图片,显示PID和卡号

else if((wEcmPid == 0x1fff) && (dwCardID != 0xffffffff))

显示卡号

else if((wEcmPid == 0x1fff) && (dwCardID == 0xffffffff))

取消显示指纹

/====================================================/

2.18

BVOID BYSTBCA_ShowOSDMsg(const BS8* szTitle,const BS8* szOSD,BU16 wDuration);

/====================================================/

功能:以左滚字幕的方式显示OSD消息,可以是同步显示,也可以是异步显示。

参数:

szTitle: 显示标题。长度需要计算字符串的个数

szOSD: 用于显示的OSD信息。

wDuration: 0:显示一次后立即返回;其他值为显示的具体持续秒数。

说明:

用户可以通过遥控器取消当前OSD显示。

/====================================================/

2.19

BVOID BYSTBCA_EmailNotify(BU8 byShow);

/====================================================/

功能:显示新邮件的标志。

参数:

byShow: 标志类型。含义如下:

BYCAS_NEW_EAMIL 新邮件通知。

BYCAS_NEW_EMAIL_NO_ROOM 有新邮件,但Email空间不够。

BYCAS_EMAIL_NONE 没有新邮件。

/====================================================/

2.20

BU8 BYSTBCA_Random(BU8 blen,BU8 *pbBuf);

/====================================================/

功能: 提供随机数据,blen 一般为8

参数:  blen 随机数据长度

pbBuf 返回blen个随机数

/====================================================/

2.21

BU8 BYCA_SetZoneFreq( BU32 Freq );

/====================================================/

功能:通知APP锁定某个频道信号,在该特定的频点寻找漫游信息。

参数: KHZ;

返回:  true,表示频点已锁到,否则未锁定该频点。

移植CI时,不需要实现此功能

/====================================================/

2.22

void BYCASTBCA_UrgencyBroad(BU16 wOriNetID,BU16 wTSID,BU16 wServiceID,BU8 *pUTCTime);

/====================================================/

功能:应急广播, 切换到指定频道。

参数:

wOriNetID: 原始网络ID。

wTSID: 传送流ID。

wServiceID: 业务ID。

pUTCTime--5 bytes: UTC时间,该时间用户不需要处理。

移植CI时,不需要实现此功能

/====================================================/

2.23

/*++

功能:当用户插卡时,先调用该函数复位卡

返回:     true  成功,false失败

参数:pATR 最大64 字节

--*/

BU8 BYCASTB_SCReset(BU8 *pATR);

  • 漫游功能

第一步、开机启动盒子必须搜索主频点。且分析当前NIT的区域描述子。

NIT插入的描述子:

语法

位数

缩写

zone_limite_descriptor( )

{

zone_tag = 0x9c 

 zone_pair_length

for(i=0;i<N;i++)

 {

     Reserved   

 }

}

8

8

uimsbf

uimsbf

库里提供分析NIT该描述子的功能,机顶盒搜到该描述子(tag),后可直接调用下面的接口。

void BYCAS_NitZONEDes(BU8* databuf )

参数:传入的参数第一字节要为0X9C,就是说要将整个描述子都传给库。

第二步:库读出插入的智能卡的区域信息。该步由库完成。

第三步:机顶盒提供一个可以搜索频点的接口。

void BYSTBCA_SetZoneFreq( BU32 Freq)

库直接调用该接口,库里只提供一个频点参数,其它值都是网络里默认的值,然后调用机顶盒锁定信号。

第四步:设置Freq锁定后,收当前BAT表,将收到的表数据直接送给函数BYCA_ParseBAT,如果没有,2秒超时后直接进入当前节目,如果有数据,延时一秒后,收看当前节目。

库里的消息介绍:

#define STATUE_CA_CARD_ZONE_INVALID 30 /*您的智能卡不再服务区*/

#define  STATUE_CA_CARD_ZONE_CHECK_ENTER   31 /* 正在寻找网络,请等待*/

#define  STATUE_CA_CARD_ZONE_CHEKC_OK      32 

/*漫游限制检查ok,提示机顶盒恢复正常工作,锁定当前信号,调用播放函数*/

四、智能卡说明

4.1接口符合7816标准(无PPS协商,采用标准速率)。

4.2智能卡的上电等待时间要求小于0.5秒。

4.3在ATR中,返回卡的版本号。

4.4时钟工作范围 1-5MHz。(所提供的SMART CARD时钟不能大于5MHz)

4.5供电电压3V-5.5V。

4.6环境温度 -25 – 85 度

备注:ECM表数据不大于2048字节,EMM表数据不大于4096字节

文章来源: blog.csdn.net,作者:悟空胆好小,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xushx_bigbear/article/details/122729158

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。