Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
逝缘~
rt-thread
提交
a5119d69
R
rt-thread
项目概览
逝缘~
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a5119d69
编写于
8月 27, 2014
作者:
B
Bernard Xiong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[BSP] Add RT_DEVICE_CTRL_BLK_GETGEOME command handling in device control of LPC176x bsp
上级
7f45ac18
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
450 addition
and
378 deletion
+450
-378
bsp/lpc176x/drivers/sd.c
bsp/lpc176x/drivers/sd.c
+417
-346
bsp/lpc176x/drivers/sd.h
bsp/lpc176x/drivers/sd.h
+33
-32
未找到文件。
bsp/lpc176x/drivers/sd.c
浏览文件 @
a5119d69
...
...
@@ -19,65 +19,78 @@ static struct rt_device sdcard_device;
static
struct
dfs_partition
part
;
/* Local Function Prototypes */
static
bool
LPC17xx_SD_Init
(
void
);
static
uint8_t
LPC17xx_SD_SendCmd
(
uint8_t
cmd
,
uint32_t
arg
);
static
bool
LPC17xx_SD_ReadSector
(
uint32_t
sector
,
uint8_t
*
buff
,
uint32_t
count
);
static
bool
LPC17xx_SD_ReadDataBlock
(
uint8_t
*
buff
,
uint32_t
cnt
);
static
bool
LPC17xx_SD_WriteSector
(
uint32_t
sector
,
const
uint8_t
*
buff
,
uint32_t
count
);
static
bool
LPC17xx_SD_WirteDataBlock
(
const
uint8_t
*
buff
,
uint8_t
token
);
static
bool
LPC17xx_SD_ReadCfg
(
SDCFG
*
cfg
);
static
bool
LPC17xx_SD_WaitForReady
(
void
);
static
bool
LPC17xx_SD_Init
(
void
);
static
uint8_t
LPC17xx_SD_SendCmd
(
uint8_t
cmd
,
uint32_t
arg
);
static
bool
LPC17xx_SD_ReadSector
(
uint32_t
sector
,
uint8_t
*
buff
,
uint32_t
count
);
static
bool
LPC17xx_SD_ReadDataBlock
(
uint8_t
*
buff
,
uint32_t
cnt
);
static
bool
LPC17xx_SD_WriteSector
(
uint32_t
sector
,
const
uint8_t
*
buff
,
uint32_t
count
);
static
bool
LPC17xx_SD_WirteDataBlock
(
const
uint8_t
*
buff
,
uint8_t
token
);
static
bool
LPC17xx_SD_ReadCfg
(
SDCFG
*
cfg
);
static
bool
LPC17xx_SD_WaitForReady
(
void
);
/* wait until the card is not busy */
static
bool
LPC17xx_SD_WaitForReady
(
void
)
static
bool
LPC17xx_SD_WaitForReady
(
void
)
{
uint8_t
res
;
/* timeout should be large enough to make sure the write operaion can be completed. */
uint32_t
timeout
=
400000
;
LPC17xx_SPI_SendByte
(
0xFF
);
do
{
do
{
res
=
LPC17xx_SPI_RecvByte
();
}
while
((
res
!=
0xFF
)
&&
timeout
--
);
}
while
((
res
!=
0xFF
)
&&
timeout
--
);
return
(
res
==
0xFF
?
true
:
false
);
}
/* Initialize SD/MMC card. */
static
bool
LPC17xx_SD_Init
(
void
)
static
bool
LPC17xx_SD_Init
(
void
)
{
uint32_t
i
,
timeout
;
uint8_t
cmd
,
ct
,
ocr
[
4
];
bool
ret
=
false
;
/* Initialize SPI interface and enable Flash Card SPI mode. */
LPC17xx_SPI_Init
();
LPC17xx_SPI_Init
();
/* At least 74 clock cycles are required prior to starting bus communication */
for
(
i
=
0
;
i
<
80
;
i
++
)
{
/* 80 dummy clocks */
LPC17xx_SPI_SendByte
(
0xFF
);
for
(
i
=
0
;
i
<
80
;
i
++
)
/* 80 dummy clocks */
{
LPC17xx_SPI_SendByte
(
0xFF
);
}
ct
=
CT_NONE
;
if
(
LPC17xx_SD_SendCmd
(
GO_IDLE_STATE
,
0
)
==
0x1
)
if
(
LPC17xx_SD_SendCmd
(
GO_IDLE_STATE
,
0
)
==
0x1
)
{
timeout
=
50000
;
if
(
LPC17xx_SD_SendCmd
(
CMD8
,
0x1AA
)
==
1
)
{
/* SDHC */
if
(
LPC17xx_SD_SendCmd
(
CMD8
,
0x1AA
)
==
1
)
/* SDHC */
{
/* Get trailing return value of R7 resp */
for
(
i
=
0
;
i
<
4
;
i
++
)
ocr
[
i
]
=
LPC17xx_SPI_RecvByte
();
if
(
ocr
[
2
]
==
0x01
&&
ocr
[
3
]
==
0xAA
)
{
/* The card can work at vdd range of 2.7-3.6V */
if
(
ocr
[
2
]
==
0x01
&&
ocr
[
3
]
==
0xAA
)
/* The card can work at vdd range of 2.7-3.6V */
{
/* Wait for leaving idle state (ACMD41 with HCS bit) */
while
(
timeout
--
&&
LPC17xx_SD_SendCmd
(
SD_SEND_OP_COND
,
1UL
<<
30
));
/* Check CCS bit in the OCR */
if
(
timeout
&&
LPC17xx_SD_SendCmd
(
READ_OCR
,
0
)
==
0
)
{
if
(
timeout
&&
LPC17xx_SD_SendCmd
(
READ_OCR
,
0
)
==
0
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
ocr
[
i
]
=
LPC17xx_SPI_RecvByte
();
ct
=
(
ocr
[
0
]
&
0x40
)
?
CT_SD2
|
CT_BLOCK
:
CT_SD2
;
}
}
else
{
/* SDSC or MMC */
if
(
LPC17xx_SD_SendCmd
(
SD_SEND_OP_COND
,
0
)
<=
1
)
{
ct
=
CT_SD1
;
cmd
=
SD_SEND_OP_COND
;
/* SDSC */
}
else
{
ct
=
CT_MMC
;
cmd
=
SEND_OP_COND
;
/* MMC */
}
else
/* SDSC or MMC */
{
if
(
LPC17xx_SD_SendCmd
(
SD_SEND_OP_COND
,
0
)
<=
1
)
{
ct
=
CT_SD1
;
cmd
=
SD_SEND_OP_COND
;
/* SDSC */
}
else
{
ct
=
CT_MMC
;
cmd
=
SEND_OP_COND
;
/* MMC */
}
/* Wait for leaving idle state */
while
(
timeout
--
&&
LPC17xx_SD_SendCmd
(
cmd
,
0
));
...
...
@@ -86,11 +99,17 @@ static bool LPC17xx_SD_Init (void)
ct
=
CT_NONE
;
}
}
else
{
/* SDSC or MMC */
if
(
LPC17xx_SD_SendCmd
(
SD_SEND_OP_COND
,
0
)
<=
1
)
{
ct
=
CT_SD1
;
cmd
=
SD_SEND_OP_COND
;
/* SDSC */
}
else
{
ct
=
CT_MMC
;
cmd
=
SEND_OP_COND
;
/* MMC */
else
/* SDSC or MMC */
{
if
(
LPC17xx_SD_SendCmd
(
SD_SEND_OP_COND
,
0
)
<=
1
)
{
ct
=
CT_SD1
;
cmd
=
SD_SEND_OP_COND
;
/* SDSC */
}
else
{
ct
=
CT_MMC
;
cmd
=
SEND_OP_COND
;
/* MMC */
}
/* Wait for leaving idle state */
while
(
timeout
--
&&
LPC17xx_SD_SendCmd
(
cmd
,
0
));
...
...
@@ -102,16 +121,22 @@ static bool LPC17xx_SD_Init (void)
CardType
=
ct
;
LPC17xx_SPI_Release
();
if
(
ct
)
{
/* Initialization succeeded */
if
(
ct
)
/* Initialization succeeded */
{
ret
=
true
;
if
(
ct
==
CT_MMC
)
{
if
(
ct
==
CT_MMC
)
{
LPC17xx_SPI_SetSpeed
(
SPI_SPEED_20MHz
);
}
else
{
}
else
{
LPC17xx_SPI_SetSpeed
(
SPI_SPEED_20MHz
);
}
}
else
{
/* Initialization failed */
LPC17xx_SPI_Select
();
LPC17xx_SD_WaitForReady
();
}
else
/* Initialization failed */
{
LPC17xx_SPI_Select
();
LPC17xx_SD_WaitForReady
();
LPC17xx_SPI_DeInit
();
}
...
...
@@ -124,11 +149,12 @@ static bool LPC17xx_SD_Init (void)
arg: argument for the cmd
return the received response of the commond
*****************************************************************************/
static
uint8_t
LPC17xx_SD_SendCmd
(
uint8_t
cmd
,
uint32_t
arg
)
static
uint8_t
LPC17xx_SD_SendCmd
(
uint8_t
cmd
,
uint32_t
arg
)
{
uint32_t
r1
,
n
;
if
(
cmd
&
0x80
)
{
/* ACMD<n> is the command sequence of CMD55-CMD<n> */
if
(
cmd
&
0x80
)
/* ACMD<n> is the command sequence of CMD55-CMD<n> */
{
cmd
&=
0x7F
;
r1
=
LPC17xx_SD_SendCmd
(
APP_CMD
,
0
);
/* CMD55 */
if
(
r1
>
1
)
return
r1
;
/* cmd send failed */
...
...
@@ -137,26 +163,28 @@ static uint8_t LPC17xx_SD_SendCmd (uint8_t cmd, uint32_t arg)
/* Select the card and wait for ready */
LPC17xx_SPI_DeSelect
();
LPC17xx_SPI_Select
();
if
(
LPC17xx_SD_WaitForReady
()
==
false
)
return
0xFF
;
LPC17xx_SPI_SendByte
(
0xFF
);
/* prepare 8 clocks */
LPC17xx_SPI_SendByte
(
cmd
);
LPC17xx_SPI_SendByte
(
arg
>>
24
);
LPC17xx_SPI_SendByte
(
arg
>>
16
);
LPC17xx_SPI_SendByte
(
arg
>>
8
);
LPC17xx_SPI_SendByte
(
arg
);
if
(
LPC17xx_SD_WaitForReady
()
==
false
)
return
0xFF
;
LPC17xx_SPI_SendByte
(
0xFF
);
/* prepare 8 clocks */
LPC17xx_SPI_SendByte
(
cmd
);
LPC17xx_SPI_SendByte
(
arg
>>
24
);
LPC17xx_SPI_SendByte
(
arg
>>
16
);
LPC17xx_SPI_SendByte
(
arg
>>
8
);
LPC17xx_SPI_SendByte
(
arg
);
/* Checksum, should only be valid for the first command.CMD0 */
n
=
0x01
;
/* Dummy CRC + Stop */
if
(
cmd
==
GO_IDLE_STATE
)
n
=
0x95
;
/* Valid CRC for CMD0(0) */
if
(
cmd
==
CMD8
)
n
=
0x87
;
/* Valid CRC for CMD8(0x1AA) */
LPC17xx_SPI_SendByte
(
n
);
if
(
cmd
==
STOP_TRAN
)
LPC17xx_SPI_RecvByte
();
/* Skip a stuff byte when stop reading */
if
(
cmd
==
STOP_TRAN
)
LPC17xx_SPI_RecvByte
();
/* Skip a stuff byte when stop reading */
n
=
10
;
/* Wait for a valid response in timeout of 10 attempts */
do
{
r1
=
LPC17xx_SPI_RecvByte
();
}
while
((
r1
&
0x80
)
&&
--
n
);
do
{
r1
=
LPC17xx_SPI_RecvByte
();
}
while
((
r1
&
0x80
)
&&
--
n
);
return
(
r1
);
/* Return with the response value */
}
...
...
@@ -166,21 +194,27 @@ static uint8_t LPC17xx_SD_SendCmd (uint8_t cmd, uint32_t arg)
buff <- [sector, sector+1, ... sector+count-1]
if success, return true, otherwise return false
*****************************************************************************/
static
bool
LPC17xx_SD_ReadSector
(
uint32_t
sector
,
uint8_t
*
buff
,
uint32_t
count
)
static
bool
LPC17xx_SD_ReadSector
(
uint32_t
sector
,
uint8_t
*
buff
,
uint32_t
count
)
{
/* Convert to byte address if needed */
if
(
!
(
CardType
&
CT_BLOCK
))
sector
*=
SD_SECTOR_SIZE
;
if
(
count
==
1
)
{
/* Single block read */
if
(
count
==
1
)
/* Single block read */
{
if
((
LPC17xx_SD_SendCmd
(
READ_BLOCK
,
sector
)
==
0
)
&&
LPC17xx_SD_ReadDataBlock
(
buff
,
SD_SECTOR_SIZE
))
count
=
0
;
}
else
{
/* Multiple block read */
if
(
LPC17xx_SD_SendCmd
(
READ_MULT_BLOCK
,
sector
)
==
0
)
{
do
{
}
else
/* Multiple block read */
{
if
(
LPC17xx_SD_SendCmd
(
READ_MULT_BLOCK
,
sector
)
==
0
)
{
do
{
if
(
!
LPC17xx_SD_ReadDataBlock
(
buff
,
SD_SECTOR_SIZE
))
break
;
buff
+=
SD_SECTOR_SIZE
;
}
while
(
--
count
);
}
while
(
--
count
);
LPC17xx_SD_SendCmd
(
STOP_TRAN
,
0
);
/* STOP_TRANSMISSION */
}
}
...
...
@@ -194,29 +228,33 @@ static bool LPC17xx_SD_ReadSector (uint32_t sector, uint8_t *buff, uint32_t coun
buff: Data buffer to store received data
cnt: Byte count (must be multiple of 4, normally 512)
*****************************************************************************/
static
bool
LPC17xx_SD_ReadDataBlock
(
uint8_t
*
buff
,
uint32_t
cnt
)
static
bool
LPC17xx_SD_ReadDataBlock
(
uint8_t
*
buff
,
uint32_t
cnt
)
{
uint8_t
token
;
uint32_t
timeout
;
timeout
=
20000
;
do
{
/* Wait for data packet in timeout of 100ms */
do
/* Wait for data packet in timeout of 100ms */
{
token
=
LPC17xx_SPI_RecvByte
();
}
while
((
token
==
0xFF
)
&&
timeout
--
);
if
(
token
!=
0xFE
)
return
false
;
/* If not valid data token, return with error */
}
while
((
token
==
0xFF
)
&&
timeout
--
);
if
(
token
!=
0xFE
)
return
false
;
/* If not valid data token, return with error */
#if USE_FIFO
LPC17xx_SPI_RecvBlock_FIFO
(
buff
,
cnt
);
LPC17xx_SPI_RecvBlock_FIFO
(
buff
,
cnt
);
#else
do
{
/* Receive the data block into buffer */
*
buff
++
=
LPC17xx_SPI_RecvByte
();
*
buff
++
=
LPC17xx_SPI_RecvByte
();
*
buff
++
=
LPC17xx_SPI_RecvByte
();
*
buff
++
=
LPC17xx_SPI_RecvByte
();
}
while
(
cnt
-=
4
);
do
/* Receive the data block into buffer */
{
*
buff
++
=
LPC17xx_SPI_RecvByte
();
*
buff
++
=
LPC17xx_SPI_RecvByte
();
*
buff
++
=
LPC17xx_SPI_RecvByte
();
*
buff
++
=
LPC17xx_SPI_RecvByte
();
}
while
(
cnt
-=
4
);
#endif
/* USE_FIFO */
LPC17xx_SPI_RecvByte
();
/* Discard CRC */
LPC17xx_SPI_RecvByte
();
LPC17xx_SPI_RecvByte
();
/* Discard CRC */
LPC17xx_SPI_RecvByte
();
return
true
;
/* Return with success */
}
...
...
@@ -226,27 +264,33 @@ static bool LPC17xx_SD_ReadDataBlock ( uint8_t *buff, uint32_t cnt)
buff -> [sector, sector+1, ... sector+count-1]
if success, return true, otherwise return false
*****************************************************************************/
static
bool
LPC17xx_SD_WriteSector
(
uint32_t
sector
,
const
uint8_t
*
buff
,
uint32_t
count
)
static
bool
LPC17xx_SD_WriteSector
(
uint32_t
sector
,
const
uint8_t
*
buff
,
uint32_t
count
)
{
if
(
!
(
CardType
&
CT_BLOCK
))
sector
*=
512
;
/* Convert to byte address if needed */
if
(
count
==
1
)
{
/* Single block write */
if
(
count
==
1
)
/* Single block write */
{
if
((
LPC17xx_SD_SendCmd
(
WRITE_BLOCK
,
sector
)
==
0
)
&&
LPC17xx_SD_WirteDataBlock
(
buff
,
TOKEN_SINGLE_BLOCK
))
count
=
0
;
}
else
{
/* Multiple block write */
}
else
/* Multiple block write */
{
if
(
CardType
&
CT_SDC
)
LPC17xx_SD_SendCmd
(
SET_WR_BLK_ERASE_COUNT
,
count
);
if
(
LPC17xx_SD_SendCmd
(
WRITE_MULT_BLOCK
,
sector
)
==
0
)
{
do
{
if
(
LPC17xx_SD_SendCmd
(
WRITE_MULT_BLOCK
,
sector
)
==
0
)
{
do
{
if
(
!
LPC17xx_SD_WirteDataBlock
(
buff
,
TOKEN_MULTI_BLOCK
))
break
;
buff
+=
512
;
}
while
(
--
count
);
#if 1
}
while
(
--
count
);
#if 1
if
(
!
LPC17xx_SD_WirteDataBlock
(
0
,
TOKEN_STOP_TRAN
))
/* STOP_TRAN token */
count
=
1
;
#else
#else
LPC17xx_SPI_SendByte
(
TOKEN_STOP_TRAN
);
#endif
#endif
}
}
LPC17xx_SPI_Release
();
...
...
@@ -260,24 +304,26 @@ static bool LPC17xx_SD_WriteSector (uint32_t sector, const uint8_t *buff, uint32
0xFC -> multi block
0xFD -> Stop
*****************************************************************************/
static
bool
LPC17xx_SD_WirteDataBlock
(
const
uint8_t
*
buff
,
uint8_t
token
)
static
bool
LPC17xx_SD_WirteDataBlock
(
const
uint8_t
*
buff
,
uint8_t
token
)
{
uint8_t
resp
,
i
;
i
=
i
;
// avoid warning
LPC17xx_SPI_SendByte
(
token
);
/* send data token first*/
LPC17xx_SPI_SendByte
(
token
);
/* send data token first*/
if
(
token
!=
TOKEN_STOP_TRAN
)
{
if
(
token
!=
TOKEN_STOP_TRAN
)
{
#if USE_FIFO
LPC17xx_SPI_SendBlock_FIFO
(
buff
);
LPC17xx_SPI_SendBlock_FIFO
(
buff
);
#else
/* Send data. */
for
(
i
=
512
/
4
;
i
;
i
--
)
{
LPC17xx_SPI_SendByte
(
*
buff
++
);
LPC17xx_SPI_SendByte
(
*
buff
++
);
LPC17xx_SPI_SendByte
(
*
buff
++
);
LPC17xx_SPI_SendByte
(
*
buff
++
);
for
(
i
=
512
/
4
;
i
;
i
--
)
{
LPC17xx_SPI_SendByte
(
*
buff
++
);
LPC17xx_SPI_SendByte
(
*
buff
++
);
LPC17xx_SPI_SendByte
(
*
buff
++
);
LPC17xx_SPI_SendByte
(
*
buff
++
);
}
#endif
/* USE_FIFO */
LPC17xx_SPI_SendByte
(
0xFF
);
/* 16-bit CRC (Dummy) */
...
...
@@ -287,7 +333,7 @@ static bool LPC17xx_SD_WirteDataBlock (const uint8_t *buff, uint8_t token)
if
((
resp
&
0x1F
)
!=
0x05
)
/* If not accepted, return with error */
return
false
;
if
(
LPC17xx_SD_WaitForReady
()
==
false
)
/* Wait while Flash Card is busy. */
if
(
LPC17xx_SD_WaitForReady
()
==
false
)
/* Wait while Flash Card is busy. */
return
false
;
}
...
...
@@ -295,7 +341,7 @@ static bool LPC17xx_SD_WirteDataBlock (const uint8_t *buff, uint8_t token)
}
/* Read MMC/SD Card device configuration. */
static
bool
LPC17xx_SD_ReadCfg
(
SDCFG
*
cfg
)
static
bool
LPC17xx_SD_ReadCfg
(
SDCFG
*
cfg
)
{
uint8_t
i
;
uint16_t
csize
;
...
...
@@ -303,26 +349,29 @@ static bool LPC17xx_SD_ReadCfg (SDCFG *cfg)
bool
retv
=
false
;
/* Read the OCR - Operations Condition Register. */
if
(
LPC17xx_SD_SendCmd
(
READ_OCR
,
0
)
!=
0x00
)
goto
x
;
for
(
i
=
0
;
i
<
4
;
i
++
)
cfg
->
ocr
[
i
]
=
LPC17xx_SPI_RecvByte
();
if
(
LPC17xx_SD_SendCmd
(
READ_OCR
,
0
)
!=
0x00
)
goto
x
;
for
(
i
=
0
;
i
<
4
;
i
++
)
cfg
->
ocr
[
i
]
=
LPC17xx_SPI_RecvByte
();
/* Read the CID - Card Identification. */
if
((
LPC17xx_SD_SendCmd
(
SEND_CID
,
0
)
!=
0x00
)
||
(
LPC17xx_SD_ReadDataBlock
(
cfg
->
cid
,
16
)
==
false
))
if
((
LPC17xx_SD_SendCmd
(
SEND_CID
,
0
)
!=
0x00
)
||
(
LPC17xx_SD_ReadDataBlock
(
cfg
->
cid
,
16
)
==
false
))
goto
x
;
/* Read the CSD - Card Specific Data. */
if
((
LPC17xx_SD_SendCmd
(
SEND_CSD
,
0
)
!=
0x00
)
||
(
LPC17xx_SD_ReadDataBlock
(
cfg
->
csd
,
16
)
==
false
))
if
((
LPC17xx_SD_SendCmd
(
SEND_CSD
,
0
)
!=
0x00
)
||
(
LPC17xx_SD_ReadDataBlock
(
cfg
->
csd
,
16
)
==
false
))
goto
x
;
cfg
->
sectorsize
=
SD_SECTOR_SIZE
;
/* Get number of sectors on the disk (DWORD) */
if
((
cfg
->
csd
[
0
]
>>
6
)
==
1
)
{
/* SDC ver 2.00 */
if
((
cfg
->
csd
[
0
]
>>
6
)
==
1
)
/* SDC ver 2.00 */
{
csize
=
cfg
->
csd
[
9
]
+
((
uint16_t
)
cfg
->
csd
[
8
]
<<
8
)
+
1
;
cfg
->
sectorcnt
=
(
uint32_t
)
csize
<<
10
;
}
else
{
/* SDC ver 1.XX or MMC*/
}
else
/* SDC ver 1.XX or MMC*/
{
n
=
(
cfg
->
csd
[
5
]
&
15
)
+
((
cfg
->
csd
[
10
]
&
128
)
>>
7
)
+
((
cfg
->
csd
[
9
]
&
3
)
<<
1
)
+
2
;
// 19
csize
=
(
cfg
->
csd
[
8
]
>>
6
)
+
((
uint16_t
)
cfg
->
csd
[
7
]
<<
2
)
+
((
uint16_t
)(
cfg
->
csd
[
6
]
&
3
)
<<
10
)
+
1
;
// 3752
cfg
->
sectorcnt
=
(
uint32_t
)
csize
<<
(
n
-
9
);
// 3842048
...
...
@@ -331,20 +380,29 @@ static bool LPC17xx_SD_ReadCfg (SDCFG *cfg)
cfg
->
size
=
cfg
->
sectorcnt
*
cfg
->
sectorsize
;
// 512*3842048=1967128576Byte (1.83GB)
/* Get erase block size in unit of sector (DWORD) */
if
(
CardType
&
CT_SD2
)
{
/* SDC ver 2.00 */
if
(
LPC17xx_SD_SendCmd
(
SD_STATUS
/*ACMD13*/
,
0
)
==
0
)
{
/* Read SD status */
if
(
CardType
&
CT_SD2
)
/* SDC ver 2.00 */
{
if
(
LPC17xx_SD_SendCmd
(
SD_STATUS
/*ACMD13*/
,
0
)
==
0
)
/* Read SD status */
{
LPC17xx_SPI_RecvByte
();
if
(
LPC17xx_SD_ReadDataBlock
(
csd
,
16
))
{
/* Read partial block */
if
(
LPC17xx_SD_ReadDataBlock
(
csd
,
16
))
/* Read partial block */
{
for
(
n
=
64
-
16
;
n
;
n
--
)
LPC17xx_SPI_RecvByte
();
/* Purge trailing data */
cfg
->
blocksize
=
16UL
<<
(
csd
[
10
]
>>
4
);
retv
=
true
;
}
}
}
else
{
/* SDC ver 1.XX or MMC */
if
((
LPC17xx_SD_SendCmd
(
SEND_CSD
,
0
)
==
0
)
&&
LPC17xx_SD_ReadDataBlock
(
csd
,
16
))
{
/* Read CSD */
if
(
CardType
&
CT_SD1
)
{
/* SDC ver 1.XX */
}
else
/* SDC ver 1.XX or MMC */
{
if
((
LPC17xx_SD_SendCmd
(
SEND_CSD
,
0
)
==
0
)
&&
LPC17xx_SD_ReadDataBlock
(
csd
,
16
))
/* Read CSD */
{
if
(
CardType
&
CT_SD1
)
/* SDC ver 1.XX */
{
cfg
->
blocksize
=
(((
csd
[
10
]
&
63
)
<<
1
)
+
((
uint16_t
)(
csd
[
11
]
&
128
)
>>
7
)
+
1
)
<<
((
csd
[
13
]
>>
6
)
-
1
);
}
else
{
/* MMC */
}
else
/* MMC */
{
// cfg->blocksize = ((uint16_t)((buf[10] & 124) >> 2) + 1) * (((buf[11] & 3) << 3) + ((buf[11] & 224) >> 5) + 1);
cfg
->
blocksize
=
((
uint16_t
)((
cfg
->
csd
[
10
]
&
124
)
>>
2
)
+
1
)
*
(((
cfg
->
csd
[
10
]
&
3
)
<<
3
)
+
((
cfg
->
csd
[
11
]
&
224
)
>>
5
)
+
1
);
}
...
...
@@ -352,7 +410,8 @@ static bool LPC17xx_SD_ReadCfg (SDCFG *cfg)
}
}
x:
LPC17xx_SPI_Release
();
x:
LPC17xx_SPI_Release
();
return
(
retv
);
}
...
...
@@ -371,7 +430,7 @@ static rt_err_t rt_sdcard_close(rt_device_t dev)
return
RT_EOK
;
}
static
rt_size_t
rt_sdcard_read
(
rt_device_t
dev
,
rt_off_t
pos
,
void
*
buffer
,
rt_size_t
size
)
static
rt_size_t
rt_sdcard_read
(
rt_device_t
dev
,
rt_off_t
pos
,
void
*
buffer
,
rt_size_t
size
)
{
bool
status
;
...
...
@@ -383,7 +442,7 @@ static rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_
return
0
;
}
static
rt_size_t
rt_sdcard_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
rt_size_t
size
)
static
rt_size_t
rt_sdcard_write
(
rt_device_t
dev
,
rt_off_t
pos
,
const
void
*
buffer
,
rt_size_t
size
)
{
bool
status
;
...
...
@@ -397,6 +456,18 @@ static rt_size_t rt_sdcard_write (rt_device_t dev, rt_off_t pos, const void* buf
static
rt_err_t
rt_sdcard_control
(
rt_device_t
dev
,
rt_uint8_t
cmd
,
void
*
args
)
{
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
=
SDCfg
.
sectorsize
;
geometry
->
block_size
=
SDCfg
.
blocksize
;
geometry
->
sector_count
=
SDCfg
.
sectorcnt
;
}
return
RT_EOK
;
}
...
...
@@ -408,7 +479,7 @@ void rt_hw_sdcard_init()
rt_uint8_t
*
sector
;
/* get the first sector to read partition table */
sector
=
(
rt_uint8_t
*
)
rt_malloc
(
512
);
sector
=
(
rt_uint8_t
*
)
rt_malloc
(
512
);
if
(
sector
==
RT_NULL
)
{
rt_kprintf
(
"allocate partition sector buffer failed
\n
"
);
...
...
bsp/lpc176x/drivers/sd.h
浏览文件 @
a5119d69
...
...
@@ -31,7 +31,8 @@
#define CT_BLOCK 0x08
/* MMC device configuration */
typedef
struct
tagSDCFG
{
typedef
struct
tagSDCFG
{
uint32_t
sernum
;
// serial number
uint32_t
size
;
// size=sectorsize*sectorcnt
uint32_t
sectorcnt
;
//
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录