|
flash的驱动是参考radio的SPIflash来写的。具体代码如下:
#include "board.h"
#include <rthw.h>
#include <rtthread.h>
/* FLASH DEVICE */
struct rt_sst39vf160x
{
/* inherit from device */
struct rt_device parent;
rt_uint32_t hw_base;
rt_uint32_t fat_sector_size;
rt_uint32_t fat_sector_num;
rt_uint32_t fat_block_size;
};
struct rt_sst39vf160x sst39vf160x_flash_device;
/* RT-Thread Device Driver Interface */
static rt_err_t sst39vf160x_flash_init(rt_device_t dev)
{
struct rt_sst39vf160x *sst_flash = (struct rt_sst39vf160x *)dev;
system_base = sst_flash -> hw_base;
if( Check_SST_39VF160X() )
{
return RT_EOK;
}
else
return RT_ERROR;
}
static rt_err_t sst39vf160x_flash_open(rt_device_t dev, rt_uint16_t oflag)
{
return RT_EOK;
}
static rt_err_t sst39vf160x_flash_close(rt_device_t dev)
{
return RT_EOK;
}
static rt_err_t sst39vf160x_flash_control(rt_device_t dev, rt_uint8_t cmd, void *args)
{
RT_ASSERT(dev != RT_NULL);
if( cmd == RT_DEVICE_CTRL_BLK_GETGEOME )
{
struct rt_device_blk_geometry *geometry;
geometry = (struct rt_device_blk_geometry *)args;
if (geometry == RT_NULL) return -RT_ERROR;
geometry->bytes_per_sector = 512;
geometry->sector_count = 4096;
geometry->block_size = 4096; /* block erase: 4k */
}
return RT_EOK;
}
// pos 扇区偏移
// buffer 8位缓冲区指针
// size 扇区数
static rt_size_t sst39vf160x_flash_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
{
rt_uint32_t index, nr;
rt_uint16_t p,data;
rt_uint8_t* pbuffer;
nr = size;
pbuffer = (rt_uint8_t *)buffer;
for (index = 0; index < nr; index++)
{
//read one sector 512bytes
for( p=0; p<256; p++)
{
data = *sysAddress( pos*256 + p ); //扇区偏移×扇区字数+扇区内偏移 一次读16位
*pbuffer++ = data&0x00FF;
*pbuffer++ = (data>>8)&0x00FF;
}
}
return size;
}
static rt_size_t sst39vf160x_flash_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
{
rt_uint32_t index, nr;
rt_uint16_t p,data;
rt_uint8_t* pbuffer;
nr = size;
pbuffer = (rt_uint8_t *)buffer;
for (index = 0; index < nr; index++)
{
//read one sector 512bytes
for( p=0; p<256; p++)
{
data = ( *pbuffer )|( *(pbuffer+1)<<8 );
pbuffer += 2;
if( !Program_One_Word ( &data, pos*256 + p)) //扇区偏移×扇区字数+扇区内偏移
return 0;
}
}
return size;
}
void rt_hw_sst39vf160x_init(void)
{
struct rt_sst39vf160x *sst_flash = (struct rt_sst39vf160x *)&sst39vf160x_flash_device;
/* register spi_flash device */
sst_flash->parent.type = RT_Device_Class_Block;
sst_flash->parent.init = sst39vf160x_flash_init;
sst_flash->parent.open = sst39vf160x_flash_open;
sst_flash->parent.close = sst39vf160x_flash_close;
sst_flash->parent.read = sst39vf160x_flash_read;
sst_flash->parent.write = sst39vf160x_flash_write;
sst_flash->parent.control = sst39vf160x_flash_control;
/* no private */
sst_flash->parent.user_data = RT_NULL;
sst_flash->hw_base = 0x81000000;
sst_flash->fat_sector_size = 512; //单扇区字节数
sst_flash->fat_sector_num = 4096; //2M byte
sst_flash->fat_block_size = 4096; //族大小
// Erase_Entire_Chip();
rt_device_register(&sst_flash->parent, "flash",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
}
之后 在finsh中敲命令对其格式化
finsh>>mkfs("elm","flash")
0, 0x00000000
finsh>>df("/")
-2, 0xfffffffe
finsh>>ls()
No such directory
0, 0x00000000
finsh>>ls("/")
No such directory
-2147218926, 0x80040a12
finsh>>mkdir("/asd")
-1, 0xffffffff
finsh>>
看样子是没成功。
(原文件名:首扇区数据.png)
最后贴个运行格式化函数后的首扇区内容,看最后的0x55AA标识符貌似是对的。麻烦各位大侠闲暇之余来看看问题所在,小弟在此谢过。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|