博通Broadcom SDK源码学习与开发6——支持Linux系统

本文是博通Broadcom SDK源码学习系列的第六篇,主要探讨在Linux系统下,如何利用共享内存、中断和socket进行通信。介绍了Linux启动过程,以及通信机制如socket的使用、中断通信的机制和共享内存通信的实例。

声明:原创作品,严禁用于商业目的。 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨。

0.写在前篇

本系列文章来自于博通公司相关项目开发中的学习资料和开发总结,是企业或者公司项目开发过程中必备的网络相关知识,主要涉及到ecos和linux系统编译、内存管理、接口管理、HAL抽象层、以及IPV6、DHCP、TR069等网络相关协议。为维护版权和相关知识产权,请购买官方SDK和相关服务,此系列文章仅为个人学习使用,如有不妥之处和技术相关知识,请私信留言!
博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译
博通Broadcom SDK源码学习与开发2——Bootloader功能和编译过程
博通Broadcom SDK源码学习与开发3——Cable Modem Docsis3.0
博通Broadcom SDK源码学习与开发4——ECOS系统数据流
博通Broadcom SDK源码学习与开发5——ECOS系统层剖析
博通Broadcom SDK源码学习与开发6——支持Linux系统
博通Broadcom SDK源码学习与开发7——HAL硬件抽象层分析
博通Broadcom SDK源码学习与开发8——内存与参数管理
博通Broadcom SDK源码学习与开发9——Interface接口管理
博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址
博通Broadcom SDK源码学习与开发11——Cable Modem DHCP管理
博通Broadcom SDK源码学习与开发12终结篇——TR069网管协议

1. Flash布局

bcm3383的flash一共是32M大小,可以存储两个5.xM的CM img和一个8M的Linux img(kernel+fs),还有其他的一些配置信息和bootloader。
flash_layout

2. Linux启动

3383的芯片具有同时支持双系统同时运行(eCos和Linux),然后使用进行沟通协作完成相应的功能。

在两个同时运行的系统中,eCos实现了大部分的功能,仅仅有小部分的功能通过控制Linux来完成,比如usb。

使用make pktc_ver=15 bfc_opts=”linux_on_pmc remoteflash“编译生成的eCos,在启动过程中,会检查是否有linux的kernel存在。如果是,则解压缩linux的img后,启动linux 通过BootLinux函数来启动linux,调用序列:

BcmBfcSystem::Initialize
                    \__BcmBfcTarget::InitTarget
                                           \__BcmBfcStdEmbeddedTarget::InitTargetImpl
                                                                                 \__BootLinux

BootLinux会经过以下步骤:
检查img是否有效
获取img的头文件信息
设置linux的mac addr
配置一些pmc ctrol的信息
启动linux
启动Linux过程

3. 通信机制

eCos系统启动linux以后,eCos可以发送指令对linux进行控制,主要的功能有:
(1) 发送指令给linux完成usb的mount工作。使用linux最主要的功能就是usb,samba等的功能。
(2) shutdown,reboot linux。
(3) 修改linux的root的password。

根据功能需求,自然会需要相应的通信机制的支持。目前的通信机制有:
(1) socket通信。通过socket发送给Linux的UDP server来mount usb
(2) 中断机制。eCos和Linux各自都注册有ISR,通过发送中断来调用ISR进行配置
(3) 共享内存。eCos和Linux系统运行在一个cpu芯片上,使用同一个内存。通过使用某特定的内存空间实现数据共享通信。

3.1 共享内存通信

eCos和Linux系统共用同一块128M的SDRAM,其中单独预留了512Bytes大小的空间用来发送消息。
共享内存机制
在通信中,共享内存是最简单的一种方式。
(1) eCos负责写入信息到固定的内存空间。
(2) Linux进程会定时使用ioctl的private命令去检查共享内存区域是否有信息
(3) 进程获取信息后进行一些具体的操作。比如修改passwd

3.2 中断通信

在eCos和Linux中各自都注册有ISR,在运行时候通过往某一个固定内存地址进行写入动作,然后会触发中断
ISR使用同一中断线,通过获取到中断内存中的int值,来区分不同的中断。
中断内存地址
在系统编译阶段,这个内存地址就已经是固定的:
eCos中代码如下:

#if BCM3380                                                                                                   
#define ITC_INBOX_REG_ADDRESS 0xb4610000                                                                      
#define ITC_OUTBOX_REG_ADDRESS 0xb4610004                                                                     
#else                                                                                                         
#define ITC_INBOX_REG_ADDRESS 0xb3e0102c                                                                      
#define ITC_OUTBOX_REG_ADDRESS 0xb3e01028                                                                                                    
#endif 

Linux代码如下:

#define INTERRUPT_ID_VFLASH INTERRUPT_ID_DQM_IRQ
#define ITC_OUTBOX_REG_ADDRESS 0xb600102c   

3.2.1 中断通信机制使用

首先需要注册ISR来负责处理对方发出的中断信息,.然后各自往中断地址写入信息。
(1)eCos注册ISR(ItcIsr)的过程:

BcmBfcSystem::Initialize
                    \__BcmBfcTarget::InitTarget
                                           \__BcmBfcStdEmbeddedTarget::InitTargetImpl
                                                                                 \__BoardHalInit
                                                                                           \__DoItcInit
                                                                                                  \__BcmHalMapInterrupt(ItcIsr, intId)

(2)Linux中注册ISR(bcmvenet_cmd_isr)的过程

bcmvenet_module_init
           \__bcmvenet_init_dev
                        \__BcmHalMapInterrupt((FN_HANDLER)bcmvenet_cmd_isr, (unsigned int)pDevCtrl, pDevCtrl->cmdIrq)

3.2.2 中断通信机制举例

中断类型
比较典型的就是eCos使用shutdown命令来关闭Linux。
(1) 在eCos console中下达shutdown linux后,会给某内存中写入相应的shutdown指令–某int型数据,同时产生中断。然后等待在ItcWaitHaltSem信号量上
(2) Linux接受到中断后调用ISR,bcmvenet_cmd_isr()函数根据从内存中获取的指令数据,进行特定响应,–根据启动时候传入的current信息,给/bin/rmtshutdown发送SIGINT,会触发关机动作
(3) 同时发送回复信息给eCos,同时会产生中断
(4) eCos根据中断调用ISR,ItcIsr获取回复的信息,释放ItcWaitHaltSem信号量
(5) console完成相应的动作
流程如下:
中断shutdown举例

4. socket通信

在通信中,usb的mount动作会通过socket进行通信。 eCos在获取Linux的IP后,使用socket往Linux的ip的某一固定端口发送socket数据。 Linux侦听在端口,一有数据后就进行分析处理,然后返回eCos一个应答消息通信流程:
socket通信

5. 共享内存机制

eCos中共享的内存空间有512Byte可以用来通信,目前passwd,macaddr设置使用了128*2Bytes,剩下的256Bytes还没有使用 可以有两种扩展方式:
(1) 使用剩下的256Bytes来进行通信,如此的共享方式有限制性,只能提供少量的通信方式
(2) 通过对共享内存中的数据进行标记,来达到同一共享内存的复用

6. 小结(几类通信机制比较)

共享内存:
利: 机制实现简单,系统刚启动时候也可以使用
弊: 扩展空间有限,响应不及时
中断机制:
利: 相应迅速,扩展相对容易
弊: ISR处理需要关闭中断,对ISR处理程序的实时性要求高
socket通信:
利: 扩展,实现方便,相应速度相对比较快捷
弊: -
综合而言:
系统初始化时候,简单的通信方式可以使用共享内存
实时性要求高的通信方式应该使用中断
其他考虑使用socket通信。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kcyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值