Broadcom SDK6.4.4驱动架构简单理解

static bde_ctrl_t _devices[LINUX_BDE_MAX_DEVICES];

首先在linux-kernel-bde模块里

1.基与spi,pci设备驱动之上,再抽象一个结构体数组

static bde_ctrl_t _devices[LINUX_BDE_MAX_DEVICES]

来存储spi,pci设备。

2.定义一个结构体_ibde,存储操作spi,pci设备的相关函数

static ibde_t _ibde = {

    name: _name,

    num_devices: _num_devices, //管理的_devices个数

    get_dev: _get_dev,

    get_dev_type: _get_dev_type,

    pci_conf_read: _pci_conf_read,

    pci_conf_write: _pci_conf_write,

    pci_bus_features: _pci_bus_features,

    read: _read,

    write: _write,

    salloc: _salloc,

    sfree: _sfree,

    sinval: _sinval,

    sflush: _sflush,

    interrupt_connect: _interrupt_connect, //注册中断服务号

    interrupt_disconnect: _interrupt_disconnect,

    l2p: _l2p,

    p2l: _p2l,

#if defined(BCM_ROBO_SUPPORT)

    spi_read: _spi_read,

    spi_write: _spi_write,

#else

    NULL,

    NULL,

#endif /* defined(BCM_ROBO_SUPPORT) */

    iproc_read: _iproc_read,

    iproc_write: _iproc_write,

};

3..在linux-kernel-bde模块里创建一个函数linux_bde_create 用来获取这个_ibde结构体,再EXPORT_SYMBOL(linux_bde_create),这样bcm-core模块里就可以调用这个函数。

4.在bcm-core模块里调用函数linux_bde_create获取_ibde,借助这个实现对spi,pci设备的操作。

在bcm-core模块里定义了一个

typedef struct

{

    soc_cm_dev_t              dev;

    soc_cm_device_vectors_t     vectors;

} cm_device_t;

cm_device_t     soc_cm_device[SOC_MAX_NUM_DEVICES];

 

来 管理linux-kernel-bde模块里扫描到的设备

soc_cm_device可以理解为是linux-kernel-bde模块里_devices的拷贝及强化版,

bcm-core模块调用linux_bde_create来获取_ibde,并用它填充soc_cm_device,并在之后的初始化处理流程里,将使用soc_cm_device.

5. bcm-core模块里定义了

soc_control_t   *soc_control[SOC_MAX_NUM_DEVICES];

来管理芯片

soc_control是芯片层面的

 

整个流程是:

1. linux-kerenl-bde模块先探测设备,注册驱动,并用static bde_ctrl_t _devices[LINUX_BDE_MAX_DEVICES] 来存储设备相关信息,用static ibde_t _ibde = {…}来存储设备相关函数,同时创建一个函数linux_bde_create来获取该_ibde,并export_symbol(linux_bde_create).

2.Bcm-core模块调用linux_bde_create 获取_ibde,进而获取设备信息,并用cm_device_t  soc_cm_device[SOC_MAX_NUM_DEVICES]存储这些设备信息,其中包括芯片id,pci/spi读写函数,中断注册函数,struct dev结构体等

bcm-core 模块,init处理流程

1.bcore_sysconf_probe

bde_create 初始化bde,该bde是bcm-core的bde,实际指向了linun-kernel-bde模块的bde

soc_cm_device_create   创建soc_cm_device并简单初始化其中的soc_cm_dev_t dev成员

2.bcore_sysconf_attach

通过soc_cm_device的定义可以看成,soc_cm_device包含两个成员,其中dev成员已在bcore_sysconf_probe中初始化过了,所以在bcore_sysconf_attach中首先初始化vectors ,接着调用soc_cm_device_init,在soc_cm_device_init中,使用的soc_cm_device

 如果是robo系列芯片,进入soc_robo_attach

soc_robo_attach可以看成是创建对应芯片的soc_control,并对其初始化

在soc_robo_attach里,首先创建soc_control[unit], soc_control对应了SOC层的芯片管理,并初始化它的chip_driver

soc->chip_driver = soc_robo_chip_driver_find(dev_id, rev_id);

通过dev id获取芯片的driver,所有bcm芯片的driver都是存放在soc_robo_base_driver_table数组中,这里的driver包含了和芯片相关的一些函数,这些函数在后续的芯片初始化中会被调用。

soc_robo_info_config(unit, soc);

初始化soc_control的info成员soc_feature_init(unit); 初始化featrue以及相关信号量等

如果是esw系列芯片,进入soc_attach

soc_attach与soc_robo_attach类似,也是先创建对应芯片的soc_control,并对其初始化,

soc->chip_driver = soc_chip_driver_find(dev_id, rev_id);

soc->soc_functions = _soc_functions_find(soc->chip_driver);

soc_feature_init(unit);

//注册中断服务

soc_cm_interrupt_connect(unit, iph, INT_TO_PTR(unit))

//以及创建一系列的“mutex”,信号量

soc->socControlMutex = sal_mutex_create("SOC_CONTROL"))

回顾以上可以看出:

bcore_sysconf_probe中最主要的功能是创建soc_cm_device[unit],与芯片一一对应,来源于linux-kernel-bde模块的_devices,描述的是驱动层面的芯片。

bcore_sysconf_attach 中最主要是创建soc_control[unit],与芯片一一对应,基于soc_cm_device,描述的是SOC层的芯片。

后续的芯片初始化就是基于soc_control。

 

转自http://sai03300427.m.blog.chinaunix.net/uid-29827071-id-5766412.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章