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