如何调bcm 芯片sdk初始化

作者&投稿:法古 (若有异议请与网页底部的电邮联系)
博通编译SDK时候怎么指定工具链?~

LINUX 的内核编译 1.编译内核指的时通常的内核 2.应为内核可以将驱动和功能模块动态的载入内核,所以在需要的时间把功能模块 动态载入,所以就有了,内核模块的编译
度平移法:方法如图:(a)测硬币直径; (b)测乒

目前主流智能方向的话是google的一款,只是那个还没有开放SDK
目前流行在用的是openwrt上修改的

SDK初始化前,需要对SDK的架构有所了解,具体如下图;可以看出SDK的代码结构是一个层次化分明的架构,这里对各层的作用和详细工作机制不阐述了,具体可以参见SDK的介绍文档。

SDK代码的结构图

SDK根据上述架构,BCM模式启动的时候进行的初始化包括以下几个步骤:

1. 根据操作系统(linux、vxworks或unix等)不同调用sal_core_init()和sal_appl_init()两个函数的对应版本,分别对Core SAL和Appl SAL两部分进行初始化;linux系统下的sal_core_init()函数的主要工作时调用了函数sal_dpc_init()创建DPC(Deferred Procedure Call)的信号量和线程;sal_appl_init()函数的linux版本则直接返回,没有做任何工作;这两个函数虽然意义很大,但是值得我们研究的内容不多。

2. 然后调用sal_thread_create创建一个运行BCM模式的线程,并调用diag_shell()函数完成对BCM模式的数据进行初始化、命令行进行注册、设备探测和挂载、芯片初始化、客户命令注册、重启动和BCM模式退出等操作,主要通过调用diag_init()函数、sysconf_init()函数、diag_rc_set()函数、sysconf_probe()函数、sysconf_attach()函数、bcm_init()函数、custom_cmd()和sal_reboot()等函数实现,下面详细介绍下该函数的执行流程;

a. diag_init()调用cmdlist_init()函数、init_symtab()函数、sal_srand()函数、gvar_init()函数和sh_bg_init()函数等来完成命令行注册、芯片的寄存器和表项软件数据内存分配、随机数种子获取、全局变量初始化和所有设备可执行任务的内存分配(最多10条)和记录等工作;

b. sysconf_init()函数除了初始化管理接口的调式函数外还调用soc_cm_init()函数来完成SOC的配置的管理接口的初始化;

c. sysconf_probe()函数调用bde_create()函数和sysconf_chip_override()函数完成探测已经挂载的设备并建立对应的配置管理项,包括为每个设备的分配id等工作;

d. 然后对每个unit调用sysconf_attach()函数来对soc_cm_device_init ()初始的管理接口的设备挂载一些中断处理函数,注册PCI读写函数等,用管理接口的结构体的指针函数成员形式保存,以便可以删除和添加这些处理函数,并调用soc_cm_device_init()函数通过在里面再调用soc_attach()函数来对每一个unit建立并初始化芯片的soc_control_t structure信息及对其访问的互斥体;soc_attach()函数调用soc_feature_init函数、soc_intr_disable()函、soc_cmic_uc_msg_start函数、soc_info_config()函数(这个函数下面会继续调用)、soc_dcb_unit_init()函数和soc_counter_verify()函数分别进行支持特性赋值、关闭中断、开启对设备的CMIC的UC信息、soc信息初始化、CPU收发包缓存DCB初始化和各种counter寄存器软件记录特定初始化,并对SOC_CONTROL(unit)和SOC_PERSIST(unit)两个保存芯片设备信息的结构体一些成员进行赋值;

e. 调用diag_rc_set()函数来设置对每个芯片初始化配置的脚本文件名称和热启动的初始化配置脚本名称,如果没有指定全部用默认的配置;然后解析脚本中的配置项,运用脚本进行配置初始化(包括MMU的配置);

f. 然后对每个芯片调用bcm_init()函数开始芯片的初始化工作,其首先调用bcm_attach()函数对BCM_CONTROL(unit)信息的部分成员进行赋值,包括设备类型、设备名称和unit号等;然后调用_bcm_api_xlate_port_init()函数建立lport和bcm port的映射关系;并调用芯片各功能模块的初始化函数(trident是bcm_esw_init ()函数)来对各模块进行初始化;

g. 然后调用custom_cmd()函数加载BCM模式下用户配置的命令加载进去;

h. 这样整个SDK就初始化完毕,BCM模式就会提示BCM>等来等待用户输入命令;然后进入一个死循环一直调用sh_process()函数解析用户配置的命令,然后调用对应的SDK接口下发到驱动;

i. 如果用户输入退出命令,会调用sh_exit函数来处理,包括可选的是否回收已经分配的资源等任务;

j. 如果用户输入重启的命令则调用sal_reboot()函数linux版本是通过exit(0)实现。

另外,SDK为上层的初始化提供了调用接口system_init()函数对BCM交换芯片进行初始化,这部分是咱们应该重点关注的部分,当然该接口在BCM模式下用init命令也是可以被调用到的。下面详细讲解下:

a. 首先调用soc_reset_init()函数,ESW芯片里这个函数调用soc_do_init()函数来完事情;soc_do_init()函数会根据是否是重启动设备进行的配置不一样;

(1) 如果是热启动的设备则先调用soc_dma_abort()关闭所有DMA并调用soc_linkscan_config()函数设置CMIC(CPU Management InterfaceController)查询端口link状态,如果设置项为空则表示关闭端口link状态扫描;然后如果是初始化soc有失败标记的话调用soc_dma_abort()函数、soc_counter_stop()函数、soc_mem_scan_stop函数、soc_i2c_detach()函数和soc_l2x_stop()函数(有些其他芯片还调用soc_cmic_uc_msg_stop函数等)分别禁止所有的中断、禁止计数行为、禁止内存扫描动作、释放I2C
驱动内存、结束L2X(应该是用于mac地址学习和老化对CPU进行中断通知)相关线程和停止等;然后调用soc_info_config()函数来初始化芯片端口的各种信息,包括芯片型号、各种类型端口的位图、芯片称号、mod数目、端口数目、hg口的位置、堆叠口位置、CPU口队列数目、用于时间同步端口数目、端口最大支持速率、meter pools、入端口QOS支持的队列数目等信息,另外对trident芯片支持QOS三级调度,所以还会调用soc_trident_num_cosq_init()对各个端口支持的队列数做特殊初始化,最后调用soc_esw_dport_init()函数对User
to physical port map的映射及对user port的逆映射;总之soc_reset_init()函数偏重于对芯片信息、端口属性和QOS队列属性等初始化;然后调用soc_feature_init()函数和soc_dcb_unit_init()函数完成芯片特性支持添加和CPU收发包缓存DCB的初始化工作;然后调用soc_dma_attach()函数和soc_dma_init()函数对中断进行重新初始化,然后对通过PCI设置CMIC_CONFIG使能高级的DMA模式,包括Scatter/gather,
reload, andunaligned transfers(这里具体含义不太明白),然后开启一些中断;然后是对MAC_CTRL寄存器读写配置一些MAC层的收发使能;然后是设置MAC表项、MPLS表项、vlan和egress vlan、 L3表项的一些hash冲突的级别,接着使能MAC地址学习和老化通知、 重新获取L3转发表项的长度和表项大小信息即可完成整个热启动的过程;

(2) 在不是热启动的情况下,会首先调用调用soc_info_config()函数、soc_feature_init()函数和soc_dcb_unit_init()函数来完成信么MMU、芯片特性支持和DCB初始化工作;然后调用soc_endian_config() 函数和soc_pci_burst_enable()函数来完成硬件大小端和支持PCI读写突发情形的使能;然后是调用soc_reset()函数来完成对芯片的一些配置,包括端口的phy配置和mac配置(比如寄存器有XLPORT_XMAC_CONTROL),及还会调用相应芯片的soc_reset_bcm56840_a0()函数完成对CPU口和出入方向属性的一些配置,如CMIC_XGXS1_PLL_CONTROL_*、CMIC_MISC_CONTROL、CMIC_SOFT_RESET_REG、ING_CONFIG_2、EGR_CONFIG_2、ING_Q_BEGIN和EGR_Q_BEGIN等寄存器;然后和热启动一样,通过PCI设置CMIC_CONFIG使能高级的DMA模式,对MAC_CTRL寄存器读写配置一些MAC层的收发使能就退出了soc_do_init()函数;

b. 然后调用soc_misc_init()函数对芯片的初始化信息进行核实判断,最终根据函数指针调用芯片相应的函数,trident调用的则是_soc_trident_misc_init()函数;_soc_trident_misc_init()函数首先_soc_trident_ser_init()函数对IFP、EFP、VFP和UDF等tcam表项的表项大小、起始地址等信息进行软件获取并记录,然后调用_soc_trident_clear_all_memory函数对CPU_COS_MAP_ONLY、FP_GLOBAL_MASK_TCAM、FP_GM_FIELDS、FP_TCAM、FP_UDF_TCAM、L2_USER_ENTRY_ONLY、L3_DEFIP_128_ONLY、L3_DEFIP_ONLY、L3_TUNNEL、MY_STATION_TCAM_ENTRY_ONLY、VFP_TCAM、VLAN_SUBNET_ONLY、EFP_TCAM、FP_GLOBAL_MASK_TCAM_Xm、FP_GLOBAL_MASK_TCAM_Ym、L3_ECMP_XM、L3_ECMP_YM、EGR_IPMC_CFG2、EGR_VLAN_CONTROL_1、_XLPORT_MIB_RESET等表项进行清空;然后_soc_trident_misc_init()函数继续对CPU_PBM、CPU_PBM_2m、ISBS_PORT_TO_PIPE_MAPPINGm、EGR_ING_PORTm、XLPORT_CONFIGr、XLPORT_MODE_REG、IARB_MAIN_TDMm、EGR_PERQ_XMT_COUNTERS_BASE_ADDR、MISCCONFIG、ING_BYPASS_CTRL、EGR_BYPASS_CTRL、EGR_ENABLE、EPC_LINK_BMAP、ING_CONFIG_64、EGR_CONFIG_1、EGR_VLAN_CONTROL_1、ING_EN_EFILTER_BITMAP、SW2_FP_DST_ACTION_CONTROL、RTAG7_FLOW_BASED_HASH、RTAG7_HASH_ECMP、CMIC_I2C_STAT、CMIC_RATE_ADJUST_I2C、CMIC_RATE_ADJUST_INT_MDIO等寄存器或表项进行初始化赋值操作,并调用_trident_ledup_init对端口进行点灯操作,还调用_soc_trident_fcoe_config_init对芯片的FCOE功能进行初始化;

c. 然后调用soc_mmu_init()函数对MMU进行初始化,和soc_misc_init()函数一样,也是根据不同的芯片挂载不同的函数指针,这里会调用_soc_trident_mmu_init()函数对trident芯片的MMU进行初始化;包括GH、PG、SSP、SP、Port Min、PORT_MAX_SHARED_CELL、Queue Min等的划分,MMU port到phy port的映,及MCQ_CONFIG、OP_THR_CONFIG、OP_VOQ_PORT_CONFIG、OVQ_DROP_THRESHOLD0、OVQ_DROP_THRESHOLD_RESET_LIMIT、OVQ_FLOWCONTROL_THRESHOLD、OVQ_MCQ_CREDITS、MCQ_FIFO_BASE_REG、PORT_PAUSE_ENABLE0_64、INPUT_PORT_RX_ENABLE0_64、S3_CONFIG、S2_CONFIG、S2_S3_ROUTING等voq和Qos相关功能的MMU相关寄存器初始化;

d. 然后调用soc_l2x_start函数开启对MAC地址学习和老化的信息通知功能,主要是创建一个线程;

e. 然后调用bcm_init()函数对芯片进一步初始化,实际对trident芯片调用的是bcm_esw_init()函数,该函数再调用_bcm_esw_init()函数,该函数主要的是分别调用bcm_esw_linkscan_enable_set()函数、_bcm_modules_init()函数和bcm_esw_rcpu_init()函数,来实现关闭端口状态扫描、初始化芯片各个模块、初始化RCPU机制的主控模块:然后_bcm_esw_init()函数调用_bcm_esw_switch_init()函数来实现对CPU队列的初始化和对芯片的一些特殊控制信息,主要是通过调用bcm_esw_switch_rcpu_encap_priority_map_set()函数和bcm_esw_switch_control_set()函数来设置的。其中的_bcm_modules_init()函数调用芯片转发流程的各个模块的初始化函数,具体如下图:

此处内容较多但是非常重要,希望感兴趣的同学能查看对应代码实际学习下相关内容,只提一点,bcm_esw_l2_init函数会调用_bcm_l2_bpdu_init函数对l2_user_etry表项设置BPDU报文上CPU的规则;

f. 然后对unit的每个端口调用bcm_port_stp_set()函数、bcm_port_autoneg_set()函数和bcm_stat_clear()函数分别设置端口的STP的状态为转发、是否自动协商和清楚端口统计;

g. 然后调用bcm_linkscan_enable_set函数来定期查询端口的link状态;

h. 部分芯片还会调用bcm_linkscan_register注册trunk口的link状态查询回调函数;


临潭县18693623677: 初始化SDK 时,程序崩溃,怎么办 -
阚眉复方: 1、卸载sdk 2、执行apt autoremove 或 yum autoremove 3、重启 或 杀死进程 4、重新官方安装 推荐rpm官方源安装比较智能 5、初始化启动sdk完成

临潭县18693623677: 新手请教Xilinx SDK俩问题
阚眉复方: 1. GPIO核加入到系统中,有个GUI可以设置一下,但是写程序的时候还是要初始化一下的.初始化过程中其中有一项就是定义输入输出,类似于按照位,0代表输入,1代表输入之类的给一个寄存器赋值应该是.初始化和读取操作都有相应的C函数(API).你点一下GPIO的IP核的右键,里面可能有一项是view functions之类的一项,你得去读读驱动函数,10.1的时候还有,不知道现在新版本的删除了没有.2. 没更新,你点generate bitstream就行了吧,我记得有这项吧.好久不用了

临潭县18693623677: 有一个软件二次开发包(SDK),需要用C++编程,不知道怎么调用SDK,请大师指点,最好详细,本人菜鸟 -
阚眉复方: 调用SDK一般有以下几种方法: 1. 直接安装SDK的.exe程序,安装后会自动嵌入到你的C++软件里.然后你新建C++程序后,直接引用就可以了.添加引用:Add -> Add Reference -> Select 你的SDK类库. 2. 如果你的SDK包中没有.exe安装程序,那么可能是个类库,就是.lib文件.那么你将该文件复制到你新建的程序文件夹里,或复制到你的C++安装目录下(Include).然后在文件头部添加一段引用代码:#include . 顺便问一下,你的软件二次开发包(SDK)是什么开发包?

临潭县18693623677: 游戏显示sdk尚未初始化成功,请先初始化sdk,切换的流量就会显示这样,但切换到WiFi又能正常加 -
阚眉复方: 因为SDK包数据丢失,使用流量时无法加载,切换到WIFI以后才可正常加载 1.软件开发工具包(外语首字母缩写:SDK、外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立...

临潭县18693623677: 苹果sdk初始化失败怎么办 -
阚眉复方: 原因: 1、病毒木马造成的,在当今互联网时代,病毒坐着为了获得更多的牟利,常用病毒绑架应用程序和系统文件,然后某些安全杀毒软件把被病毒木马感染的应用程序和系统文件当病毒杀了导致的. 2、应用程序组件丢失,应用程序完整的...

临潭县18693623677: c#使用sdk如何初始化参数 -
阚眉复方: c#使用sdk如何初始化参数 http://jingyan.baidu.com/article/8065f87fedd03f2331249802.html

临潭县18693623677: cocos2d - js怎么接SDK -
阚眉复方: 连接方法:1)jsapi_ticket: 填入上一步获取的ticket2)noncestr: 这里随机生成一个字符串填进去(VQhYOUJRz6RolHqN)3)timestamp: 这里填入一个时间戳,去掉毫秒的3位(如:1420870884) - 这里尽量写ticket生成后的一段时间,new ...

临潭县18693623677: sdk初始化失败怎么办? -
阚眉复方: sdk初始化失败怎么办 阴阳师sdk初始化失败解决办法 1、下载的游戏包有问题,请去官方下载客户端. 2、游戏在下载过程中,由于传输过程中中断,或者信号不好,造成数据丢失,下载完成之后,会安装不上.解决办法:找个环境好,网速给...

临潭县18693623677: android studio 怎么设置sdk默认版本 -
阚眉复方: File-->Project structure,打开如下界面,这个是改整个工程的SDK版本.选择你要的sdk的版本,apply,然后再ok,大功告成. 关闭所有的工程.然后重启Android Studio.选择“Configure”,选择"Project Defaults"选择“Project Structure"此时,会弹出设置默认工程的SDK路径的对话框,直接在build.gradle中修改就行.将compileSdkVersion和targetSdkVersion修改一下API代号就行

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网