Bläddra i källkod

Merge pull request #1516 from zhuangwei123/master

[bsp/ls1cdev]SPI0添加CS0支持,移除drv_spi.c中的msd_init。SPI00可用于注册NORFLASH驱动
Bernard Xiong 7 år sedan
förälder
incheckning
1781656301
2 ändrade filer med 40 tillägg och 33 borttagningar
  1. 39 32
      bsp/ls1cdev/drivers/drv_spi.c
  2. 1 1
      bsp/ls1cdev/libraries/ls1c_spi.c

+ 39 - 32
bsp/ls1cdev/drivers/drv_spi.c

@@ -19,7 +19,8 @@
  *
  * Change Logs:
  * 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>
@@ -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 struct rt_spi_ops ls1c_spi_ops = 
+static struct rt_spi_ops ls1c_spi_ops =
 {
     .configure  = configure,
     .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_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控制器,master模式,关闭中断
+        // 浣胯兘SPI鎺у埗鍣�紝master妯″紡锛屽叧闂�腑鏂�
         reg_write_8(0x53, spi_base + LS1C_SPI_SPCR_OFFSET);
 
-        // 清空状态寄存器
+        // 娓呯┖鐘舵€佸瘎瀛樺櫒
         reg_write_8(0xc0, spi_base + LS1C_SPI_SPSR_OFFSET);
 
-        // 1字节产生中断,采样(读)与发送(写)时机同时
+        // 1瀛楄妭浜х敓涓�柇锛岄噰鏍�(璇�)涓庡彂閫�(鍐�)鏃舵満鍚屾椂
         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 &= 0xfe;
         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);
     }
-    
+
     // baudrate
     ls1c_spi_set_clock(spi_base, configuration->max_hz);
 
-    // 设置通信模式(时钟极性和相位)
+    // 璁剧疆閫氫俊妯″紡(鏃堕挓鏋佹€у拰鐩镐綅)
     if (configuration->mode & RT_SPI_CPOL)      // cpol
     {
         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_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);
     }
 
-    // 收发数据
+    // 鏀跺彂鏁版嵁
     send_ptr = message->send_buf;
     recv_ptr = message->recv_buf;
     while (size--)
@@ -180,7 +181,7 @@ static rt_uint32_t xfer(struct rt_spi_device *device,
 
 
 #ifdef RT_USING_SPI0
-struct ls1c_spi ls1c_spi0 = 
+struct ls1c_spi ls1c_spi0 =
 {
     .SPIx = LS1C_SPI_0,
 };
@@ -190,7 +191,7 @@ static struct rt_spi_bus spi0_bus;
 
 
 #ifdef RT_USING_SPI1
-struct ls1c_spi ls1c_spi1 = 
+struct ls1c_spi ls1c_spi1 =
 {
     .SPIx = LS1C_SPI_1,
 };
@@ -200,10 +201,10 @@ static struct rt_spi_bus spi1_bus;
 
 
 /*
- * 初始化并注册龙芯1c的spi总线
- * @SPI SPI总线,比如LS1C_SPI_0, LS1C_SPI_1
- * @spi_bus_name 总线名字
- * @ret 
+ * 鍒濆�鍖栧苟娉ㄥ唽榫欒姱1c鐨剆pi鎬荤嚎
+ * @SPI SPI鎬荤嚎锛屾瘮濡侺S1C_SPI_0锛� LS1C_SPI_1
+ * @spi_bus_name 鎬荤嚎鍚嶅瓧
+ * @ret
  */
 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(80, PIN_PURPOSE_OTHER);
     pin_set_purpose(83, PIN_PURPOSE_OTHER);//cs2 - SD card
-    pin_set_purpose(82, PIN_PURPOSE_OTHER);//cs1 
-    
-    pin_set_remap(78, PIN_REMAP_FOURTH);
-    pin_set_remap(79, PIN_REMAP_FOURTH);
-    pin_set_remap(80, PIN_REMAP_FOURTH);
-    pin_set_remap(83, PIN_REMAP_FOURTH);//cs2 - SD card
-    pin_set_remap(82, PIN_REMAP_FOURTH);//cs1 
-    ls1c_spi_bus_register(LS1C_SPI_0,"spi0");
+    pin_set_purpose(82, PIN_PURPOSE_OTHER);//cs1
+    pin_set_purpose(81, PIN_PURPOSE_OTHER);//cs0
+
+    pin_set_remap(78, PIN_REMAP_DEFAULT);
+    pin_set_remap(79, PIN_REMAP_DEFAULT);
+    pin_set_remap(80, PIN_REMAP_DEFAULT);
+    pin_set_remap(83, PIN_REMAP_DEFAULT);//cs2 - SD card
+    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
 
 #ifdef RT_USING_SPI1
@@ -254,7 +257,7 @@ int ls1c_hw_spi_init(void)
     pin_set_remap(47, PIN_REMAP_THIRD);
     pin_set_remap(48, PIN_REMAP_THIRD);
     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
 
@@ -262,31 +265,35 @@ int ls1c_hw_spi_init(void)
 #ifdef RT_USING_SPI0
     /* attach cs */
     {
+        static struct rt_spi_device spi_device0;
         static struct rt_spi_device spi_device1;
         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_cs2;
 
         /* spi02: CS2  SD Card*/
         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;
-        rt_spi_bus_attach_device(&spi_device1, "spi01", "spi0", (void*)&spi_cs1);
-        msd_init("sd0", "spi02");
+        rt_spi_bus_attach_device(&spi_device1, "spi01", "spi0", (void *)&spi_cs1);
+        spi_cs0.cs = LS1C_SPI_CS_0;
+        rt_spi_bus_attach_device(&spi_device0, "spi00", "spi0", (void *)&spi_cs0);
     }
 #endif
-#ifdef RT_USING_SPI1    
+#ifdef RT_USING_SPI1
     {
         static struct rt_spi_device spi_device;
         static struct ls1c_spi_cs  spi_cs;
 
         /* spi10: CS0  Touch*/
         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
 }
 
+
 INIT_BOARD_EXPORT(ls1c_hw_spi_init);
 
 #endif

+ 1 - 1
bsp/ls1cdev/libraries/ls1c_spi.c

@@ -260,7 +260,7 @@ inline void ls1c_spi_clear(void *spi_base)
     val = reg_read_8(spi_base + LS1C_SPI_SPSR_OFFSET);
     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);  // 写1,按照1c手册,应该写1
     }