搜索
bottom↓
回复: 8

用RTT系统在SST39vf160x上做FAT文件系统,格式化后文件操作失败,如何判断格式化成功了?

[复制链接]

出0入0汤圆

发表于 2011-1-17 11:20:27 | 显示全部楼层 |阅读模式
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碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-1-17 11:42:00 | 显示全部楼层
先跑一下设备驱动测试: RT-thread设备测试程序(待完善)

出0入0汤圆

 楼主| 发表于 2011-1-17 11:47:40 | 显示全部楼层
好的,吃完饭来测试

出0入0汤圆

发表于 2011-1-17 12:33:54 | 显示全部楼层
已经能写了,说明底层操作没问题,FAT表应该建立了
似乎需先要mount一下吧

出0入0汤圆

发表于 2011-1-17 13:52:19 | 显示全部楼层
mkfs后应该要重启动下吧

出0入0汤圆

发表于 2011-1-17 13:55:11 | 显示全部楼层
finsh看来需要价格reset或者restart会比较方便

出0入0汤圆

 楼主| 发表于 2011-1-17 15:12:23 | 显示全部楼层
我的底层驱动貌似有点问题,我再看看。

出0入0汤圆

 楼主| 发表于 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[512 bytes per 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

出0入0汤圆

发表于 2012-10-10 09:27:12 | 显示全部楼层
大师你好,能请教一下sst39vf1601的文件系统吗?QQ:897956996
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表