DM9051_SPI网卡驱动于EC200T 4G模块有线网口驱动添加指导
目录
前言…………………………………………………………………………………………………3
应用简介…………………………………………………………………………………………… 4
1.方案介绍
1-1.4G模块介绍 ……………………………………………………………………………………5
1-2. DM9051NP网卡芯片介绍…………………………………………………………………… 5
2.实验环境
2-1. 应用:Cat.4 ,4G监控摄像头……………………………………………………………… 6
2-2. Cat.1 +有线以太网口应用 …………………………………………………………………6
3.硬件部分
3-1 .硬件环境……………………………………………………………………………………… 7
4.软件部分 ………………………………………………………………………………………… 8
4-1.引言
4-2.DM9051NP驱动部分…………………………………………………………………………… 8
4-2-1. DM9051NP驱动源代码参考 ……………………………………………………………… 10
4-3设备树DTS (Device tree source) …………………………………………………………11
4-3-1.DTS实作 …………………………………………………………………………………… 12
4-4. DMA模式 ………………………………………………………………………………………13
5.固件烧入 ………………………………………………………………………………………… 16
6.测试
6-1局域网测试……………………………………………………………………………………… 18
6-2访问公网测试…………………………………………………………………………………… 19
6-3视频测试………………………………………………………………………………………… 20
前言
本文档介绍在M2M通信的应用-4G监控摄像头,于Cat4模块上,如何添加DM9051 SPI网卡驱动。而当红的Cat.1模块亦可依照本文操作方式加入。
应用简介
A:4G监控摄像头:此作法使用ASR1802的SPI接口来接收摄像头的录像数据,DM9051NP在这个应用上,相当于一个转接芯片,架构为:监控摄像头 DM9051NP—SPI接口--移远EC200T(ASR1802)。
B:由于4G模块的应用普及,不仅是Cat4,当前火热的Cat1在各行业的应用,如CPE、POS机、智能监控、环境管理或充电桩等,相关应用需要有线以太网口,将数据上传到远程后台,进行远程控制等,都可以采用此相同作法。
1.方案介绍
1-1. 4G模块介绍
此4G模块是上海移远通信EC200T,是一款LTE Cat 4 通信模块,支持最大下行速率150 Mbps和最大上行速率 50 Mbps,EC200T内置丰富的网络协议,集成多个工业标准接口,拓展了其在M2M(机器对机器)通信的应用范围,如安防监控摄像头、 OTT、CPE、路由器、数据卡、平板电脑以及工业级 PDA 等。
上海移远通信EC200T使用到上海翱捷科技ASR1802,ASR1802为所有竞品中系统最小,采用RTOS与Linux操作系统,采用ASR1802芯片的宽带MiFi终端已经销售到全球各运营商,并获得运营商认证,如中国CMCC,韩国SKK,日本,东南亚,印度Airtel,俄罗斯Beeline,非洲MTN等。
1-2. DM9051NP网卡芯片介绍
DM9051NP SPI接口网卡芯片是为了方便互联网行业进行以太网通信而开发出的解决方案。DM9051NP芯片是带有行业标准串列外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器。DM9051NP符合IEEE 802.3 规范,它还支持以DMA 模式來传输,以实现资料传送快速。DM9051NP通过1个中断引脚和SPI接口來进行与主控制器/MCU单片机的通信,资料传输规格为10/100 M。
•Package:32支接脚封装,QFN.
•IEEE 802.3az Energy Efficient Ethernet (EEE)
•Built-in integrated 3.3V to 1.8V regulator
•远程唤醒 (WOL)
•并行线/交叉线自动切换 (HP Auto-MDIX)
•Support 光口界面
•EMI (Class B) and HBM ESD Rating 8KV
• 工业温度规范: –40℃ to +85℃
• 连续工作温度<60℃
2.实验环境
2-1. 应用:Cat.4 ,4G监控摄像头:
硬件架构:摄像头ß à DM9051NP—SPI接口--移远EC200T(ASR1802) ß à 4G
2-2. Cat.1 +有线以太网口应用:
其他应用DM9051NP—SPI接口—ASR3601/春藤8910DM
3.硬件部分
3-1 .硬件环境
DM9051NP通过SPI接口控制内部寄存器,并有中断输出接口。EC200T(ASR1802)通过SPI1和DM9051NP相连。具体接口如下:
| DM9051NP | EC200T (ASR1802) |
SPI_CS | Pin17 | Pin37 |
SPI_MOSI | Pin19 | Pin38 |
SPI_MISO | Pin20 | Pin39 |
CPI_CLK | Pin18 | Pin40 |
INT | Pin24 | Pin18 |
3-2. SPI硬件接线部分
图一:EC200T(ASR1802)与DM9051NP SPI硬件设计
SPI信号线说明,通常SPI通过4个引脚与外部器件相连:
- MISO : 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
- MOSI : 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
- SCK : 串口时钟,作为主设备的输出,从设备的输入
- NSS : 从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
4.软件部分
4-1.引言
以DM9051在ASR1802 Linux上导入为例,在Linux核心添加 DM9051驱动,DM9051为SPI接口,需具体实现SPI传输功能,DM9051网络数据包送收程序,及依据SPI master特性而扩增的DMA传输模式设置。
因为要采用DTS与DMA模式,除了要进行DTS相关的设置之外,也对DM9051驱动加入DMA的相关参数,然后,再来挂载驱动。当驱动跑起来时,通过DTS取得组态设置参数,然后,让芯片正常运行。
4-2.DM9051NP驱动部分
将DM9051NP驱动压缩文件解压,然后将整个包放到ql-ol-sdk/ql-ol-crosstool/package目录下,然后在ql-ol-sdk/ql-ol-crosstool目录下make menuconfig;
图 3 menuconfig
路径:Kernel modules à SPI Support à kmod-ql_spi_net
以上步骤做完后,在ql-ol-sdk下make -j6 V=99,会在ql-ol-sdk/target目录下生成版本包,将版本包烧进模块,使用insmod /lib/modules/3.10.33/dm9051.ko 加载驱动即可。
加载成功后可看到如下所示
图 4 网卡驱动加载LOG
图 5 成功显示网卡
4-2-1. DM9051NP驱动源代码参考:
查看dm9051_init_dm9051函数, 相关内容如下:
iow(db, DM9051_GPCR, GPCR_GEP_CNTL); /* 让GPIO0输出*/
phy4= dm9051_phy_read(dev, 0, MII_ADVERTISE);
dm9051_phy_write(dev, 0, MII_ADVERTISE, phy4 | ADVERTISE_PAUSE_CAP);
/* dm95 flow-control RX! */
dm9051_phy_read(dev, 0, MII_ADVERTISE);
/* Program operating register */
iow(db, DM9051_TCR, 0); /* TX Polling clear清除TX轮询*/
iow(db, DM9051_BPTR, 0x3f); /* Less 3Kb, 200us */
iow(db, DM9051_SMCR, 0); /* Special Mode */
/* clear TX status清除TX状态 */
iow(db, DM9051_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END);
iow(db, DM9051_ISR, ISR_CLR_STATUS); /* Clear interrupt status清除中断状态 */
/* Init Driver variable */
db->imr_all = IMR_PAR | IMR_PRM; /* "| IMR_PTM" */
#ifdef JABBER_PACKET_SUPPORT
db->rcr_all= RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN |
RCR_DIS_WATCHDOG_TIMER;
#else
db->rcr_all= RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN;
#endif
/*
* (Set address filter table)
* After.call.ndo_open
* "kernel_call.ndo_set_multicast_list.later".
*/
dm9051_fifo_reset(1, NULL, db); // 'NULL' for reset FIFO, and no increase the RST counter
int_reg_stop(db);
……
>>> 欢迎交流!
4-3设备树DTS (Device tree source)
- 基本概念:在Linux內核源代碼中,存在大量對細節信息描述的代碼。這些代碼在/arch/arm/plat-xxx和/arch/arm/mach-xxx目錄,對內核而言,這些platform設備、resource、i2c_board_info、spi_board_info以及各種硬件的platform_data絕大多數属于垃圾冗长的代碼。為了解決這一問題,ARM內核版本3.x之後引入了原先在Power PC等其他體系架構已經使用的Flattened Device Tree.
- 在我们在进行DM9051NP驱动调试之前,要先进行DM9051NP 驱动的DTS参数设置,让CPU SPI master能够对应DM9051NP的设置,操作指南如下:
- DM9051NP驱动参数设置 : 依照开发者的需求,写入conf_ver.h来设置DM9051NP驱动(建议:只编辑conf_verh)
- 为了完善源代码架构,请在conf_verh添加下列函数:
#define DM_CONF_APPSRC
#define DM_CONF_DBGSRC
- #define DM_CONF_DTSSRC 創建一個软件模块(dm9051.ko),请在conf_verh添加下列函数:
- #define DM_CONF_MODULE 當對驅動进行设置时,添加DM_CONF_PHYPOLL是很重要的:
#define DM_CONF_PHYPOLL
- 当使用DTS设备树时,请在conf_verh添加下列函数
#define DTS_CONF_YES
说明:在你的DTS描述符中,请定义
1.)最高SPI时钟速度。
2.)中断模式与中断IRQ号。
3.)中断主动极性。
4.)SPI bus_num以及 SPI片选(有需要才设置)
- 如果不使用DTS的话,请改用下列方式,添加到_ver.h”:
*因为不使用DTS,请定义你的SPI时钟速度:
#define DM_CONF_MAX_SPEED_HZ 15600000
*因为不使用DTS,当使用中断模式时,亦需中断IRQ数字以及主动极性:
#define DM_CONF_INTERRUPT /*设定的中断号*/
#define DM_CONF_INTERRUPT_IRQ 26
#define DM_CONF_INTERRUPT_LOW_ACTIVE
*由于不使用DTS,请依照下列函数来定义SPI bus number。 如果没有定义的话,SPI bus number将为0。
#define DM_CONF_SPI_BUS_NUMBER 0
*由于不使用DTS,请依照下列函数来定义SPI片选。 如果没有定义的话,SPI bus number将为0。
#define DM_CONF_SPI_CHIP_SELECT 1
4-3-1.DTS实作
看完了DM9051NP 驱动的DTS参数设置指南之后,让我们来实作一下:
1.)配置SPI CLK:
在ql-ol-sdk/ql-ol-uboot/board/Marvell/nezas_p201/nezas_p201.c文件中配置SPI时钟,增加如下代码:
#ifdef CONFIG_ASR_SPI
#define APBC_PHYS_BASE (0xd4000000 + 0x015000)
#define APBC_SSP0 (APBC_PHYS_BASE + 0x01c)
#endif
图 1 SPI CLK配置
在ql-ol-sdk/ql-ol-uboot/board/Marvell/nezas_p201/nezas_p201.c文件中配置SPI时钟,增加如下代码:
代码如下:
#ifdef CONFIG_ASR_SPI
__raw_writel(0x17, APBC_SSP0);
mdelay(1);
__raw_writel(0x13, APBC_SSP0); //ssp0 @13M
/* bit[6:4] of APBC_SSP0
* 0x0 = 6.5MHz
* 0x1 = 13MHz
* 0x2 = 26MHz
*/
#endif
图 2 SPI CLK配置
注意: __raw_writel(0x17, APBC_SSP0); 和 __raw_writel(0x13, APBC_SSP0);中当前配置的SPI时钟是13M,如果要设置成26M,则将其中的0x17、0x13改成0x27和0x23。这里如不添加,则默认6.5M。
4-4. DMA模式
这是依据SPI master特性而扩增的应用,各家SOC芯片供货商的实现方式可能略有不同.如何开启DM9051 DMA模式来接收与发送数据? 请先在CPU开启DMA模式,然后DM9051驱动做对应的设置。
1.)请查看dm9051_probe函数, 内容如下:
SubNetwork_SPI_Init(db, 1);
2.)再查看SubNetwork_SPI_Init函数, 内容如下:
SPI_GPIO_SetupPwrOn(db);
SPI_GPIO_Setup(db); //mt_dm9051_pinctrl_init(db->spidev); //or, SPI_GPIO_Set(1);
SPI_SPI_Setup(db);
3.)再查看SPI_SPI_Setup函数, 内容如下:
SPI_PARAM_Set(db);
#if DM_DM_CONF_RARE_PROJECTS_DTS_USAGE
/*当处于DTS模式时,请在DTS文件中定义SPI最高速度是多少*/
#else
db->spidev->max_speed_hz= dm9051_spi_board_devs[0].max_speed_hz;
#endif
#if DM_DM_CONF_RARE_PROJECTS_DTS_USAGE
/*当处于DTS模式时,请在DTS文件中定义SPI最高速度是多少*/
#else
db->spidev->mode = SPI_MODE_0;
db->spidev->bits_per_word = 8;
printk("%s Driver spi_setup()\n", CARDNAME_9051);
if(spi_setup(db->spidev)){
printk("[dm95_spi] spi_setup fail\n");
return;
}
#endif
4.)再查看SPI_PARAM_Set函数, 内容如下:
struct mt_chip_conf *spi_par = (struct mt_chip_conf *) db->spidev->controller_data;
if(!spi_par){
printk("[dm95_spi] spi config fail");
return;
}
spi_par->setuptime = 15;
spi_par->holdtime = 15;
spi_par->high_time = 10;
spi_par->low_time = 10;
spi_par->cs_idletime = 20;
spi_par->rx_mlsb = 1;
spi_par->tx_mlsb = 1;
spi_par->tx_endian = 0;
spi_par->rx_endian = 0;
spi_par->cpol = 0;
spi_par->cpha = 0;
#if DMA3_P2_MSEL_MOD
spi_par->com_mod = DMA_TRANSFER;
#else
spi_par->com_mod = FIFO_TRANSFER;
#endif
spi_par->pause = 0;
spi_par->finish_intr = 1;
spi_par->deassert = 0;
……
>>>欢迎交流!
5.固件烧入
当完成驱动挂载后,即完成一个固件,接下来介绍刻录固件的过程:
1.)硬件环境
2)
USB烧录即可。
6-1局域网测试
使用iperf测试即可:如下图所示
6-2访问公网测试
图 8 公网测试
6-3视频测试
1080P 20帧:
需要相关资料请联系我:qq 441635295