【RT-Thread】——驱动篇之文件系统

驱动是连接底层硬件跟上层系统的桥梁。这一层是至关重要的,如果不能保证驱动的正确性和完整性,系统就无法跟底层硬件通信,更无法完成上层的开发。

         经过好几天的奋斗终于把SD-Card的驱动成功的移植到了系统中,可以调用系统函数来操作SD卡了。

         首先看看RT-Thread的文件系统的三层结构图:

【RT-Thread】——驱动篇之文件系统_第1张图片

1.  最顶层的是一套面向嵌入式系统专门优化过的虚拟文件系统(接口)。这层为我们提供了访问文件的各种API:open、close、read、write等等

2.  中间是各种文件系统的实现。具体的配置在rtconfig.h中进行选择配置。

3.  最底层是各类存储驱动,如SD卡,IDE硬盘驱动等。(我就用了SD卡,别的没有用到呢)

 

这个驱动主要分两部分,一部分是SDIO接口对SD的操作,另一部分是将底层接口函数跟上层函数相对应。

SDIO

1.  SDIO简介

SDIO是一个I/O接口规范,是为带有SD卡槽的设备进行外设功能扩展。

2.  SD协议

1-      SDIO的时钟。SDIO_CK时钟是通过PC12引脚连接到SD卡的,是SDIO接口与SD卡用于同步的时钟。

2-      SDIO的命令、数据传输方式。SDIO的所有命令及命令响应,都是通过SDIO-CMD引脚来传输的。

命令只能由host即STM32的SDIO控制器发出。SDIO协议把命令分成了11种,包括基本命令,读写命令还有ACMD系列命令等。

3-      卡的种类。STM32的SDIO支持SD存储卡,SDI/O卡,MMC卡。

3.  剩下的就是具体的代码了,找个例程的驱动好好研究去吧。具体可以看看野火的教程。

上面的就是单纯的SDIO对SD卡的操作,跟操作系统是没有半点关系的。这是走向系统的第一步,一定要操作成功。接下来就是RT-Thread DFS文件系统针对下层媒介 使用的是RT-Thread的设备系统,其中主要包括设备读写等操作。

下面就列出接口函数,如下:

void rt_hw_sdcard_init(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    if (SD_Init() == SD_OK)
    {
        SD_Error status;
        rt_uint8_t *sector;
	NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
	{
            /* there is no partition table */
            part.offset = 0;
            part.size   = 0;
        }

        // /* release sector buffer */
        // rt_free(sector);

        /* register sdcard device */
        sdcard_device.type      = RT_Device_Class_Block;
        sdcard_device.init 	= rt_sdcard_init;
        sdcard_device.open 	= rt_sdcard_open;
        sdcard_device.close     = rt_sdcard_close;
        sdcard_device.read 	= rt_sdcard_read;
        sdcard_device.write     = rt_sdcard_write;
        sdcard_device.control   = rt_sdcard_control;

        /* no private */
        sdcard_device.user_data = &SDCardInfo;

        rt_device_register(&sdcard_device, "sd0",
                           RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE);

        return;
    }

__return:
    rt_kprintf("sdcard init failed\n");
}

上面就是底层的接口函数与DFS系统相对应上,以后直接调用系统的函数就可以操作底层的SD卡了。

到了这里我们就把SD的驱动跟RT-Thread的文件系统相对应上了。接下来就是应用了,应用层面上我用的不是太好,就没有资格说些什么了,但是把jiezhi的教程上传到这里,感兴趣的可以参考他的教程。http://download.csdn.net/detail/liaoxu02/7545209

你可能感兴趣的:(橙子读书)