QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

发新帖

84

主题

16

听众

2925

积分

超级版主

Rank: 8Rank: 8Rank: 8Rank: 8

该用户从未签到

最后登录
2015-5-31
威望
0
金钱
2413
贡献
0
注册时间
2012-5-1
积分
2925
帖子
492
主题
84
精华
4
UID
2
发表于 2013-8-3 00:16:41 |显示全部楼层
更多
本帖最后由 reille 于 2013-8-9 21:25 编辑

/*****************************************************************************
**
**                                   说  明
**
** Copyright (C) 2013 eCos技术网(http://www.52ecos.net). All Rights Reserved.
**
** Author: reille
** Date  : 2013.08.02
** Ver   : Ver0.1
**
*****************************************************************************/

【组件简介】:

STM32平台eCos SD卡驱动组件——eCos SD card driver for STM32 SDIO

------------------------------------------------------------------------------

【文件目录】

1. devs文件夹:

该文件夹下的disk目录主要存放了STM32平台eCos SD卡驱动组件源码:

devs->disk->cortexm:STM32平台eCos SD卡驱动组件源码;


2. io文件夹:

主要是修正disk.c源文件中存在的一些bug,解决disk底层驱动读写发生错误时SD卡controller busy状态的混乱;
bug修正标签:// FIXME by reille 2013.07.28


3. fs文件夹:

主要修改了fatfs.c、fatfs.h、fatfs_supp.c三个文件。这三个文件的修改都可通过搜索reille关键字查看到。其中:

fatfs.c:

主要修改了fatfs_getinfo()函数,使fatfs支持SD卡信息(如SD卡总大小、剩余存储空间等)的读取,具体参考:http://www.sourceware.org/ml/ecos-discuss/2012-07/msg00006.html

fatfs.h、fatfs_supp.c:

主要修改了fatfs_supp.c源文件的cluster_to_block_pos()、disk_write()、disk_read()、read_boot_record()等几个函数。

eCos中本身的fatfs只支持MBR为0的SD卡,但实际情况下,SD卡的MBR可能不为0,这就导致了fatfs读取不到MBR数据,从而mount失败。对这三个文件的修改就是为了支持MBR不在扇区0的SD卡。具体参考:http://blog.csdn.net/rill_zhen/article/details/9365477

------------------------------------------------------------------------------

【组件使用】:

1. 把包下面的源文件加入到你的代码中(或者可以直接拷贝粘贴);

2. 在ecos.db中添加组件包:

package CYGPKG_DEVS_DISK_CORTEXM_STM32_MMC {
    alias      { "Disk driver for MMC cards for STM32" stm32_mmc_disk_driver }
    directory  devs/disk/cortexm/stm32/mmc
    script     mmc_stm32.cdl
    hardware
    description "MMC driver for STM32 family of CortexM controllers"
}

3. 把CYGPKG_DEVS_DISK_CORTEXM_STM32_MMC组件加入到你的target中;

4. 打开图形配置工具进行配置:

添加STM32 SD卡驱动相关组件包,如下所述:

1). 与SD卡驱动相关的组件:
>> CYGPKG_DEVS_DISK_CORTEXM_STM32_MMC — STM32 SD卡驱动即STM32 SDIO驱动;同时设置该驱动组件 CYGNUM_DEVS_DISK_CORTEXM_STM32_MMC_DISK0_BBUF_SIZE 配置项为512;
>>> CYGPKG_IO_DISK — STM32 SD卡驱动 依赖的IO层驱动组件;

2). 与应用相关的组件:
>>> CYGPKG_FS_FAT — FAT Filesystem组件包;
>>> CYGPKG_BLOCK_LIB — CYGPKG_FS_FAT 依赖的组件包;
>>> CYGPKG_LINUX_COMPAT — CYGPKG_BLOCK_LIB 依赖的组件包;

3). 禁止配置项CYGPKG_DEVS_DISK_TESTING;不需要它;

4). 使能配置项CYGSEM_FILEIO_INFO_DISK_USAGE,该配置项用于读取SD卡信息;

5). 如果需要,可以打开disk驱动调试开关,配置项为:CYGDBG_IO_DISK_DEBUG。

------------------------------------------------------------------------------

【测试程序】:

测试程序可以使用ecos/packages/fs/fat/current/tests/下的fatfs1.c作为测试用例。

当然你也可以使用下面我本人编写的测试用例:

其中:

op_type = 1时,读取SD卡根目录下的文件目录信息;
op_type = 2时,读取SD卡信息,如卡大小、剩余空间等;
op_type = 3时,创建目录,创建文件并读取文件;
  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <sys/stat.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <dirent.h>
  7. #include <stdio.h>


  8. #define SHOW_RESULT( _fn, _res ) \
  9. diag_printf("<FAIL>: " #_fn "() returned %d %s\n", _res, _res<0?strerror(errno):"");

  10. #define IOSIZE  100

  11. void checkcwd( const char *cwd )
  12. {
  13.     static char cwdbuf[PATH_MAX];
  14.     char *ret;

  15.     diag_printf( "checkcwd, cwd: %s...............\n", cwd);

  16.     ret = getcwd( cwdbuf, sizeof(cwdbuf));
  17.     if( ret == NULL ) SHOW_RESULT( getcwd, (int)ret );

  18.     if( strcmp( cwdbuf, cwd ) != 0 )
  19.     {
  20.         diag_printf( "cwdbuf %s cwd %s\n",cwdbuf, cwd );
  21.         diag_printf( "Current directory mismatch\n");
  22.     }
  23. }

  24. static void listdir( char *name, int statp, int numexpected, int *numgot )
  25. {
  26.     int err;
  27.     DIR *dirp;
  28.     int num=0;

  29.     diag_printf("<INFO>: reading directory %s\n",name);

  30.     dirp = opendir( name );
  31.     if( dirp == NULL ) SHOW_RESULT( opendir, -1 );

  32.     for(;;)
  33.     {
  34.         struct dirent *entry = readdir( dirp );
  35.         if( entry == NULL ) {
  36.             break;
  37.         }

  38.         num++;
  39.         diag_printf("<INFO>: entry %14s",entry->d_name);
  40. #ifdef CYGPKG_FS_FAT_RET_DIRENT_DTYPE
  41.         diag_printf(" d_type %2x", entry->d_type);
  42. #endif
  43.         if( statp )
  44.         {
  45.             char fullname[PATH_MAX];
  46.             struct stat sbuf;

  47.             if( name[0] )
  48.             {
  49.                 strcpy(fullname, name );
  50.                 if( !(name[0] == '/' && name[1] == 0 ) )
  51.                     strcat(fullname, "/" );
  52.             }
  53.             else fullname[0] = 0;

  54.             strcat(fullname, entry->d_name );

  55.             err = stat( fullname, &sbuf );
  56.             if( err < 0 )
  57.             {
  58.                 if( errno == ENOSYS )
  59.                     diag_printf(" <no status available>");
  60.                 else SHOW_RESULT( stat, err );
  61.             }
  62.             else
  63.             {
  64.                 diag_printf(" [mode %08x ino %08x nlink %d size %ld]",
  65.                             sbuf.st_mode,sbuf.st_ino,sbuf.st_nlink,(long)sbuf.st_size);
  66.             }
  67. #ifdef CYGPKG_FS_FAT_RET_DIRENT_DTYPE
  68.             if ((entry->d_type & S_IFMT) != (sbuf.st_mode & S_IFMT))
  69.               diag_printf("File mode's don't match between dirent and stat\n");
  70. #endif
  71.         }

  72.         diag_printf("\n");
  73.     }

  74.     err = closedir( dirp );
  75.     if( err < 0 ) SHOW_RESULT( stat, err );
  76.     if (numexpected >= 0 && num != numexpected)
  77.         diag_printf("Wrong number of dir entries\n");
  78.     if ( numgot != NULL )
  79.         *numgot = num;
  80. }

  81. static void createfile( char *name, size_t size )
  82. {
  83.     char buf[IOSIZE];
  84.     int fd;
  85.     ssize_t wrote;
  86.     int i;
  87.     int err;

  88.     diag_printf("<INFO>: create file %s size %zd \n",name,size);

  89.     err = access( name, F_OK );
  90.     if( err < 0 && errno != EACCES ) SHOW_RESULT( access, err );

  91.     for( i = 0; i < IOSIZE; i++ ) buf[i] = i%256;

  92.     fd = open( name, O_RDWR | O_CREAT );
  93.     if( fd < 0 ) {
  94.         SHOW_RESULT( open, fd );
  95.         return;
  96.     }

  97.     while( size > 0 )
  98.     {
  99.         ssize_t len = size;
  100.         if ( len > IOSIZE ) len = IOSIZE;

  101.         wrote = write( fd, buf, len );
  102.         if( wrote != len ) SHOW_RESULT( write, (int)wrote );

  103.         size -= wrote;
  104.     }

  105.     err = close( fd );
  106.     if( err < 0 ) {
  107.         SHOW_RESULT( close, err );
  108.     } else {
  109.         diag_printf("<INFO>: create file %s OK......\n", name);
  110.     }
  111. }

  112. static void checkfile( char *name )
  113. {
  114.     char buf[IOSIZE];
  115.     int fd;
  116.     ssize_t done;
  117.     int i;
  118.     int err;
  119.     off_t pos = 0;

  120.     diag_printf("<INFO>: check file %s\n",name);

  121.     err = access( name, F_OK );
  122.     if( err != 0 ) SHOW_RESULT( access, err );

  123.     fd = open( name, O_RDONLY );
  124.     if( fd < 0 ) {
  125.         SHOW_RESULT( open, fd );
  126.         return;
  127.     }

  128.     for(;;)
  129.     {
  130.         done = read( fd, buf, IOSIZE );
  131.         if( done < 0 ) SHOW_RESULT( read, (int)done );

  132.         if( done == 0 ) break;

  133.         for( i = 0; i < done; i++ )
  134.             if( buf[i] != i%256 ) {
  135.                 diag_printf("buf[%ld+%d](%02x) != %02x, ",pos,i,buf[i],i%256);
  136.                 diag_printf("Data read not equal to data written\n");
  137.             }

  138.         pos += done;
  139.     }

  140.     err = close( fd );
  141.     if( err < 0 ) SHOW_RESULT( close, err );
  142. }

  143. void test_sd_card(cyg_uint8 op_type)
  144. {
  145.     int err;
  146.     int existingdirents=-1;
  147. #if defined(CYGSEM_FILEIO_INFO_DISK_USAGE)
  148.     struct cyg_fs_disk_usage usage;
  149. #endif

  150.     err = mount( "/dev/mmcdisk0/1", "/", "fatfs" );
  151.     if( err < 0 ) {
  152.         SHOW_RESULT( mount, err );
  153.         return;
  154.     }

  155.     diag_printf("\nMount SD/MMC card to '/' successfully!\n\n");

  156.     err = chdir( "/" );
  157.     if( err < 0 ) SHOW_RESULT( chdir, err );

  158.     checkcwd( "/" );

  159.     if (op_type == 1) {
  160.         listdir( "/", true, -1, &existingdirents );
  161.     } else if (op_type == 2) {
  162. #if defined(CYGSEM_FILEIO_INFO_DISK_USAGE)
  163.         // 获取disk信息,需要修改fatfs.c中fatfs_getinfo()函数,
  164.         // See http://www.sourceware.org/ml/ecos-discuss/2012-07/msg00006.html
  165.         err = cyg_fs_getinfo("/", FS_INFO_DISK_USAGE, &usage, sizeof(usage));
  166.         if( err < 0 ) {
  167.             SHOW_RESULT( cyg_fs_getinfo, err );
  168.         } else {
  169.             diag_printf("<INFO>: total size: %6lld blocks, %10lld bytes\n",
  170.                         usage.total_blocks, usage.total_blocks * usage.block_size);
  171.             diag_printf("<INFO>: free size:  %6lld blocks, %10lld bytes\n",
  172.                         usage.free_blocks, usage.free_blocks * usage.block_size);
  173.             diag_printf("<INFO>: block size: %6u bytes\n", usage.block_size);
  174.         }
  175. #endif
  176.     } else if (op_type == 3) {
  177. #if 1
  178.         diag_printf("\nCreate directory '/test'\n");

  179.         err = mkdir( "/test", 0 );
  180.         if( err < 0 ) SHOW_RESULT( mkdir, err );
  181. #endif

  182. #if 1
  183.         diag_printf("\nCreate file '/test1.txt'\n");

  184.         createfile( "/test1.txt", /*20257*/ 99 );
  185. #endif

  186. #if 1
  187.         checkfile(  "test1.txt" );
  188. #endif

  189. #if 1
  190.         // Read file data
  191.         int i, fd;
  192.         ssize_t done;
  193.         char buf[IOSIZE];

  194.         fd = open( "/test1.txt", O_RDONLY);
  195.         if (fd > 0) {
  196.             done = read( fd, buf, IOSIZE );
  197.             if( done < 0 ) {
  198.                 SHOW_RESULT( read, (int)done );
  199.             } else {
  200.                 diag_printf("Read file '/test1.txt' data (done = %d): ", done);
  201.                 for ( i = 0; i < done; i++) {
  202.                     if ((i % 16 == 0))    diag_printf("\n");
  203.                     diag_printf("%02X ", buf[i]);
  204.                 }
  205.                 diag_printf("\n");
  206.             }
  207.             close(fd);
  208.         } else {
  209.             SHOW_RESULT( open, fd );
  210.         }
  211. #endif
  212.     }

  213.     diag_printf("\n");
  214.     diag_printf("<INFO>: umount /\n\n");
  215.     err = umount( "/" );
  216.     if( err < 0 ) SHOW_RESULT( umount, err );
  217. }
复制代码
------------------------------------------------------------------------------


【存在问题】:

Ver0.1版本:

1. 本驱动组件仅在一张SD卡(金士顿,2G卡,包括FAT16和FAT32)中做过测试,因此不保证SD卡的兼容性;

2. 经测试,mount时偶尔还是会出现失败的情况;

3. 编写驱动代码时,因为大多数代码都是从STM32官方库中拷贝而来,因此存在很多while死循环的代码(这种代码让人感觉非常糟糕,由于时间问题,暂时不予以改进);

------------------------------------------------------------------------------

请注意:在附件提供的源代码中,使用的相关宏定义并未一起提供,这些宏定义补充在第8帖和第9帖中……
带给你的不便请见谅……

下载地址:

游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员 新浪微博账号登陆

回复

使用道具 举报

84

主题

16

听众

2925

积分

超级版主

Rank: 8Rank: 8Rank: 8Rank: 8

该用户从未签到

最后登录
2015-5-31
威望
0
金钱
2413
贡献
0
注册时间
2012-5-1
积分
2925
帖子
492
主题
84
精华
4
UID
2
发表于 2013-8-3 00:18:13 |显示全部楼层
本人编写的测试用例执行情况,如下图所示:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员 新浪微博账号登陆

回复

使用道具 举报

23

主题

2

听众

898

积分

高级工程师

Rank: 4Rank: 4

  • TA的每日心情
    难过
    2013-9-3 21:37
  • 签到天数: 31 天

    [LV.5]常住居民I

    最后登录
    2014-7-16
    威望
    0
    金钱
    821
    贡献
    0
    注册时间
    2013-5-8
    积分
    898
    帖子
    77
    主题
    23
    精华
    0
    UID
    295
    发表于 2013-8-3 10:49:06 |显示全部楼层
    非常感谢分享代码,回头能用的上的话好好研究研究
    回复

    使用道具 举报

    10

    主题

    0

    听众

    377

    积分

    中级工程师

    Rank: 3

  • TA的每日心情
    奋斗
    2015-2-2 00:50
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    最后登录
    2015-11-15
    威望
    0
    金钱
    350
    贡献
    0
    注册时间
    2013-6-15
    积分
    377
    帖子
    27
    主题
    10
    精华
    0
    UID
    331
    发表于 2013-8-3 16:15:06 |显示全部楼层
    斑竹很幸苦哦
    回复

    使用道具 举报

    0

    主题

    0

    听众

    46

    积分

    实习生

    Rank: 1

    该用户从未签到

    最后登录
    2014-11-21
    威望
    0
    金钱
    32
    贡献
    0
    注册时间
    2013-5-3
    积分
    46
    帖子
    14
    主题
    0
    精华
    0
    UID
    288
    发表于 2013-8-3 22:27:31 |显示全部楼层
    谢谢分享,学习中!
    回复

    使用道具 举报

    0

    主题

    0

    听众

    137

    积分

    初级工程师

    Rank: 2Rank: 2

    该用户从未签到

    最后登录
    2017-9-28
    威望
    0
    金钱
    119
    贡献
    0
    注册时间
    2013-6-18
    积分
    137
    帖子
    18
    主题
    0
    精华
    0
    UID
    334
    发表于 2013-8-5 08:19:08 |显示全部楼层
    ddddddddddddddddd
    回复

    使用道具 举报

    0

    主题

    0

    听众

    13

    积分

    实习生

    Rank: 1

    该用户从未签到

    最后登录
    2013-8-6
    威望
    0
    金钱
    11
    贡献
    0
    注册时间
    2013-7-18
    积分
    13
    帖子
    2
    主题
    0
    精华
    0
    UID
    383
    发表于 2013-8-6 08:30:29 |显示全部楼层
    学习一下,谢谢分享。。。。。。。。。。。。。。。。。
    回复

    使用道具 举报

    84

    主题

    16

    听众

    2925

    积分

    超级版主

    Rank: 8Rank: 8Rank: 8Rank: 8

    该用户从未签到

    最后登录
    2015-5-31
    威望
    0
    金钱
    2413
    贡献
    0
    注册时间
    2012-5-1
    积分
    2925
    帖子
    492
    主题
    84
    精华
    4
    UID
    2
    发表于 2013-8-9 21:14:45 |显示全部楼层
    补充相关定义,附件提供的源代码包中没有包含

    SDIO相关引脚及其DMA stream的定义(添加到对应目标(target)的plf_io.h文件中,比如我使用的目标是stm32f10xxx,则把下面代码添加到ecos/packages/hal/cortexm/stm32/stm32f10xxx/current/include/plf_io.h文件的末尾):
    1. // For SDIO
    2. #define CYGHWR_HAL_STM32_SDIO_PIN_DAT0      CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 8,  NA, PUSHPULL, NONE, AT_LEAST(50) )
    3. #define CYGHWR_HAL_STM32_SDIO_PIN_DAT1      CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 9,  NA, PUSHPULL, NONE, AT_LEAST(50) )
    4. #define CYGHWR_HAL_STM32_SDIO_PIN_DAT2      CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 10, NA, PUSHPULL, NONE, AT_LEAST(50) )
    5. #define CYGHWR_HAL_STM32_SDIO_PIN_DAT3      CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 11, NA, PUSHPULL, NONE, AT_LEAST(50) )
    6. #define CYGHWR_HAL_STM32_SDIO_PIN_CLK       CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 12, NA, PUSHPULL, NONE, AT_LEAST(50) )
    7. #define CYGHWR_HAL_STM32_SDIO_PIN_CMD       CYGHWR_HAL_STM32_PIN_ALTFN_OUT( D, 2,  NA, PUSHPULL, NONE, AT_LEAST(50) )

    8. #define CYGHWR_HAL_STM32_SDIO_DMA_TX        CYGHWR_HAL_STM32_DMA( 2, 4, 0, M2P )
    9. #define CYGHWR_HAL_STM32_SDIO_DMA_RX        CYGHWR_HAL_STM32_DMA( 2, 4, 0, P2M )
    复制代码
    回复

    使用道具 举报

    84

    主题

    16

    听众

    2925

    积分

    超级版主

    Rank: 8Rank: 8Rank: 8Rank: 8

    该用户从未签到

    最后登录
    2015-5-31
    威望
    0
    金钱
    2413
    贡献
    0
    注册时间
    2012-5-1
    积分
    2925
    帖子
    492
    主题
    84
    精华
    4
    UID
    2
    发表于 2013-8-9 21:21:19 |显示全部楼层
    补充相关定义,附件提供的源代码包中没有包含

    STM32 SDIO外设寄存器的相关定义,把下面的代码添加到ecos/packages/hal/cortexm/stm32/var/current/include/var_io.h文件末尾:
    1. //=============================================================================
    2. // SDIO Added by reille 2013.06.27

    3. #define CYGHWR_HAL_STM32_SDIO_POWER                 0x00
    4. #define CYGHWR_HAL_STM32_SDIO_CLKCR                 0x04
    5. #define CYGHWR_HAL_STM32_SDIO_ARG                   0x08
    6. #define CYGHWR_HAL_STM32_SDIO_CMD                   0x0C
    7. #define CYGHWR_HAL_STM32_SDIO_RESPCMD               0x10
    8. #define CYGHWR_HAL_STM32_SDIO_RESP(__x)             0x14 + ((__x) << 2)
    9. #define CYGHWR_HAL_STM32_SDIO_DTIMER                0x24
    10. #define CYGHWR_HAL_STM32_SDIO_DLEN                  0x28
    11. #define CYGHWR_HAL_STM32_SDIO_DCTRL                 0x2C
    12. #define CYGHWR_HAL_STM32_SDIO_DCOUNT                0x30
    13. #define CYGHWR_HAL_STM32_SDIO_STA                   0x34
    14. #define CYGHWR_HAL_STM32_SDIO_ICR                   0x38
    15. #define CYGHWR_HAL_STM32_SDIO_MASK                  0x3C
    16. #define CYGHWR_HAL_STM32_SDIO_FIFOCNT               0x48
    17. #define CYGHWR_HAL_STM32_SDIO_FIFO                  0x80

    18. // POWER fields

    19. #define CYGHWR_HAL_STM32_SDIO_POWER_PWROFF          VALUE_(0,0)
    20. #define CYGHWR_HAL_STM32_SDIO_POWER_PWRON           VALUE_(0,3)

    21. // CLKCR fields

    22. #define CYGHWR_HAL_STM32_SDIO_CLKCR_CLKDIV(__x)     VALUE_(1,(__x))
    23. #define CYGHWR_HAL_STM32_SDIO_CLKCR_CLKEN           BIT_(8)
    24. #define CYGHWR_HAL_STM32_SDIO_CLKCR_PWRSAV          BIT_(9)
    25. #define CYGHWR_HAL_STM32_SDIO_CLKCR_BYPASS          BIT_(10)
    26. #define CYGHWR_HAL_STM32_SDIO_CLKCR_WIDBUS_1BIT     VALUE_(11,0)
    27. #define CYGHWR_HAL_STM32_SDIO_CLKCR_WIDBUS_4BIT     VALUE_(11,1)
    28. #define CYGHWR_HAL_STM32_SDIO_CLKCR_WIDBUS_8BIT     VALUE_(11,2)
    29. #define CYGHWR_HAL_STM32_SDIO_CLKCR_NEGEDGE         BIT_(13)
    30. #define CYGHWR_HAL_STM32_SDIO_CLKCR_HWFC_EN         BIT_(14)

    31. // ARG fields

    32. #define CYGHWR_HAL_STM32_SDIO_ARG_CMDARG(__x)       VALUE_(0,(__x))

    33. // CMD fields

    34. #define CYGHWR_HAL_STM32_SDIO_CMD_CMDINDEX(__x)     VALUE_(0,(__x))
    35. #define CYGHWR_HAL_STM32_SDIO_CMD_NORESP_CMDSENT_0  VALUE_(6,0)
    36. #define CYGHWR_HAL_STM32_SDIO_CMD_SHORTRESP_CMDREND VALUE_(6,1)
    37. #define CYGHWR_HAL_STM32_SDIO_CMD_NORESP_CMDSENT_2  VALUE_(6,2)
    38. #define CYGHWR_HAL_STM32_SDIO_CMD_LONGRESP_CMDREND  VALUE_(6,3)
    39. #define CYGHWR_HAL_STM32_SDIO_CMD_WAITNONE          VALUE_(8,0)/*!< SDIO No Wait, TimeOut is enabled */
    40. #define CYGHWR_HAL_STM32_SDIO_CMD_WAITINT           BIT_(8)
    41. #define CYGHWR_HAL_STM32_SDIO_CMD_WAITPEND          BIT_(9)
    42. #define CYGHWR_HAL_STM32_SDIO_CMD_CPSMEN            BIT_(10)
    43. #define CYGHWR_HAL_STM32_SDIO_CMD_SDIOSuspend       BIT_(11)
    44. #define CYGHWR_HAL_STM32_SDIO_CMD_ENCMDcompl        BIT_(12)
    45. #define CYGHWR_HAL_STM32_SDIO_CMD_nIEN              BIT_(13)
    46. #define CYGHWR_HAL_STM32_SDIO_CMD_ATACMD            BIT_(14)


    47. // RESPCMD fields

    48. #define CYGHWR_HAL_STM32_SDIO_RESPCMD_CMDINDEX(__x) VALUE_(0,(__x))

    49. // DLEN fields

    50. #define CYGHWR_HAL_STM32_SDIO_DLEN_DATALENGTH(__x)  VALUE_(0,(__x))

    51. // DCTRL fields

    52. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DTEN            BIT_(0)
    53. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DTDIR           BIT_(1)
    54. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DMODE           BIT_(2)
    55. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DMODE_BLOCK     0
    56. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DMODE_STREAM    BIT_(2)
    57. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DMAEN           BIT_(3)
    58. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE(__x) VALUE_(4,__x)
    59. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_1    VALUE_(4,0)
    60. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_2    VALUE_(4,1)
    61. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_4    VALUE_(4,2)
    62. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_8    VALUE_(4,3)
    63. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_16   VALUE_(4,4)
    64. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_32   VALUE_(4,5)
    65. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_64   VALUE_(4,6)
    66. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_128  VALUE_(4,7)
    67. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_256  VALUE_(4,8)
    68. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_512  VALUE_(4,9)
    69. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_1024 VALUE_(4,10)
    70. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_2048 VALUE_(4,11)
    71. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_4096 VALUE_(4,12)
    72. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_8192 VALUE_(4,13)
    73. #define CYGHWR_HAL_STM32_SDIO_DCTRL_DBLOCKSIZE_16384 VALUE_(4,14)
    74. #define CYGHWR_HAL_STM32_SDIO_DCTRL_RWSTART         BIT_(8)
    75. #define CYGHWR_HAL_STM32_SDIO_DCTRL_RWSTOP          BIT_(9)
    76. #define CYGHWR_HAL_STM32_SDIO_DCTRL_RWMOD           BIT_(10)
    77. #define CYGHWR_HAL_STM32_SDIO_DCTRL_SDIOEN          BIT_(11)

    78. // DCOUNT fields

    79. #define CYGHWR_HAL_STM32_SDIO_DCOUNT_DATACOUNT(__x) VALUE_(0,(__x))

    80. // STA fields

    81. #define CYGHWR_HAL_STM32_SDIO_STA_CCRCFAIL          BIT_(0)
    82. #define CYGHWR_HAL_STM32_SDIO_STA_DCRCFAIL          BIT_(1)
    83. #define CYGHWR_HAL_STM32_SDIO_STA_CTIMEOUT          BIT_(2)
    84. #define CYGHWR_HAL_STM32_SDIO_STA_DTIMEOUT          BIT_(3)
    85. #define CYGHWR_HAL_STM32_SDIO_STA_TXUNDERR          BIT_(4)
    86. #define CYGHWR_HAL_STM32_SDIO_STA_RXOVERR           BIT_(5)
    87. #define CYGHWR_HAL_STM32_SDIO_STA_CMDREND           BIT_(6)
    88. #define CYGHWR_HAL_STM32_SDIO_STA_CMDSENT           BIT_(7)
    89. #define CYGHWR_HAL_STM32_SDIO_STA_DATAEND           BIT_(8)
    90. #define CYGHWR_HAL_STM32_SDIO_STA_STBITERR          BIT_(9)
    91. #define CYGHWR_HAL_STM32_SDIO_STA_DBCKEND           BIT_(10)
    92. #define CYGHWR_HAL_STM32_SDIO_STA_CMDACT            BIT_(11)
    93. #define CYGHWR_HAL_STM32_SDIO_STA_TXACT             BIT_(12)
    94. #define CYGHWR_HAL_STM32_SDIO_STA_RXACT             BIT_(13)
    95. #define CYGHWR_HAL_STM32_SDIO_STA_TXFIFOHE          BIT_(14)
    96. #define CYGHWR_HAL_STM32_SDIO_STA_RXFIFOHF          BIT_(15)
    97. #define CYGHWR_HAL_STM32_SDIO_STA_TXFIFOF           BIT_(16)
    98. #define CYGHWR_HAL_STM32_SDIO_STA_RXFIFOF           BIT_(17)
    99. #define CYGHWR_HAL_STM32_SDIO_STA_TXFIFOE           BIT_(18)
    100. #define CYGHWR_HAL_STM32_SDIO_STA_RXFIFOE           BIT_(19)
    101. #define CYGHWR_HAL_STM32_SDIO_STA_TXDVAL            BIT_(20)
    102. #define CYGHWR_HAL_STM32_SDIO_STA_RXDVAL            BIT_(21)
    103. #define CYGHWR_HAL_STM32_SDIO_STA_SDIOIT            BIT_(22)
    104. #define CYGHWR_HAL_STM32_SDIO_STA_CEATAEND          BIT_(23)

    105. // ICR fields

    106. #define CYGHWR_HAL_STM32_SDIO_ICR_CCRCFAILC         BIT_(0)
    107. #define CYGHWR_HAL_STM32_SDIO_ICR_DCRCFAILC         BIT_(1)
    108. #define CYGHWR_HAL_STM32_SDIO_ICR_CTIMEOUT          BIT_(2)
    109. #define CYGHWR_HAL_STM32_SDIO_ICR_DTIMEOUTC         BIT_(3)
    110. #define CYGHWR_HAL_STM32_SDIO_ICR_TXUNDERRC         BIT_(4)
    111. #define CYGHWR_HAL_STM32_SDIO_ICR_RXOVERRC          BIT_(5)
    112. #define CYGHWR_HAL_STM32_SDIO_ICR_CMDRENDC          BIT_(6)
    113. #define CYGHWR_HAL_STM32_SDIO_ICR_CMDSENTC          BIT_(7)
    114. #define CYGHWR_HAL_STM32_SDIO_ICR_DATAENDC          BIT_(8)
    115. #define CYGHWR_HAL_STM32_SDIO_ICR_STBITERRC         BIT_(9)
    116. #define CYGHWR_HAL_STM32_SDIO_ICR_DBCKENDC          BIT_(10)
    117. #define CYGHWR_HAL_STM32_SDIO_ICR_SDIOITC           BIT_(22)
    118. #define CYGHWR_HAL_STM32_SDIO_ICR_CEATAENDC         BIT_(23)

    119. // MASK fields

    120. #define CYGHWR_HAL_STM32_SDIO_MASK_CCRCFAILIE       BIT_(0)
    121. #define CYGHWR_HAL_STM32_SDIO_MASK_DCRCFAILIE       BIT_(1)
    122. #define CYGHWR_HAL_STM32_SDIO_MASK_CTIMEOUTIE       BIT_(2)
    123. #define CYGHWR_HAL_STM32_SDIO_MASK_DTIMEOUTIE       BIT_(3)
    124. #define CYGHWR_HAL_STM32_SDIO_MASK_TXUNDERRIE       BIT_(4)
    125. #define CYGHWR_HAL_STM32_SDIO_MASK_RXOVERRIE        BIT_(5)
    126. #define CYGHWR_HAL_STM32_SDIO_MASK_CMDRENDIE        BIT_(6)
    127. #define CYGHWR_HAL_STM32_SDIO_MASK_CMDSENTIE        BIT_(7)
    128. #define CYGHWR_HAL_STM32_SDIO_MASK_DATAENDIE        BIT_(8)
    129. #define CYGHWR_HAL_STM32_SDIO_MASK_STBITERRIE       BIT_(9)
    130. #define CYGHWR_HAL_STM32_SDIO_MASK_DBCKENDIE        BIT_(10)
    131. #define CYGHWR_HAL_STM32_SDIO_MASK_CMDACTIE         BIT_(11)
    132. #define CYGHWR_HAL_STM32_SDIO_MASK_TXACTIE          BIT_(12)
    133. #define CYGHWR_HAL_STM32_SDIO_MASK_RXACTIE          BIT_(13)
    134. #define CYGHWR_HAL_STM32_SDIO_MASK_TXFIFOHE         BIT_(14)
    135. #define CYGHWR_HAL_STM32_SDIO_MASK_RXFIFOHFIE       BIT_(15)
    136. #define CYGHWR_HAL_STM32_SDIO_MASK_TXFIFOFIE        BIT_(16)
    137. #define CYGHWR_HAL_STM32_SDIO_MASK_RXFIFOFIE        BIT_(17)
    138. #define CYGHWR_HAL_STM32_SDIO_MASK_TXFIFOEIE        BIT_(18)
    139. #define CYGHWR_HAL_STM32_SDIO_MASK_RXFIFOEIE        BIT_(19)
    140. #define CYGHWR_HAL_STM32_SDIO_MASK_TXDVALIE         BIT_(20)
    141. #define CYGHWR_HAL_STM32_SDIO_MASK_RXDVALIE         BIT_(21)
    142. #define CYGHWR_HAL_STM32_SDIO_MASK_SDIOITIE         BIT_(22)
    143. #define CYGHWR_HAL_STM32_SDIO_MASK_CEATAENDIE       BIT_(23)

    144. // FIFOCNT fields

    145. #define CYGHWR_HAL_STM32_SDIO_FIFOCNT_FIFOCOUNT(__x) VALUE_(0,(__x))

    146. // Clock enable bits

    147. #define CYGHWR_HAL_STM32_SDIO_CLOCK             CYGHWR_HAL_STM32_CLOCK( AHB, SDIO )

    148. //#define CYGHWR_HAL_STM32_SDIO_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, SDIO )
    复制代码
    回复

    使用道具 举报

    0

    主题

    0

    听众

    122

    积分

    初级工程师

    Rank: 2Rank: 2

    该用户从未签到

    最后登录
    2016-4-28
    威望
    0
    金钱
    92
    贡献
    0
    注册时间
    2013-5-2
    积分
    122
    帖子
    30
    主题
    0
    精华
    0
    UID
    284
    发表于 2013-8-21 09:06:46 |显示全部楼层
    谢谢!谢谢!谢谢!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员 新浪微博账号登陆

    无觅相关文章插件

    申请友链|手机版|关于本站|站点帮助|eCos技术网 ( 粤ICP备12094833号-1  

    GMT+8, 2017-11-19 21:55 , Processed in 0.134943 second(s), 35 queries .

    Powered by Discuz!2.5 X2.5

    © 2001-2012 Comsenz Inc.

    回顶部