1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  */
9 #include <rtthread.h>
10 #include <dfs_fs.h>
11 #include <lpc214x.h>
12 
13 #include "sd.h"
14 
15 static struct rt_device sd;
16 static struct dfs_partition part;
17 
rt_sdcard_init(rt_device_t dev)18 static rt_err_t rt_sdcard_init(rt_device_t dev)
19 {
20     return RT_EOK;
21 }
22 
rt_sdcard_open(rt_device_t dev,rt_uint16_t oflag)23 static rt_err_t rt_sdcard_open(rt_device_t dev, rt_uint16_t oflag)
24 {
25     return RT_EOK;
26 }
27 
rt_sdcard_close(rt_device_t dev)28 static rt_err_t rt_sdcard_close(rt_device_t dev)
29 {
30     return RT_EOK;
31 }
32 
rt_sdcard_read(rt_device_t dev,rt_off_t pos,void * buffer,rt_size_t size)33 static rt_ssize_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
34 {
35     /* append partition offset */
36     pos += part.offset * 512;
37 
38     return 0;
39 }
40 
rt_sdcard_write(rt_device_t dev,rt_off_t pos,const void * buffer,rt_size_t size)41 static rt_ssize_t rt_sdcard_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
42 {
43     /* append partition offset */
44     pos += part.offset * 512;
45 
46     return 0;
47 }
48 
rt_sdcard_control(rt_device_t dev,int cmd,void * args)49 static rt_err_t rt_sdcard_control(rt_device_t dev, int cmd, void *args)
50 {
51     return RT_EOK;
52 }
53 
rt_hw_sdcard_init()54 void rt_hw_sdcard_init()
55 {
56     rt_size_t length;
57     rt_uint8_t* sector;
58 
59     /* sdcard hardware init */
60 
61     sd.type     = RT_Device_Class_Block;
62     sd.init     = rt_sdcard_init;
63     sd.open     = rt_sdcard_open;
64     sd.close    = rt_sdcard_close;
65     sd.read     = rt_sdcard_read;
66     sd.write    = rt_sdcard_write;
67     sd.control  = rt_sdcard_control;
68     sd.user_data  = RT_NULL;
69 
70     /* get the first sector to read partition table */
71     sector = (rt_uint8_t*) rt_malloc (512);
72     if (sector == RT_NULL)
73     {
74         rt_kprintf("allocate partition sector buffer failed\n");
75         return;
76     }
77 
78     length = rt_sdcard_read((rt_device_t)&sd, 0, sector, 512);
79     if (length == 512)
80     {
81         rt_err_t status;
82 
83         /* get the first partition */
84         status = dfs_filesystem_get_partition(&part, sector, 0);
85         if (status != RT_EOK)
86         {
87             /* there is no partition table */
88             part.offset = 0;
89             part.size   = 0;
90         }
91     }
92     else
93     {
94         /* there is no partition table */
95         part.offset = 0;
96         part.size   = 0;
97     }
98 
99     rt_device_register(&sd,
100         "sd", RT_DEVICE_FLAG_RDWR);
101 }
102