05__openWRT Voice之DSP的分析与修改

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Tree_in_sea/article/details/100574697

驱动环境VOICE-DSP说明

Version :0.1

 

 

简 介

本文档介绍了Voice中对DSP的资源的分配过程和通道的分配的过程,文章中给出的框图和编程实例,是对电话应用编程接口TAPI和Voip的功能的具体应用,是对今后的语音处理的应用具有一定的借鉴意义。篇一简要地说明了TAPI管理和配置DSP的内容,篇二主要是编程上TAPI对DSP资源的管理。

 

篇 一

篇一介绍了简要地TAPI利用DSP的硬件资源,使得驱动开发人员对GRX288的DSP进行一定的了解,有助于对驱动底层和上层的理解,同时也给出了Voice子系统TAPI的实例对通道的建立,设备FXS、FXO等应用分析。

 

1:TAPI的应用简介

大麦盒子需要的是既能够通过PSTN打电话,也能够通过IP网络打电话。具体实现过程如下:

下面是TAPI的电话通讯的状态:

 

 

2、GRX288的DSP的内部结构图

3、TAPI系统接口

  1. 两种类型的文件描述符

1.设备文件描述符:对设备的广泛的控制         

2.通道文件描述符:对DSP进行分配资源和连接硬件的功能控制

 

2)通道资源

1.电话通道资源 视为数字语音的IO端口、PCM资源、ALM资源

2.数据通道资源 视为信号资源DTMF等、编解码资源

  1. DECT    暂时不用

3、设备和通道的建立过程

1)应用程序创建设备节点和通道节点

 

2)打开设备节点和通道节点

 

  1. Channel链接DATA资源进行数据资源映射

 

  1. Channel链接ALM进行通道线路资源(FXS或FXO)

 

  1. Channel链接PCM通道进行通讯

在配置PCM接口之后,应用需要IFX_TAPI_PCM_CFG_SET.配置PCM通道通讯。

-读写时隙编号

-PCM高速通道链接通道

-A-law Mu-law,Liner 16-bir

一旦PCM通道配置之后,激活PCM通讯,设备开始在编程时隙和高数公路的传输和接收。

在关闭通道之前,确保关闭了运行在PCM通道的LEC资源。

4、事件处理

1、TAPI HLLL的事件处理过程

 

  1. 事件消息格式

 

  1. RTP配置
  2. SIP:对VOIP的呼叫的建立,和协商等的协议
  3. RTP: 在建立会话之后,直接传输的媒体流。

 

在开始进行RTP会话的时候,应用需要建立每个通道的RTP连接参数。

会话的参数:IFX_TAPI_PKT_RTP_PT_CFG_SET

  1. RTP的编码类型

选择合适的地区进行配置,以及编解码进行配置

 

 

 

 

 

 

6、模块连接

 

 

  1. 数据通道与其他类型的通道的配置

 

  1. PCM通道和任何一个PCM、PHONE通道的连接

 

  1. Phone通道和任何一个PCM、PHONE通道的连接

 

  1. 包处理

TAPI实现

-linux用户空间

通过读写的非阻塞系统调用

RTP和T 38 traffic

-linux内核空间

TAPI内核包接口,RTP Traffic

 

 

 

 

篇 二

篇二是对驱动对DSP资源的管理的说明,在openwrt下的对相关voice的程序的一些重要的地方的说明,先分析编译过程中加载的voice的模块,再分析每个模块的作用和对资源的管理情况,最后对接口的调用进行分析与说明。

 

一:编译加载的Voice模块及其分析

  1. 编译过程后加载的voice的package

1)先对voice的包进行编译

 

 

 

  1. 再对voice的包进行加载

 

  1. 各个包的说明

 

ltq-voice-kpi2udp

任务处理所有的内核包接口(KPI)数据和发送它到udp socket中,发现空闲通道和使用该通道的编号,UDP和KPI的包的相互传送,创建udp套接字和分配到给定的KPI通道,创建与删除udp套接字和给定的通道的联系和会话。

重要函数:ifx_udp_redirect.c

 

结构体:

typedef struct

{

  IFX_boolean_t   in_use;

  IFX_boolean_t   ext_sock;

  struct sock    *sk;

  struct socket  *sock;

  struct sockaddr_in dst_addr;

  int             last_sock_ret;

} IFX_KPI2UDP_REDIRECT_TABLE_ENTRY_t;

 

@@@@

/**

   Tasklet to handle all KPI data and send it on a UDP socket

 

   \param  foo       currently unused

   \return void

*/

static void ifx_kpi2udp_tasklet(unsigned long foo)

考虑数据长度,数据,内核包接口通道

 

@@@@

/**

   Check if any active connection might block in the socket...

   \param void

   \return  IFX_TRUE if any sk is blocking, otherwise IFX_FALSE

*/

static IFX_boolean_t ifx_kpi2udp_sk_blocking(IFX_void_t)

@@@@

/**

   Find a free channel and return it's index

 

   \return

      - index of free channel found

      - -1 if no free channel found

*/

static IFX_int16_t ifx_kpi2udp_FindFreeChannel(IFX_void_t)

 

 

@@@@

/**

   Find the channel number from the socket given

 

   \param  sk           Pointer to a "struct sock".

 

   \return

      - index of channel found

      - -1 if no channel found

*/

static IFX_int16_t ifx_kpi2udp_FindChannelNo(struct sock* sk)

@@@@

/**

   Function that sends packets on a UDP socket. (KPI to UDP direction)

 

   \param  channel      Channel number.

   \param  data         Pointer to data to be sent.

   \param  len          Length of the data.

 

   \return

      - CHANNEL_NO_ERR

*/

static int ifx_kpi2udp_toUDP(IFX_TAPI_KPI_CH_t channel, void *data, size_t len)

 

@@@@

/**

   Callback function that copies packets from UDP to KPI.

 

   \param  sk           socket

   \param  skb          socket buffer

 

   \return

      - NO_ERROR

      - WRONG_PKT

      - NO_BUFFER

      - NO_CALLBACK

*/

static int ifx_kpi2udp_fromUDP(struct sock* sk, struct sk_buff *skb)

 

@@@@

/**

   Function that creates a UDP socket and attaches it to the given KPI channel.

 

   \param  channel      Channel number.

   \param  saddr        Source (local) IP address.

   \param  sport        Source (local) port number.

   \param  daddr        Destination (remote) IP address.

   \param  dport        Destination (remote) port number.

 

   \return

      - CALL_MK_SESSION_ERR

      - NO_ERROR

*/

static IFX_int32_t ifx_kpi2udp_make_session(IFX_TAPI_KPI_CH_t channel,

                                            IFX_uint32_t saddr,

                                            IFX_uint16_t sport,

                                            IFX_uint32_t daddr,

                                            IFX_uint16_t dport)

 

@@@@

/**

   Function that associates an UDP socket with an given KPI channel.

 

   \param  channel      Channel number.

   \param  fd           File descriptor of an open and connected socket.

 

   \return

      - CALL_MK_SESSION_ERR

      - NO_ERROR

*/

static IFX_int32_t ifx_kpi2udp_make_fd_session(IFX_TAPI_KPI_CH_t channel,

                                               int fd)

 

@@@@

/**

   Function that deletes the one session on the given channel.

 

   Deleting a session means deactivating it and deleting the socket.

 

   \param  channel      Channel number.

 

   \return

      - CHANNEL_NO_ERR

      - NO_ERROR

*/

static IFX_int32_t ifx_kpi2udp_delete_session(IFX_TAPI_KPI_CH_t channel)

 

@@@@

/**

   Function that stops the entire qos support. It deactivates and deletes all

   sessions on all channels.

 

   \return

      - NO_ERROR

*/

static IFX_int32_t ifx_kpi2udp_close_redirect(IFX_void_t)

 

内核加载模块函数

static int __init ifx_kpi2udp_DriverStart(void)

static void __exit ifx_kpi2udp_DriverStop(void)

 

 

ltq-voice-tapi

 

Src目录下的文件:

 

该目录下的是对tapi管理具体的FXS或者FXO端口的应用的实例。下面是对一些重要的函数的一些应用分析,具体的内容详见代码;

 

Drv_tapi_init.c   指向LL底层驱动的指针(设备和通道的建立)

 

 

drv_tapi_ioctl.c  结合篇一的事件分离图对这个程序更加清晰

 

Drv_tapi_voice.c  数据通道和模拟电话通道的绑定连接

Drv_tapi_win.c    打开底层设备和通道 输入命令和参数控制filp

Drv_tapi_cid.c    主叫号码传送  FSK DTMF

Drv_tapi_dev_io.c   私有数据的ioctl

Drv_tapi_dial.c     拨号动作和拨号定时

Drv_tapi_event.c  数据结构的事件类型

Drv_tapi_fxo.c    DAA直接内存访问和拨号处理,事件等配置

Drv_tapi_kpi.c   KPI接口的初始化和KPI 组

Drv_tapi_linux.c 设备节点的操作  linux模块的支持 linux /proc文件系统处理

函数回调和HL的TAPI函数符号的导出

Drv_tapi_meter.c  电话、事件计量状态、

Drv_tapi_misc.c  核对版本和错误信息检验等

Drv_tapi_opcontrol.c  

 

Drv_tapi_pcm.c        PCM的相关设置

Drv_tapi_polling.c  读取寄存器状态和packet事件到LL缓存再到读取新的packet事件

DRv_tapi_ppd.c         实现FXS口的状态检测

Drv_tapi_qos.c         Qos驱动注册、创建会话,

Drv_tapi_ring.c    

Drv_tapi_stream.c      缓冲区fifo voicebuffer的上下流

Drv_tapi_stat.c        packet路径的状态检测

Drv_tapi_tone.c        走网络和本地语音播放   

 

ltq-voice-tapi-lib-nlt

 

 

ltq-voice-tapidemo

 

 

ubuntu@sky:~/work/Lantiq/Test_Damai_GRX288/UGW-6.1.1/build_dir/target-mips_r2_uClibc-0.9.33.2_grx288_gw_he_ethwan_lte_sample/tapidemo-5.1.1.64/src$ tree

.

├── abstract.c    连接应用和板子,芯片,根据电话号码,socket,电话和数据通道返回正确的电话

├── abstract.h

├── abstract.o

├── analog.c       ALM映射到phone

├── analog.h

├── analog.o

├── board_easy3111.c        实现EASY3111的板子,初始化板子,使用pcm GPIO等

├── board_easy3111.h

├── board_easy3201.c  

├── board_easy3201.h

├── board_easy3332.c

├── board_easy3332.h

├── board_easy336.c

├── board_easy336.h

├── board_easy50510.c

├── board_easy50510.h

├── board_easy50712.c

├── board_easy50712.h

├── board_easy508xx.c

├── board_easy508xx.h

├── board_easy80800.c

├── board_easy80800.h

├── board_easy80920.c

├── board_easy80920.h

├── board_easy80920.o

├── board_xt16.c

├── board_xt16.h

├── board_xwayXRX300.c

├── board_xwayXRX300.h

├── cid.c                   实现tapi demo的CID的功能     

├── cid.h

├── cid.o

├── com_client.o

├── common.c                 电话常用信息,tapidemo的执行信息

├── common_fxo.c             fxo与pcm和data之间的映射和FXO的初始化

├── common_fxo.h

├── common_fxo.o

├── common.h

├── common.o

├── conference.c  三方通话等会议电话的使用转态情况

├── conference.h

├── conference.o

├── control_pc.o

├── dev_help.o

├── device_duslic_xt.c         初始化板子,准备给板子设置好将要工作的模式   

├── device_duslic_xt.h         

├── device_svip.c              给vmmc的一些板级的接口

├── device_svip.h

├── device_vinetic_cpe.c       给vineric CPE板子的接口

├── device_vinetic_cpe.h

├── device_vmmc.c              给vmmc的一些板级的接口      

├── device_vmmc.h

├── device_vmmc.o

├── device_vxt.c               给vxt 板子的接口

├── device_vxt.h                 

├── duslic_fxo.c               

├── duslic_fxo.h

├── event_handling.h

├── event_handling_msg.c        使用message处理event

├── event_handling_msg.o

├── feature.c                   自动Gain控制 AGC

├── feature.h

├── feature.o

├── itm

│?? ├── com_client.c

│?? ├── com_client.h

│?? ├── control_pc.c

│?? ├── control_pc.h

│?? ├── dev_help.c

│?? └── dev_help.h

├── lib_tapi_signal.c          使能信号检测,准备phone或fax传输

├── lib_tapi_signal.h

├── lib_tapi_signal.o

├── Makefile

├── Makefile.am

├── Makefile.in

├── Makefile.inc

├── parse_cmd_arg.c            解析命令行参数    

├── parse_cmd_arg.h

├── parse_cmd_arg.o

├── pcm.c                      定义时隙和通道连接

├── pcm.h

├── pcm.o

├── qos.c                      tapi工作时的质量服务

├── qos.h

├── qos.o

├── state_trans.c              处理不同事件的状态

├── state_trans.h

├── state_trans.o

├── tapidemo

├── tapidemo.c                 Linux上简单的PBX功能

├── tapidemo.h

├── tapidemo.o

├── td_dect.c                  DECT的模块的实现

├── td_dect_cli.h

├── td_dect_config.c           dect的读写的配置

├── td_dect_config.h

├── td_dect.h

├── td_dect_stack.c    DECT实现栈处理

├── td_dect_stack.h

├── td_ifxos_map.c              实现OS的具体功能,pipe读写

├── td_ifxos_map.h          

├── td_ifxos_map.o

├── td_osmap.h

├── td_slic121_fxo.c            初始化在slic121上的FXO

├── td_slic121_fxo.h

├── td_slic121_fxo.o

├── td_socket.c                 处理IPv4和IPv6的套接字和地址结构

├── td_socket.h

├── td_socket.o

├── td_t38.c 为传真T.38传输提供功能函数

├── td_t38.h

├── td_t38.o

├── td_timer.c                   电话检测功能

├── td_timer.h

├── teridian_fxo.c               73M1x66使用PCM或通道映射和时隙使用

├── teridian_fxo.h

├── voip.c                      处理数据通道资源,通道映射,开始和体制

├── voip.h

├── voip.o

└── vxworks_tapidemo_cpe.wpj

ltq-voice-tapidump调试驱动的dump文件

 

 

ltq-voice-vmmc:  

ubuntu@sky:~/work/Lantiq/Test_Damai_GRX288/UGW-6.1.1/build_dir/linux-lantiq_xrx200_grx288_gw_he_ethwan_lte_sample/drv_vmmc-1.15.1.6/src$ tree

.

├── drv_api.h

├── drv_vmmc_access.h

├── drv_vmmc_alm.c

├── drv_vmmc_alm.h

├── drv_vmmc_alm.o

├── drv_vmmc_alm_priv.h

├── drv_vmmc_announcements.c

├── drv_vmmc_announcements.h

├── drv_vmmc_announcements.o

├── drv_vmmc_api.c                          //命令的读写 出错处理

├── drv_vmmc_api.h

├── drv_vmmc_api.o

├── drv_vmmc_bbd.c

├── drv_vmmc_bbd.h

├── drv_vmmc_bbd.o

├── drv_vmmc_cod.c                         //coder rtp

├── drv_vmmc_cod.h

├── drv_vmmc_cod.o

├── drv_vmmc_cod_priv.h

├── drv_vmmc_con.c

├── drv_vmmc_con.h

├── drv_vmmc_con.o

├── drv_vmmc_con_priv.h

├── drv_vmmc_dect.c

├── drv_vmmc_dect.h

├── drv_vmmc_dect.o

├── drv_vmmc_dect_priv.h

├── drv_vmmc_event.c                        //处理驱动 固件 驱动专门的事件

├── drv_vmmc_event.o

├── drv_vmmc_fw_commands.h

├── drv_vmmc_fw_commands_sdd.h

├── drv_vmmc_fw_commands_voip.h

├── drv_vmmc_fw_data.h

├── drv_vmmc_gr909.c                         //GR909线路测试

├── drv_vmmc_gr909.h

├── drv_vmmc_gr909.o

├── drv_vmmc_hostapi.h  

├── drv_vmmc_init.c                            //设备和通道初始化                               

├── drv_vmmc_init_cap.c        

├── drv_vmmc_init_cap.o

├── drv_vmmc_init.h

├── drv_vmmc_init.o

├── drv_vmmc_int.c                            //中断    

├── drv_vmmc_int_evt.h

├── drv_vmmc_int.h

├── drv_vmmc_int.o

├── drv_vmmc_ioctl.c                           //命令的读写             

├── drv_vmmc_ioctl.o

├── drv_vmmc.ko

├── drv_vmmc_linux.c                         //linux下proc文件处理

├── drv_vmmc_linux.h

├── drv_vmmc_linux.o

├── drv_vmmc_ll_if_version.h

├── drv_vmmc.mod.c                          //module匹配                   

├── drv_vmmc.mod.o

├── drv_vmmc.o

├── drv_vmmc_osmap.h

├── drv_vmmc_pcm.c                          //  pcm时隙 通道选择分配

├── drv_vmmc_pcm.h

├── drv_vmmc_pcm.o

├── drv_vmmc_pcm_priv.h

├── drv_vmmc_pmc.c                         //电源管理控制                        

├── drv_vmmc_pmc.h

├── drv_vmmc_pmc.o

├── drv_vmmc_res.c                           //给多个模块利用的资源

├── drv_vmmc_res.h

├── drv_vmmc_res.o

├── drv_vmmc_res_priv.h

├── drv_vmmc_sig.c                          //RTP的设置  DTMF

├── drv_vmmc_sig_cid.c                     //CID的设置   FSK

├── drv_vmmc_sig_cid.h

├── drv_vmmc_sig_cid.o

├── drv_vmmc_sig_cptd.c                   //调用过程语音检测  

├── drv_vmmc_sig_cptd.o

├── drv_vmmc_sig_dtmfg.c                 //DTMF的产生与接收 信号的检测

├── drv_vmmc_sig_dtmfg.o

├── drv_vmmc_sig.h

├── drv_vmmc_sig_mftd.c                    //model fax tone detector

├── drv_vmmc_sig_mftd.o

├── drv_vmmc_sig.o

├── drv_vmmc_sig_priv.h

├── drv_vmmc_sig_utg.c                      //universal tone generator

├── drv_vmmc_sig_utg.o

├── drv_vmmc_stream.c                      //downstream packet handling is done here. The upstream packet handling   s done directly in the interrupt handler in drv_vmmc_int.c

├── drv_vmmc_stream.h

├── drv_vmmc_stream.o

├── drv_vmmc_xrx100.c                     //支持xrx200,给PCM配置GPIO

├── drv_vmmc_xrx100.o

├── Kbuild

├── lib

│?? └── lib_bbd                                  //实现 block based download 基本功能

│??     └── src

│??         ├── lib_bbd.c

│??         ├── lib_bbd.h

│??         └── lib_bbd.o

├── Makefile

├── Makefile.am

├── Makefile.in

├── modules.order

├── Module.symvers

└── mps

    ├── CHANGELOG

    ├── drv_mps_version.h

    ├── drv_mps_vmmc_ar9.c                  //实现vr9 arq的特殊驱动的功能  CPU VPE FW等

    ├── drv_mps_vmmc_ar9.o

    ├── drv_mps_vmmc_bsp.h

    ├── drv_mps_vmmc_common.c              

    ├── drv_mps_vmmc_common.o

    ├── drv_mps_vmmc_crc32.c

    ├── drv_mps_vmmc_crc32.h

    ├── drv_mps_vmmc_crc32.o

    ├── drv_mps_vmmc_dbg.h

    ├── drv_mps_vmmc_device.h

    ├── drv_mps_vmmc_falcon.c

    ├── drv_mps_vmmc.h

    ├── drv_mps_vmmc_linux.c              //Mailbox    read write data  register unregister

    └── drv_mps_vmmc_linux.o

 

ltq-voice-vmmc-xrx200-coef:  

 

ltq-voice-vmmc-xrx200-firmware

 

 

ltq-voice-wineasy

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/Tree_in_sea/article/details/100574697