tag 标签: 移植

相关帖子
相关博文
  • 热度 1
    2015-1-14 16:45
    319 次阅读|
    0 个评论
    今天继续为大家介绍以太网芯片W3100A到W3150A+的移植过程中需要注意的问题,以及W3100A与W3150A+间的比较。 2.6.1 功能兼容寄存器 表3 为兼容寄存器。在两芯片组中这些功能兼容的寄存器可能有不同的偏移地址和名字。 表3 功能兼容寄存器 2.6.2 功能不同的寄存器 IR: 表4. W3100A和W3150A+ 的IR之间的比较 从W3100A到W3150A+移植过程中,无论WIZnet芯片是否接收数据位7~4 都不能使用。 位7~4的功能已经由Sn_IR(0~3)的第二位代替。 IMR: 表5. W3100A和W3150A+ IMR之间的比较 W3150A+的IMR寄存器中,不管WIZnet芯片是否接收数据,位7~4不能用于禁用中断。 Cn_CR/Sn_CR: 表 6. W3100A  和 W3150A+ 之间的命令寄存器比较 另外,W3150A+ 增加了一些新的命令:DISCON/SEND_MAC/SEND_KEEP. 如果用户对这些命令感兴趣,请参考W3150A+数据手册中的Sn_CR描述。 Cn_ISR/Sn_IR: 表 7. W3100A 和 W3150A+ 的 Socket 终端寄存器之间的比较 Bit Recv_OK 只是指示的Recv command命令完成的表达。它不指示着WIZnet芯片是否已经收到数据。RECV才是WIZnet芯片收到数据与否的标志。 Bit Established被重命名为CON。 Bit Closed 被重命名并升级为DISCON。 IDM_OR/MR: 表8. W3100A和W3150A+ 的模式寄存器之间的比较 Bit IND_EN 被重命名为IND,而且被放在了在MR寄存器的第0位. Bit L/B被移除。W3150A+只支持 big-endian. 因此,如果用户使用little-endian来访问间接寄存器,它们必须在W3100A到W3150A+移植过程中使用big-endian。 Bit AUTO_INC 被重命名为AI,并放在MR寄存器的bit1. Cn_TW_PR/Sn_TX_WR: 大小: 大小:Cn_TA_PR 是一个4-byte寄存器, Sn_TX_RD 是一个2-byte寄存器。 功能:无变化;请参见图4. 图4. TCP传输过程中的指针管理 Cn_RW_PR/Sn_RX_WR: 大小:Cn_RW_PR 是一个4-byte寄存器, Sn_RX_WR是一个2-byte寄存器。 功能:无变化。 Cn_RR_PR/Sn_RX_RD: 大小:Cn_RR_PR 是一个4-byte寄存器, Sn_RX_RD是一个2-byte寄存器。 功能:无变化。 继续阅读:http://www.iwiznet.cn/blog/?p=6784
  • 热度 1
    2015-1-13 15:17
    379 次阅读|
    0 个评论
    最近很多用户咨询 W3100A,由于W3100A已经停产。在此希望给大家介绍一下,W3100A可移植到其他芯片的方式及途径,供大家更好的拓展您项目的沿用性,期待能对您有所帮助。今天先为大家介绍第一部分的内容。 此移植笔记描述了设计者及程序员应在 W3100A到W3150A+的移植 过程中注意的问题。更多关于W3150A+的信息,请参考W3150A+数据手册。 1 对比 1.1 移植的优势及挑战 这部分强调了W3100A到W3150A+过程中涉及的多方面优势及问题。在维持很多W3100A的特性方面,W3150A+提供了更高级别的性能。下面是移植到W3150A+的优势: 性价比更高 更高级别的集成度 增加TX 空闲大小寄存器 及RX已接收大小寄存器。用户可以直接读取,不再需要计算其值。 TCPSeq和ACK码是自动处理的。用户不再需要计算其值。 新功能(PPPoE/IGMP/SPI接口/心跳包 等) 使用标准的驱动库便于未来移植W5100需要。W3150A+ 和W5100的驱动库完全兼容。因此,用户在从W3150A+到W5100移植过程中不需要考虑固件变化。 下面列出了一些差异,可能在W3100A到W3150A+移植过程中带来问题: 引脚分配不同。见第二部分,“硬件注意事项”。 库移植。W3100A和W3150A+驱动库之间有一定的差异,见第三部分“软件注意事项”。 1.2 总结和及特征比较表 表1 W3100A和W3150A+比较 2  硬件注意事项 2.1 电压 都为3.3V。 2.2 TCP/IP 核 两款芯片都使用了WIZnet全球唯一的硬件IPv4核。然而,W3150A+内核有所更新并且弥补了W3100A勘误及缺陷”中的弱点,“W3100A勘误及缺陷”中。使用可以点击如下链接: http://www.wiznet.co.kr/UpLoad_Files/ReferenceFiles/W3100A_errata_limitation_list1 .pdf 2.3 封装及引脚分布 a)  两个芯片都是LQPF64 b)  引脚分布: 图1 展示了W3100A和W3150A+的引脚分布。 图1 移植W3100A到W3150A+时引脚分配注意事项 “         ”意为“移除功能” “√” 意为“不变” “-+注释” 意为“替代部分” 在W3150A+的引脚分配中,引脚28,37,和57 是1.8 v电源有关引脚。请参见图2 图2.  1.8v电源输入下的参考电路图 2.4  接口 2.4.1 主机接口 W3100A 支持 MCU总线接口 和 I2C接口, 然而W3150A+ 支持MCU 总线接口 和SPI接口。 因此,如果你之前使用I2C接口通信,现在你可以使用你的主MCU的SPI接W3150A+。SPI是一个4线接口,如今已非常易用普遍。SPI接口也可以通过GPIO模拟出来。如果你使用MCU 总线接口,除了几个硬件的修改,剩下的工作只是非常简单的驱动移植。见表2. 表2 主接口注意事项 2.4.2 MII接口 W3100A支持两种MII。一种是串行MII,另一种是半位元MII;但是W3150A+仅支持半位元MII。因此,如果你目前使用的是串行MII模式,你就要调整你的PHY芯片为半位元类型。另外,W3150A+有两个独立引脚:RXDV和CRS。用户应连接引脚RXDV(No.44)与引脚RXDV(PHY芯片端)连接,以及引脚CRS(No.47)与引脚CRS(PHY芯片端)连接。 2.5  系统特征 2.5.1 时钟 W3100A 有两个时钟引脚(4号引脚及33号引脚。但是W3150A+移除了外部时钟模式。因此,W3150A+只有一个时钟来源:25MHz(No.35 引脚)。 2.5.2 系统重启 两个芯片都支持 硬件和软件重启。 硬件重启信号,W3100A 是高点平有效,但W3150A+是低电平有效 软件重启,都是通过在指定的寄存器中写“1”到第7位,来实现此功能。 W3100A是在C0_CR寄存器中(偏移地址0×00)。W3150A+是在MR寄存器中(偏移地址0×00)。 2.5.3 寄存器读/写定时 W3100A包括直接间接模式的话支持6种MCU 总线接口模式,然而W3150A+只支持2种MCU总线接口模式。既然这样,读写时序就有着巨大的不同。 从W3100A到W3150A+移植时,用户应该使用W3150A+ 的时序。更多信息请参见W3150A+的数据手册:7.4.2 寄存器/内存读时序寄存器/内存写时序。 2.5.4 Tx/Rx 缓存 两个芯片都有16Kbytes 的Tx/Rx 缓存。因此,不用考虑在移植中的缓存限制。 2.6 寄存器地址映射 W3100A 由一个控制寄存器,指针寄存器,系统寄存器,信道寄存器和 Tx/Rx缓存组成,然而,W3150A+由一个通用寄存器,Socket寄存器和Tx/Rx缓存组成。 图3. 为W3100A和W3150A+ 的寄存器映射 图3. W3100A和W3150A+的寄存器映射
  • 热度 3
    2014-11-19 11:29
    1201 次阅读|
    0 个评论
    文章来源:http://www.embed-net.com/thread-55-1-1.html (此论坛为一个WIZnet用户开设的,论坛积累了大量的W5500相关应用及例程,具有很大的参考价值。) 官方提供了W5500的最新驱动库,下载地址如下: http://wizwiki.net/wiki/doku.php?id=products:w5500:driver 下面简单介绍下如何使用这套库 首先下载库源码,文件目录如下所示: 我们主要用到Ethernet文件夹下面的文件,将这些文件加入到自己的工程中,然后编译,若编译出现类似于如下错误 ..\User\Ethernet\wizchip_conf.c(113): error:  #29: expected an expression .id                  = _WIZCHIP_ID_, ..\User\Ethernet\wizchip_conf.c(114): error:  #29: expected an expression .if_mode             = _WIZCHIP_IO_MODE_, ..\User\Ethernet\wizchip_conf.c(115): error:  #29: expected an expression .CRIS._enter         = wizchip_cris_enter, ..\User\Ethernet\wizchip_conf.c(116): error:  #29: expected an expression .CRIS._exit          = wizchip_cris_exit, ..\User\Ethernet\wizchip_conf.c(117): error:  #29: expected an expression .CS._select          = wizchip_cs_select, ..\User\Ethernet\wizchip_conf.c(118): error:  #29: expected an expression .CS._deselect        = wizchip_cs_deselect, ..\User\Ethernet\wizchip_conf.c(119): error:  #29: expected an expression .IF.BUS._read_byte   = wizchip_bus_readbyte, ..\User\Ethernet\wizchip_conf.c(120): error:  #29: expected an expression .IF.BUS._write_byte  = wizchip_bus_writebyte ..\User\Ethernet\wizchip_conf.c(123): warning:  #12-D: parsing restarts here after previous syntax error }; ..\User\Ethernet\wizchip_conf.c: 1 warning, 8 errors 则需要根据自己的编译器做下设置,keil MDK设置如下所示: 主要原因是Keil MDK默认设置不支持按照结构体名称初始化结构体的原因导致。 W5500和MCU是通过SPI接口通信的,库是利用如下结构体中的相关函数指针实现SPI通信和其他功能。 _WIZCHIP WIZCHIP = { .id = _WIZCHIP_ID_, .if_mode = _WIZCHIP_IO_MODE_, .CRIS._enter = wizchip_cris_enter, .CRIS._exit = wizchip_cris_exit, .CS._select = wizchip_cs_select, .CS._deselect = wizchip_cs_deselect, .IF.BUS._read_byte = wizchip_bus_readbyte, .IF.BUS._write_byte = wizchip_bus_writebyte // .IF.SPI._read_byte = wizchip_spi_readbyte, // .IF.SPI._write_byte = wizchip_spi_writebyte }; 根据函数名字和库中的注释,我们这里也对要实现的函数做个简单的说明 wizchip_cris_enter :进入临界区的函数,可以不管 wizchip_cris_exit :退出临界区的函数,也可以不管 wizchip_cs_select :输出有效片选信号的函数,也就是控制CS输出低电平的函数,必须实现 wizchip_cs_deselect :控制CS输出高电平的函数,必须实现 wizchip_bus_readbyte :SPI总线读取一字节数据函数,必须实现 wizchip_bus_writebyte :SPI总线写一字节数据函数,必须实现 根据以上可知,只要实现了SPI的基本操作,移植基本完成,是不是很简单 下面我们就新建一个spi.c的文件来实现这几个函数,当然这些函数名字可以不和这个结构体里面的函数名字一样,到时候可以调用相关的函数注册下即可 /**    ******************************************************************************    * @file    spi.c    * $Author: 飞鸿踏雪 $    * $Revision: 17 $    * $Date:: 2014-10-25 11:16:48 +0800 #$    * @brief   SPI驱动函数实现.    ******************************************************************************    * @attention    *    *h3center© Copyright 2009-2012, EmbedNet/center    *center http://www.embed-net.com /center    *centerAll Rights Reserved/center/h3    *    ********************************************************   继续阅读:http://www.iwiznet.cn/blog/?p=6630
  • 热度 1
    2013-10-10 00:42
    3073 次阅读|
    0 个评论
      移植过程基于 STM32 标准外设库,在库内提供的例程基础上,将 FreeRTOS 移植进去。     相关资源:   1.STM32 标准外设库 V3.5.0 ( 直接下载地址 http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stsw-stm32054.zip )。   2.FreeRTOS V7.5.2 ( 直接下载地址 http://jaist.dl.sourceforge.net/project/freertos/FreeRTOS/V7.5.2/FreeRTOSV7.5.2.zip )。   3.FreeRTOS Real Time Kernel (RTOS) 最新版本下载地址( http://sourceforge.net/projects/freertos/files/ )。   4.STM32F10x standard peripheral library 最新相关信息地址( http://www.st.com/web/cn/catalog/tools/FM147/CL1794/SC961/SS1743/PF257890 )。     移植过程:   以下以 STM32F103VCT6 为例进行移植,其他型号类似。   解压 FreeRTOS,打开关于 STM32F103 的例程(Keil版本),目录“..\FreeRTOSV7.5.2\FreeRTOS\Demo\CORTEX_STM32F103_Keil”。   解压 STM32 标准外设库,进入工程模板目录“..\STM32F10x_StdPeriph_Lib_V3.5.0\Project”,复制“STM32F10x_StdPeriph_Template”并根据项目重命名。进入目录“..\STM32F10x_StdPeriph_Lib_V3.5.0\Project\ProjectRoot\MDK-ARM” 下打开工程文件,对应STM32F103VCT6,选择“STM3210E-EVAL”。   目录“..\STM32F10x_StdPeriph_Lib_V3.5.0\Project\ProjectRoot\” (以下用..\ProjectRoot\表示)下新建“FreeRTOS”文件夹,拷贝Source(直接copy FreeRTOS源码Source目录)、Common(直接copy FreeRTOS源码\demo\Common目录)到”..\ProjectRoot\FreeRTOS\”下。   在Source/portable目录下,保留RVDS和MemMang目录,其余删除。复制 FreeRTOS目录\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h 到 ..\ProjectRoot\ 下。   在 MDK-ARM 中进行设置: Target options -Device中,选择STM32F103VC。 Target options - C/C++ 中 Preprocessor Symbols 中 Include path 设定头文件路径: ..\ ..\..\..\Libraries\CMSIS\CM3\CoreSupport ..\..\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x ..\..\..\Libraries\STM32F10x_StdPeriph_Driver\inc ..\..\..\Utilities\STM32_EVAL ..\..\..\Utilities\STM32_EVAL\Common ..\..\..\Utilities\STM32_EVAL\STM3210E_EVAL ..\FreeRTOS\Source\include ..\FreeRTOS\Source\portable\RVDS\ARM_CM3 ..\FreeRTOS\Common\include   复制 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_hd.s 至 ..\ProjectRoot\ 。若使用其他容量器件,请自行选择对应的startup files。   参照 FreeRTOS 中的 STM32F10x.s 修改startup_stm32f10x_hd.s 在 __heap_limit 区段添加: IMPORT xPortPendSVHandler IMPORT xPortSysTickHandler IMPORT vPortSVCHandler ;IMPORT vUARTInterruptHandler ;IMPORT vTimer2IntHandler 后两个不要添加,因为这不是 FreeRTOS 核心代码,是他demo用到的。   __Vectors区段中断向量表,将SVCall Handler、PendSV_Handler、SysTick Handler更名,改由 RTOS 管理,这样 stm32f10x_it.c 就不会影响到这三个中断。后面相应的中断入口地址需要更改 DCD     vPortSVCHandler           ; SVCall Handler ... DCD     xPortPendSVHandler        ; PendSV Handler DCD     xPortSysTickHandler       ; SysTick Handler 两者还有一点小小的不同,复位时进入main函数之前的那段代码,新版本外设库的启动代码中,在进入main()函数之前执行函数SystemInit()初始化了时钟,这个根据目标板不同,注意此段代码。   使用修改后的 startup_stm32f10x_hd.s 替换MDK-ARM组下的同名文件。参照 FreeRTOS 例程在 STM32 的外设库例程中加入 FreeRTOS 组,并加入文件: tasks.c、list.c、queue.c、port.c、heap_2.c,截图如下。     至此,设定完成,修改 main.c 文件,内容如下。需根据使用的开发板修改相关外设设置。因为 FreeRTOS 使用 configTOTAL_HEAP_SIZE 为 0x4400,IRAM的 SIZE 需超过 0x4400(17K),所以选择STM32要注意RAM大小是否满足。 /* main.c */ /* Standard includes. */ #include stdio.h   /* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "misc.h"     /* Library includes. */ #include "stm32f10x_it.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_usart.h"   #define LED0_ON()   GPIO_ResetBits(GPIOA,GPIO_Pin_8); #define LED0_OFF()  GPIO_SetBits(GPIOA,GPIO_Pin_8); #define LED0B()     GPIOA-ODR ^= 0x0100;   #define LED1_ON()   GPIO_ResetBits(GPIOD,GPIO_Pin_2); #define LED1_OFF()  GPIO_SetBits(GPIOD,GPIO_Pin_2); #define LED1B()     GPIOD-ODR ^= 0x04;   static void prvSetupHardware( void );   /* Two demo Tasks*/       static void vLEDTask( void *pvParameters ); static void vCOMMTask( void *pvParameters );   void Led_Init(void); void Comm_Init(void);   int main( void ) {     prvSetupHardware();       xTaskCreate( vLEDTask, ( signed portCHAR * ) "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL );     xTaskCreate( vCOMMTask, ( signed portCHAR * ) "COMM", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, NULL );       /* Start the scheduler. */     vTaskStartScheduler();             return 0; } /*-----------------------------------------------------------*/   void vLEDTask( void *pvParameters ) {     Led_Init();     LED0_ON();     LED1_OFF()       for( ;; )     {           LED0B();           LED1B();         vTaskDelay( 100 / portTICK_RATE_MS);     } }   void vCOMMTask( void *pvParameters ) {     Comm_Init();     for(;;)     {         USART_SendData(USART1, '@');         vTaskDelay(1000 / portTICK_RATE_MS);     } } /*-----------------------------------------------------------*/   static void prvSetupHardware( void ) {     SystemInit(); } /*-----------------------------------------------------------*/   void Led_Init(void) {     GPIO_InitTypeDef GPIO_InitStructure;         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE );       /*LED0 @ PA8*/     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     GPIO_Init( GPIOA, GPIO_InitStructure );          /*LED0 @ PD2*/     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     GPIO_Init( GPIOD, GPIO_InitStructure );      }   void Comm_Init(void) {     USART_InitTypeDef USART_InitStructure;     GPIO_InitTypeDef GPIO_InitStructure;     NVIC_InitTypeDef NVIC_InitStructure;       RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        /*UART1 TX @ PA9*/     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     GPIO_Init( GPIOA, GPIO_InitStructure );            /*UART1 RX @ PA10*/     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     GPIO_Init( GPIOA, GPIO_InitStructure );           /*UART1 Cfg.*/     USART_InitStructure.USART_BaudRate = 57600;      USART_InitStructure.USART_WordLength = USART_WordLength_8b;     USART_InitStructure.USART_StopBits = USART_StopBits_1;     USART_InitStructure.USART_Parity = USART_Parity_No;      USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;     USART_Init(USART1, USART_InitStructure);     USART_ClearFlag(USART1, USART_FLAG_TC);       /*UART1 NIVC Cfg.*/     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     NVIC_Init(NVIC_InitStructure);       USART_Cmd(USART1, ENABLE); }
  • 热度 1
    2013-9-5 10:40
    440 次阅读|
    0 个评论
    1.问题:按照手册做文件系统移植的时候,在执行补丁/patch-ker.sh c /opt/../linux-2.6.30.4/ 后,显示如下: usage:  ./patch-ker.sh  c/l m/s kernelpath if c/l is c, then copy. If l then link if m/s is m, then use multi version code. If s then use single version code 但是在进入内核目录的fs/目录下,打开Makefile或config都没有添加yaffs2文件夹。 2.环境: 开发板:TQ2440 linux系统:fedora 10 3.解决:手册书写错误造成。改为:/patch-ker.sh c m /opt/../linux-2.6.30.4/ 您需要选择使用m 或者s。在命令中加入m就可以了。
相关资源
广告