本节主要介绍串行SPIflash驱动的移植。eCos中,flash支持比较健全,移植flash驱动也不是件难事。虽然这么suse linux 下载,在本次移植spi插口flash时,还是遇见了一些意外问题,但是正是因为这个意外问题,让我解决了在移植STM32ADC驱动时碰到的一个棘手问题:
只要我在eCos图形配置工具中打开了ADC的任何一个通道,则不能生成正常的bin格式映像文件(生成的bin文件超大,大小达到了不可思议的1.2GB大小,但可生成正常的srec格式映像文件);若果不打开ADC任何一个通道,则可以输出正常的bin格式文件。其实这个问题旁边用暴力解决了,但问题缘由没有厘清楚,所以仍然悬在心中。
选择SPIflash驱动模板
最新eCos代码支持3种系列类型SPIflash,分别是:at25dfxxx、m2525pxx和sst25xx。为简化移植,按照使用的SPIFLASH芯片,从这3个系列中选择一个在命令、SPI时序、存储结构等参数上比较接近的SPIFLASH驱动作为模板,之后在此基础上进行更改。我板子上使用的SPIFLASH为MX25L1606E,16Mbits大小,它与m2525pxx系列特别接近,如右图所示。故选用m2525pxxSPIFLASH驱动作为模板linux 9x25 spi驱动移植,在此基础上进行一些简单更改。
驱动模板更改
MX25L1606E与m2525pxxSPIFLASH存在的区别:
针对里面的区别,更改m25pxx.c文件:
更改Sectorerase命令的定义北京linux培训,即更改宏M25PXX_CMD_SE对应的值为0x20:
typedef enum m25pxx_cmd { M25PXX_CMD_WREN = 0x06, // Write enable. M25PXX_CMD_WDRI = 0x04, // Write disable. M25PXX_CMD_RDID = 0x9F, // Read identification. M25PXX_CMD_RDSR = 0x05, // Read status register. M25PXX_CMD_WRSR = 0x01, // Write status register. M25PXX_CMD_READ = 0x03, // Read data. M25PXX_CMD_FREAD = 0x0B, // Read data (fast transaction). M25PXX_CMD_PP = 0x02, // Page program. M25PXX_CMD_SE = 0x20, //0xD8, // Sector erase. // Modified for MX25L1606E by reille 2013.05.26 M25PXX_CMD_BE = 0xC7, // Bulk erase. M25PXX_CMD_RES = 0xAB, // Read electronic signature. } m25pxx_cmd;
更改flash对应的每位sector包含的page数目、总sector数以及jedecid,即更改m25pxx_supported_devices数据中对应flash大小的flash参数:
{ // Support for Numonyx 16 MBit devices. sector_size : 16, // 256, // Modified for MX25L1606E by reille 2013.05.26 sector_count : 512, // 32, // Modified for MX25L1606E by reille 2013.05.26 jedec_id : 0x00C22015, // 0x00202015 // Modified for MX25L1606E by reille 2013.05.26 },
添加flash驱动实例
里面只是完成了SPIFLASH驱动,只有驱动是不行的,还要在target模板中构建一个SPIFLASH驱动实例。
打开ecos/packages/hal/cortexm/stm32/stm32f10xxx/current/src/stm32f0xxx_flash.c文件(stm3232ff1010xxx是我使用的target,所以实际中要更改为你使用的target),在这个文件中添加一个SPIFLASH驱动实例:
// Add SPI FLASH | added by reille 2013.05.26 #ifdef CYGPKG_DEVS_FLASH_SPI_M25PXX #include //----------------------------------------------------------------------------- // Set up the SPI intertface on the ST STM32F10XXX board for the STM32. The // M25PXX device is connected to SPI bus 1. SPI1 should be set up in configtool // so that chip select 1 corresponds to GPIO number 18 (PB2) and 50MHz I/O is // enabled. If the data area is in external RAM, SPI1 must be configured with // bounce buffers of at least 256 bytes and the M25PXX read data block size // should be set to the same size as the bounce buffers. #ifdef CYGPKG_HAL_CORTEXM_STM32_STM32F10XXX #include CYG_DEVS_SPI_CORTEXM_STM32_DEVICE ( m25pxx_spi_device, 1, 0, false, 0, 0, 25000000, 1, 1, 1 ); #endif //----------------------------------------------------------------------------- // Instantiate the M25Pxx device driver. CYG_DEVS_FLASH_SPI_M25PXX_DRIVER ( m25pxx_flash_device, 0x65000000, &m25pxx_spi_device ); #endif /* CYGPKG_DEVS_FLASH_SPI_M25PXX */
非常注意里面的英语注释,这个须要使用图形配置工具配置相应的参数,见下边所述。
另外,在stm32f0xxx_flash.c文件,我们可以看见,这儿还定义了NORFLASH实例。
STM32SPI驱动和SPIFLASH驱动配置
依据添加驱动实例时的注释信息,当程序在外部RAM中运行时,须要配置STM32SPI驱动的Bouncebuffersize和SPIFLASH驱动的Maximumreadblocksize,如右图所示:
上述弄好后,重新编译得到映像文件。
生成bin格式映像文件问题
十分奇怪,这时生成的bin格式映像文件异常,大小只有4KB大小linux 9x25 spi驱动移植,这让我联想到了先前移植STM32ADC驱动出现的问题,详见:stm32移植ecos#17,ADC驱动和应用编程(上)和stm32移植ecos#18,ADC驱动和应用编程(下)。
为解决这个问题,当初花了不少时间,但都没能解决。本次,还写了一封E-mail到eCos的discuss电邮列表,寻求帮助,遗憾的是,没有人给我解答。不得以,自己想办法解决它,但是也解决了,请看下节。