Merge pull request #1516 from zhuangwei123/master

[bsp/ls1cdev]SPI0添加CS0支持,移除drv_spi.c中的msd_init。SPI00可用于注册NORFLASH驱动
This commit is contained in:
Bernard Xiong 2018-06-10 15:54:44 +08:00 committed by GitHub
commit 1781656301
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 33 deletions

View File

@ -19,7 +19,8 @@
* *
* Change Logs: * Change Logs:
* Date Author Notes * Date Author Notes
* 2017-11-02 first version * 2017-11-02 first version
* 2018-06-09 zhuangwei add spi0 cs0 support,remove msd_init
*/ */
#include <rtthread.h> #include <rtthread.h>
@ -42,14 +43,14 @@ static rt_err_t configure(struct rt_spi_device *device, struct rt_spi_configurat
static rt_uint32_t xfer(struct rt_spi_device *device, struct rt_spi_message *message); static rt_uint32_t xfer(struct rt_spi_device *device, struct rt_spi_message *message);
static struct rt_spi_ops ls1c_spi_ops = static struct rt_spi_ops ls1c_spi_ops =
{ {
.configure = configure, .configure = configure,
.xfer = xfer .xfer = xfer
}; };
static rt_err_t configure(struct rt_spi_device *device, static rt_err_t configure(struct rt_spi_device *device,
struct rt_spi_configuration *configuration) struct rt_spi_configuration *configuration)
{ {
struct rt_spi_bus *spi_bus = NULL; struct rt_spi_bus *spi_bus = NULL;
@ -69,28 +70,28 @@ static rt_err_t configure(struct rt_spi_device *device,
spi_base = ls1c_spi_get_base(SPIx); spi_base = ls1c_spi_get_base(SPIx);
{ {
// 使能SPI控制器master模式关闭中断 // 使能SPI控制器master模式关闭中断
reg_write_8(0x53, spi_base + LS1C_SPI_SPCR_OFFSET); reg_write_8(0x53, spi_base + LS1C_SPI_SPCR_OFFSET);
// 清空状态寄存器 // 清空状态寄存器
reg_write_8(0xc0, spi_base + LS1C_SPI_SPSR_OFFSET); reg_write_8(0xc0, spi_base + LS1C_SPI_SPSR_OFFSET);
// 1字节产生中断采样(读)与发送(写)时机同时 // 1字节产生中断采样(读)与发送(写)时机同时
reg_write_8(0x03, spi_base + LS1C_SPI_SPER_OFFSET); reg_write_8(0x03, spi_base + LS1C_SPI_SPER_OFFSET);
// 关闭SPI flash // 关闭SPI flash
val = reg_read_8(spi_base + LS1C_SPI_SFC_PARAM_OFFSET); val = reg_read_8(spi_base + LS1C_SPI_SFC_PARAM_OFFSET);
val &= 0xfe; val &= 0xfe;
reg_write_8(val, spi_base + LS1C_SPI_SFC_PARAM_OFFSET); reg_write_8(val, spi_base + LS1C_SPI_SFC_PARAM_OFFSET);
// spi flash时序控制寄存器 // spi flash时序控制寄存器
reg_write_8(0x05, spi_base + LS1C_SPI_SFC_TIMING_OFFSET); reg_write_8(0x05, spi_base + LS1C_SPI_SFC_TIMING_OFFSET);
} }
// baudrate // baudrate
ls1c_spi_set_clock(spi_base, configuration->max_hz); ls1c_spi_set_clock(spi_base, configuration->max_hz);
// 设置通信模式(时钟极性和相位) // 设置通信模式(时钟极性和相位)
if (configuration->mode & RT_SPI_CPOL) // cpol if (configuration->mode & RT_SPI_CPOL) // cpol
{ {
cpol = SPI_CPOL_1; cpol = SPI_CPOL_1;
@ -115,7 +116,7 @@ static rt_err_t configure(struct rt_spi_device *device,
} }
static rt_uint32_t xfer(struct rt_spi_device *device, static rt_uint32_t xfer(struct rt_spi_device *device,
struct rt_spi_message *message) struct rt_spi_message *message)
{ {
struct rt_spi_bus *spi_bus = NULL; struct rt_spi_bus *spi_bus = NULL;
@ -148,7 +149,7 @@ static rt_uint32_t xfer(struct rt_spi_device *device,
ls1c_spi_set_cs(spi_base, cs, 0); ls1c_spi_set_cs(spi_base, cs, 0);
} }
// 收发数据 // 收发数据
send_ptr = message->send_buf; send_ptr = message->send_buf;
recv_ptr = message->recv_buf; recv_ptr = message->recv_buf;
while (size--) while (size--)
@ -180,7 +181,7 @@ static rt_uint32_t xfer(struct rt_spi_device *device,
#ifdef RT_USING_SPI0 #ifdef RT_USING_SPI0
struct ls1c_spi ls1c_spi0 = struct ls1c_spi ls1c_spi0 =
{ {
.SPIx = LS1C_SPI_0, .SPIx = LS1C_SPI_0,
}; };
@ -190,7 +191,7 @@ static struct rt_spi_bus spi0_bus;
#ifdef RT_USING_SPI1 #ifdef RT_USING_SPI1
struct ls1c_spi ls1c_spi1 = struct ls1c_spi ls1c_spi1 =
{ {
.SPIx = LS1C_SPI_1, .SPIx = LS1C_SPI_1,
}; };
@ -200,10 +201,10 @@ static struct rt_spi_bus spi1_bus;
/* /*
* 1c的spi总线 * 1c的spi总线
* @SPI SPI总线LS1C_SPI_0 LS1C_SPI_1 * @SPI SPI总线LS1C_SPI_0 LS1C_SPI_1
* @spi_bus_name 线 * @spi_bus_name 线
* @ret * @ret
*/ */
rt_err_t ls1c_spi_bus_register(rt_uint8_t SPI, const char *spi_bus_name) rt_err_t ls1c_spi_bus_register(rt_uint8_t SPI, const char *spi_bus_name)
{ {
@ -235,14 +236,16 @@ int ls1c_hw_spi_init(void)
pin_set_purpose(79, PIN_PURPOSE_OTHER); pin_set_purpose(79, PIN_PURPOSE_OTHER);
pin_set_purpose(80, PIN_PURPOSE_OTHER); pin_set_purpose(80, PIN_PURPOSE_OTHER);
pin_set_purpose(83, PIN_PURPOSE_OTHER);//cs2 - SD card pin_set_purpose(83, PIN_PURPOSE_OTHER);//cs2 - SD card
pin_set_purpose(82, PIN_PURPOSE_OTHER);//cs1 pin_set_purpose(82, PIN_PURPOSE_OTHER);//cs1
pin_set_purpose(81, PIN_PURPOSE_OTHER);//cs0
pin_set_remap(78, PIN_REMAP_FOURTH);
pin_set_remap(79, PIN_REMAP_FOURTH); pin_set_remap(78, PIN_REMAP_DEFAULT);
pin_set_remap(80, PIN_REMAP_FOURTH); pin_set_remap(79, PIN_REMAP_DEFAULT);
pin_set_remap(83, PIN_REMAP_FOURTH);//cs2 - SD card pin_set_remap(80, PIN_REMAP_DEFAULT);
pin_set_remap(82, PIN_REMAP_FOURTH);//cs1 pin_set_remap(83, PIN_REMAP_DEFAULT);//cs2 - SD card
ls1c_spi_bus_register(LS1C_SPI_0,"spi0"); pin_set_remap(82, PIN_REMAP_DEFAULT);//CS1
pin_set_remap(81, PIN_REMAP_DEFAULT);//cs0
ls1c_spi_bus_register(LS1C_SPI_0, "spi0");
#endif #endif
#ifdef RT_USING_SPI1 #ifdef RT_USING_SPI1
@ -254,7 +257,7 @@ int ls1c_hw_spi_init(void)
pin_set_remap(47, PIN_REMAP_THIRD); pin_set_remap(47, PIN_REMAP_THIRD);
pin_set_remap(48, PIN_REMAP_THIRD); pin_set_remap(48, PIN_REMAP_THIRD);
pin_set_remap(49, PIN_REMAP_THIRD);//CS0 - touch screen pin_set_remap(49, PIN_REMAP_THIRD);//CS0 - touch screen
ls1c_spi_bus_register(LS1C_SPI_1,"spi1"); ls1c_spi_bus_register(LS1C_SPI_1, "spi1");
#endif #endif
@ -262,31 +265,35 @@ int ls1c_hw_spi_init(void)
#ifdef RT_USING_SPI0 #ifdef RT_USING_SPI0
/* attach cs */ /* attach cs */
{ {
static struct rt_spi_device spi_device0;
static struct rt_spi_device spi_device1; static struct rt_spi_device spi_device1;
static struct rt_spi_device spi_device2; static struct rt_spi_device spi_device2;
static struct ls1c_spi_cs spi_cs0;
static struct ls1c_spi_cs spi_cs1; static struct ls1c_spi_cs spi_cs1;
static struct ls1c_spi_cs spi_cs2; static struct ls1c_spi_cs spi_cs2;
/* spi02: CS2 SD Card*/ /* spi02: CS2 SD Card*/
spi_cs2.cs = LS1C_SPI_CS_2; spi_cs2.cs = LS1C_SPI_CS_2;
rt_spi_bus_attach_device(&spi_device2, "spi02", "spi0", (void*)&spi_cs2); rt_spi_bus_attach_device(&spi_device2, "spi02", "spi0", (void *)&spi_cs2);
spi_cs1.cs = LS1C_SPI_CS_1; spi_cs1.cs = LS1C_SPI_CS_1;
rt_spi_bus_attach_device(&spi_device1, "spi01", "spi0", (void*)&spi_cs1); rt_spi_bus_attach_device(&spi_device1, "spi01", "spi0", (void *)&spi_cs1);
msd_init("sd0", "spi02"); spi_cs0.cs = LS1C_SPI_CS_0;
rt_spi_bus_attach_device(&spi_device0, "spi00", "spi0", (void *)&spi_cs0);
} }
#endif #endif
#ifdef RT_USING_SPI1 #ifdef RT_USING_SPI1
{ {
static struct rt_spi_device spi_device; static struct rt_spi_device spi_device;
static struct ls1c_spi_cs spi_cs; static struct ls1c_spi_cs spi_cs;
/* spi10: CS0 Touch*/ /* spi10: CS0 Touch*/
spi_cs.cs = LS1C_SPI_CS_0; spi_cs.cs = LS1C_SPI_CS_0;
rt_spi_bus_attach_device(&spi_device, "spi10", "spi1", (void*)&spi_cs); rt_spi_bus_attach_device(&spi_device, "spi10", "spi1", (void *)&spi_cs);
} }
#endif #endif
} }
INIT_BOARD_EXPORT(ls1c_hw_spi_init); INIT_BOARD_EXPORT(ls1c_hw_spi_init);
#endif #endif

View File

@ -260,7 +260,7 @@ inline void ls1c_spi_clear(void *spi_base)
val = reg_read_8(spi_base + LS1C_SPI_SPSR_OFFSET); val = reg_read_8(spi_base + LS1C_SPI_SPSR_OFFSET);
if (LS1C_SPI_SPSR_WCOL_MASK & val) if (LS1C_SPI_SPSR_WCOL_MASK & val)
{ {
rt_kprintf("[%s] clear register SPSR's wcol!\r\n"); // 手册和linux源码中不一样加个打印看看 rt_kprintf("[%s] clear register SPSR's wcol!\r\n",__FUNCTION__); // 手册和linux源码中不一样加个打印看看
reg_write_8(val & ~LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写0linux源码中是写0 reg_write_8(val & ~LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写0linux源码中是写0
// reg_write_8(val | LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写1按照1c手册应该写1 // reg_write_8(val | LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写1按照1c手册应该写1
} }