网络嵌入式设备

这不是什么新鲜东西,无线路由器很早前就开始使用了,不过最近才慢慢理解其原理。现在网络嵌入式设备的功能越来越强大了,各芯片厂商的解决方法支持着这种复杂性。最近公司实习,做一个家庭网关的项目。下面的内容应该不算泄密吧,写得随意一点。

1.一个网络芯片架构

大家应该看得出来,这是一个DSL芯片。其网络部分由一个switch core构成核心,对外有3个交换口(粉红色的):左侧为以太网MAC,可外接以太网芯片MAC或PHY,称为LAN端;右侧为DSL的TPS子层,按照DSL标准传输ATM/PTM数据,成为WAN端;上面的是一个PDMA片级总线,与片上系统SoC通信。

另外还有几个额外的交换口,服务器空间,主要是提供额外功能的:一个QDMA用于扩展core外Mem;LTR和WTR是两个转换引擎,当LAN或WAN端的数据包需要一些特殊处理时(如VLAN、PPPOE头等),会被分别交换到这两个口进行转换后,再发回Queue中。再另外,LAN、WAN端各有一个classifier,是预分类器,在数据包进入switch core前,先进行一个粗略的划分,决定发往哪个端口。

以上的这些功能都市switch core独立完成的,SoC系统只需对其进行简单的配置、控制即可。所以SoC的新能并不需要太高(CPU大概是130MHz的)。注意,该switch core和一般以太网switch的区别,首先其端口类型就不同,所提供的功能也跟为复杂。

这里给出一个简单的以太网switch芯片的架构,如下图所示,其核心就是一个register集,对它们进行配置(内部EEPROM、或外部MDIO总线),可以实现port-VLAN、二层filter等功能。其结构相对简单,因为其所有端口都是以太网口。

用该芯片接在上述DSL芯片的LAN端,构成网络系统如下图所示:

以太网switch可以自主实现port-VLAN功能,并通过一个trunk口与switch core相连。而switch core有很好的vlan_tag classifier功能。另外WAN端实现了8个硬件通道PVCs,且switch core也能对它进行很好的classifier。综上,就可以实现所谓的port-mapping功能,只要一跟DSL接入线,就可在家庭里实现IPTV、Internet、可视电话等业务的分离。

注意,所有这些功能都是switch core自动完成的,网络数据包不需要进入SoC的协议栈,这和后面讲的一般的路由器是不同的。

2.嵌入式片上系统

2.1与外界的交互方式

这里的SoC系统主要功能有:与外界用户的交互,解析用户指令,配置系统。

解析指令对软件系统来说很简单,配置系统,前面也说了,主要是读写一些register,也很简单。关键就在于与外界用户交互。

很容易想到的一种方式是网络,SoC也连在switch core上,有自己的IP、MAC。当然它和switch core是片上bus相连的,通信时并不需要MAC,这里只是把自己伪装成一个通用的以太网设备,可以被switch core和外界PC识别。

要通信,当然就需要协议栈了,不过,这里的SoC系统不需要处理额外(正常通信)的数据,所以协议栈也选择简单的LWIP,如之前的博文所述。最常用的网络通信方式就http了,另外还有telent等。

呵呵,连接192.168.1.1实际就是去连接其内部的SoC,一般的交换机、路由器都是这样的,而不是什么端口。当我还是一个超级菜鸟时,这个问题困扰了好久,纠结。

另外,嵌入式系统中,还有一个最常用的交互方式是串口UART。UART是一个非常简单的I/O设备,它通过直接读写管脚的电平信号(串行的)来实现输入输出,没有任何额外的中断、控制等机制。虽然简单,不能用以实现复杂、可靠的功能,但用作嵌入式系统的调试方法却非常有效。

UART就像是嵌入式设备的键盘/显示器。它是一种非常简单的硬件资源,在它之上可以构建通用的I/O设备tty,在tty之上,就可以实现各种应用,如shell等。

硬件资源UART、虚拟层设备tty都是系统的资源,在Uc/OS中,一般作为全局量,在其上的应用则通过task来完成。如XSHELL_TASK中,就是通过一个while(1)循环,不停地通过tty_get_line()读取命令行。注意,该函数已经不是裸的硬件操作了,而是加上了一个上层操作,即识别\r\n来作为结束符,也是通过一个while(1)循环来作的。读到电平为空,则忽略,因为UART太简单了,没有中断、缓存机制等(没有详细区考究,只是粗略地浏览了一下代码,好像是这样的吧!)。

最后,外界用户读写电平,当然不同用示波器了。呵呵,PC上装个串口驱动,那么PC的键盘/显示器就为嵌入式板子所用啦。

2.2bootloader

这就像一个心结,你一天不理解它,就一天不能安心地开发嵌入式系统,尽管你可以把软件写得很出色。

传统的PC机上电后,cpu核的指令指针(如cs:ip)会指向系统内某段固化的代码,如BIOS,这些代码被烧录在rom存储器中,断电也不会丢失。它们会调用我们开发的代码(如操作系统软件、或一些简单的前后台程序)。

一个嵌入式怎么启动,其实大意和PC(所有这种代码机器)差不多。当然不同厂商的芯片,也有各自的方式特点,香港服务器租用,以公司的这款芯片来说(注意,这里说的是芯片上集成的SoC子系统),它有好几种方式启动。

首先,其芯片内集成了一个BootRom,它里面的代码(也就是二进制的门电路)是在芯片的一部分,即芯片生产出来就有的。芯片对外有个引脚(boot-mode_pin),把它接低,则芯片上电后的ip指向该BootRom,执行里面的代码。这些代码很简单,一般会实现BOOTP、tffp等功能,从网络上下载OS的内核到内存中来运行。这就是所谓的网络无盘系统的工作方式。

不过现在好像这种方式用的少了,存储器便宜啊。一般都会把boot-mode_pin拉高,这样上电后ip指向外部flash。很容易想到flash和PC上的硬盘类似,是差不多,有点区别。PC上电后先执行BIOS,由BIOS装载硬盘的bootloader扇区。而嵌入式系统一般不这么麻烦,它直接就在flash中运行这些代码。

现在的cpu-core一般都是32位的,即有4G物理寻址空间,而嵌入式的SDRAM并不要那么大,所有可以把外部flash和SDRAM一起编址:

系统上电后,ip指向2G处,则可以直接在flash运行初始的代码,只是速率比较慢,所以开始的代码往往是把后面的一个image下载到SDRAM中去,然后在SDRAM中运行。

走走停停,不要害怕错过什么,

网络嵌入式设备

相关文章:

你感兴趣的文章:

标签云: