tedden 发表于 2011-1-17 11:20:27

用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标识符貌似是对的。麻烦各位大侠闲暇之余来看看问题所在,小弟在此谢过。

aozima 发表于 2011-1-17 11:42:00

先跑一下设备驱动测试: RT-thread设备测试程序(待完善)

tedden 发表于 2011-1-17 11:47:40

好的,吃完饭来测试

itspy 发表于 2011-1-17 12:33:54

已经能写了,说明底层操作没问题,FAT表应该建立了
似乎需先要mount一下吧

ffxz 发表于 2011-1-17 13:52:19

mkfs后应该要重启动下吧

itspy 发表于 2011-1-17 13:55:11

finsh看来需要价格reset或者restart会比较方便

tedden 发表于 2011-1-17 15:12:23

我的底层驱动貌似有点问题,我再看看。

tedden 发表于 2011-1-17 22:18:26

确实是底层驱动不行,改的头晕,终于搞的有点效果了。
\ | /
- 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

QWQ 发表于 2012-10-10 09:27:12

大师你好,能请教一下sst39vf1601的文件系统吗?QQ:897956996
页: [1]
查看完整版本: 用RTT系统在SST39vf160x上做FAT文件系统,格式化后文件操作失败,如何判断格式化成功了?