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设备的操作。
4.在bcm-core模块里
在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。