1. linux dvb devices
linux dvb api使得应用程序可以控制相关硬件模块通过六个unix风格的字符设备,包括video, audio, frontend, demux, ca, ip-over-dvb networking。video和audio设备控制mpeg2解码的硬件,frontend设备控制tuner和dvb解调器。demux设备用于过滤pes和section,如果不是硬件实现的也可以通过软件来完成。最后,CA设备控制条件接收相关的硬件模块。所有的设备在目录/dev/dvb下面:
  /dev/dvb/adapterN/audioM
  /dev/dvb/adapterN/videoM
  /dev/dvb/adapterN/frontendM
  /dev/dvb/adapterN/netM
  /dev/dvb/adapterN/demuxM
  /dev/dvb/adapterN/caM
其中N值标识第N个适配卡,M用于标识某适配卡下第几个该类型的设备。

2. api头文件
每个dvb设备对应一个头文件,比如:<linux/dvb/frontend.h>。

3. frontend api
open(), close(),
ioctl() - 包括:FE_READ_STATUS, FE_READ_BER, FE_READ_SNR, FE_READ_SIGNAL_STRENGTH, FE_READ_UNCORRECTED_BLOCKS, FE_SET_FRONTEND, FE_GET_FRONTEND, FE_GET_EVENT 等等。

4. 实现
以TDA10048+TDA18211为例。
phStbDemux_frontend.c, frontend_init()根据预设的demod和tuner类型,调用dvb_attach():
card->fe = dvb_attach(tda10048_attach, &tda10048_conf, card->i2c_adapter);
相当于 card->fe = tda10048_attach(&tda10048_conf, card_i2c_adapter);
该函数记录i2c adapter,配置,ops等信息到tda10048_state,返回dvb_frontend结构指针,该结构指针的priv变量携带了tda10048_state的指针位置,使得card->fe能够操作10048。

类似,随后调用的
 card->fe = dvb_attach(tda18211_attach, card->fe, card->tuner_addr, card->i2c_adapter, instance_count == 0);
在card->fe里记录了tuner的操作和对应的i2c。

所以新的demod或者tuner,参考实现即可。包括实现attach函数(配置设备,记录i2c adapter,向外提供操作函数),以及操作函数。

frontend_init()之后调用dvb_register_frontend()用于注册设备。

事实上,在/etc/init.d/S91dvb.sh, 调用insmod phStbDemux833x.ko,将调用模块phStbDemux833x中的pnx8335_init_module(),进而调用dvb_phStb_register(),进而调用dvb_phStb_load_card().
dvb_phStb_load_card()注册adapter,dmx初始化,ca注册,以及frontend_init()。