用RTT系统在SST39vf160x上做FAT文件系统,格式化后文件操作失败,如何判断格式化成功了?
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>>
看样子是没成功。
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_611632T3WMQF.png
(原文件名:首扇区数据.png)
最后贴个运行格式化函数后的首扇区内容,看最后的0x55AA标识符貌似是对的。麻烦各位大侠闲暇之余来看看问题所在,小弟在此谢过。 先跑一下设备驱动测试: RT-thread设备测试程序(待完善) 好的,吃完饭来测试 已经能写了,说明底层操作没问题,FAT表应该建立了
似乎需先要mount一下吧 mkfs后应该要重启动下吧 finsh看来需要价格reset或者restart会比较方便 我的底层驱动貌似有点问题,我再看看。 确实是底层驱动不行,改的头晕,终于搞的有点效果了。
\ | /
- RT - Thread Operating System
/ | \ 0.4.0 build Jan 17 2011
2006 - 2009 Copyright by rt-thread team
enter list() to get function list!
File System initialized!
finsh>>ls("/")
Directory /:
TEDDEN <DIR>
HELLO.TXT 37
0, 0x00000000
finsh>>cat("/hello.txt")
HELLO,RT-Thread DFS ON SST39VF1601!
0, 0x00000000
finsh>>df("/")
disk free: 4044 block
'+', -2147218901, 0x80040a2b
finsh>>
就是驱动写的太烂,用aozima大虾的驱动测试测起来写速度1KByte/s,SST这个flash每写之前都得擦除,麻烦的很。
目前只测试了建个目录,写个几十个字节的文件没问题,其他尚未测试。
我把我的工程打包下给大家。硬件平台是ZLG的EasyArm2200,把硬件IIC的的驱动搞了下也弄到RTT下面了,中断向量挂接部分也改了下,和SVN的lpc21xx的代码有一点点不一样。工程是片外调试,BANK0接RAM,BANK1接FLASH。
工程文件ourdev_611723QW7HBN.rar(文件大小:1.59M) (原文件名:rt-thread-easyarm2200.rar)
里面的lpc22xx放到..\svn_rt-thread\rt-thread\libcpu\arm
EasyArm2200放到..\svn_rt-thread\rt-thread\bsp 大师你好,能请教一下sst39vf1601的文件系统吗?QQ:897956996
页:
[1]