Merge pull request #1516 from zhuangwei123/master
[bsp/ls1cdev]SPI0添加CS0支持,移除drv_spi.c中的msd_init。SPI00可用于注册NORFLASH驱动
This commit is contained in:
commit
1781656301
|
@ -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
|
||||||
|
|
|
@ -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); // 写0,linux源码中是写0
|
reg_write_8(val & ~LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写0,linux源码中是写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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue