forked from xuos/xiuos
				
			add lcd and spi for edu_riscv64 board
This commit is contained in:
		
							parent
							
								
									db2faeeba6
								
							
						
					
					
						commit
						166f88fd46
					
				| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
SRC_FILES := lv_init.c lv_demo.c lv_demo_calendar.c 
 | 
					SRC_FILES := lv_init.c lv_demo.c lv_demo_calendar.c 
 | 
				
			||||||
SRC_FILES += lv_sensor_info.c lv_sensor_update_info.c lv_sensor_info_update_demo.c
 | 
					# SRC_FILES += lv_sensor_info.c lv_sensor_update_info.c lv_sensor_info_update_demo.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(KERNEL_ROOT)/compiler.mk
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ static void event_handler(lv_event_t * e)
 | 
				
			||||||
void lv_demo_calendar(void)
 | 
					void lv_demo_calendar(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    lv_obj_t  * calendar = lv_calendar_create(lv_scr_act());
 | 
					    lv_obj_t  * calendar = lv_calendar_create(lv_scr_act());
 | 
				
			||||||
    lv_obj_set_size(calendar, 800, 480);//lv_obj_set_size(calendar, 800, 480);
 | 
					    lv_obj_set_size(calendar, 320, 320);//lv_obj_set_size(calendar, 800, 480);
 | 
				
			||||||
    lv_obj_align(calendar, LV_ALIGN_CENTER, 0, 0);
 | 
					    lv_obj_align(calendar, LV_ALIGN_CENTER, 0, 0);
 | 
				
			||||||
    lv_obj_add_event_cb(calendar, event_handler, LV_EVENT_ALL, NULL);
 | 
					    lv_obj_add_event_cb(calendar, event_handler, LV_EVENT_ALL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,23 +15,23 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* @file board.c
 | 
					* @file board.c
 | 
				
			||||||
* @brief support aiit-riscv64-board init configure and start-up
 | 
					* @brief support edu-riscv64 board init configure and start-up
 | 
				
			||||||
* @version 1.0 
 | 
					* @version 1.0 
 | 
				
			||||||
* @author AIIT XUOS Lab
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
* @date 2021-04-25
 | 
					* @date 2022-10-25
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*************************************************
 | 
					/*************************************************
 | 
				
			||||||
File name: board.c
 | 
					File name: board.c
 | 
				
			||||||
Description: support aiit-riscv64-board init configure and driver/task/... init
 | 
					Description: support edu-riscv64 board init configure and driver/task/... init
 | 
				
			||||||
Others: https://canaan-creative.com/developer
 | 
					Others: https://canaan-creative.com/developer
 | 
				
			||||||
History: 
 | 
					History: 
 | 
				
			||||||
1. Date: 2021-04-25
 | 
					1. Date: 2022-10-25
 | 
				
			||||||
Author: AIIT XUOS Lab
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
Modification: 
 | 
					Modification: 
 | 
				
			||||||
1. support aiit-riscv64-board InitBoardHardware
 | 
					1. support edu-riscv64 board InitBoardHardware
 | 
				
			||||||
2. support aiit-riscv64-board Kd233Start
 | 
					2. support edu-riscv64 board Kd233Start
 | 
				
			||||||
3. support aiit-riscv64-board shell cmd, include reboot, shutdown
 | 
					3. support edu-riscv64 board shell cmd, include reboot, shutdown
 | 
				
			||||||
*************************************************/
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <board.h>
 | 
					#include <board.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,21 +10,21 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* @file drv_io_config.c
 | 
					* @file drv_io_config.c
 | 
				
			||||||
* @brief support aiit-riscv64-board io configure
 | 
					* @brief support edu-riscv64 board io configure
 | 
				
			||||||
* @version 1.0 
 | 
					* @version 1.0 
 | 
				
			||||||
* @author AIIT XUOS Lab
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
* @date 2021-04-25
 | 
					* @date 2022-10-25
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*************************************************
 | 
					/*************************************************
 | 
				
			||||||
File name: drv_io_config.c
 | 
					File name: drv_io_config.c
 | 
				
			||||||
Description: support aiit-riscv64-board io configure
 | 
					Description: support edu-riscv64 board io configure
 | 
				
			||||||
Others: take RT-Thread v4.0.2/bsp/k210/driver/drv_io_config.c for references
 | 
					Others: take RT-Thread v4.0.2/bsp/k210/driver/drv_io_config.c for references
 | 
				
			||||||
                https://github.com/RT-Thread/rt-thread/tree/v4.0.2
 | 
					                https://github.com/RT-Thread/rt-thread/tree/v4.0.2
 | 
				
			||||||
History: 
 | 
					History: 
 | 
				
			||||||
1. Date: 2021-04-25
 | 
					1. Date: 2022-10-25
 | 
				
			||||||
Author: AIIT XUOS Lab
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
Modification: support aiit-riscv64-board io configure
 | 
					Modification: support edu-riscv64 board io configure
 | 
				
			||||||
*************************************************/
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xizi.h>
 | 
					#include <xizi.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,21 +15,21 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* @file connect_lcd.h
 | 
					* @file connect_lcd.h
 | 
				
			||||||
* @brief define aiit-riscv64-board lcd function
 | 
					* @brief define edu-riscv64 board lcd function
 | 
				
			||||||
* @version 1.0 
 | 
					* @version 1.0 
 | 
				
			||||||
* @author AIIT XUOS Lab
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
* @date 2021-04-25
 | 
					* @date 2022-10-25
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*************************************************
 | 
					/*************************************************
 | 
				
			||||||
File name: connect_lcd.h
 | 
					File name: connect_lcd.h
 | 
				
			||||||
Description: define aiit-riscv64-board lcd function
 | 
					Description: define edu-riscv64 board lcd function
 | 
				
			||||||
Others:  https://canaan-creative.com/developer
 | 
					Others:  https://canaan-creative.com/developer
 | 
				
			||||||
History: 
 | 
					History: 
 | 
				
			||||||
1. Date: 2021-04-25
 | 
					1. Date: 2022-10-25
 | 
				
			||||||
Author: AIIT XUOS Lab
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
Modification: 
 | 
					Modification: 
 | 
				
			||||||
1. add aiit-riscv64-board lcd function
 | 
					1. add edu-riscv64 board lcd function
 | 
				
			||||||
*************************************************/
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONNECT_LCD_H
 | 
					#ifndef CONNECT_LCD_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,10 +12,10 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* @file connect_spi.h
 | 
					* @file connect_spi.h
 | 
				
			||||||
* @brief define aiit-riscv64-board spi function and struct
 | 
					* @brief define edu-riscv64 board spi function and struct
 | 
				
			||||||
* @version 1.0 
 | 
					* @version 1.0 
 | 
				
			||||||
* @author AIIT XUOS Lab
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
* @date 2021-04-25
 | 
					* @date 2022-10-25
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONNECT_SPI_H
 | 
					#ifndef CONNECT_SPI_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,21 +9,21 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* @file graphic.h
 | 
					* @file graphic.h
 | 
				
			||||||
* @brief define aiit-riscv64-board lcd operation
 | 
					* @brief define edu-riscv64 board lcd operation
 | 
				
			||||||
* @version 1.0 
 | 
					* @version 1.0 
 | 
				
			||||||
* @author AIIT XUOS Lab
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
* @date 2021-04-25
 | 
					* @date 2022-10-25
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*************************************************
 | 
					/*************************************************
 | 
				
			||||||
File name: graphic.h
 | 
					File name: graphic.h
 | 
				
			||||||
Description: define aiit-riscv64-board lcd operation
 | 
					Description: define edu-riscv64 board lcd operation
 | 
				
			||||||
Others: take RT-Thread v4.0.2/include/rtdef.h for references
 | 
					Others: take RT-Thread v4.0.2/include/rtdef.h for references
 | 
				
			||||||
                https://github.com/RT-Thread/rt-thread/tree/v4.0.2
 | 
					                https://github.com/RT-Thread/rt-thread/tree/v4.0.2
 | 
				
			||||||
History: 
 | 
					History: 
 | 
				
			||||||
1. Date: 2021-04-25
 | 
					1. Date: 2022-10-25
 | 
				
			||||||
Author: AIIT XUOS Lab
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
Modification: add aiit-riscv64-board lcd configure and operation function
 | 
					Modification: add edu-riscv64 board lcd configure and operation function
 | 
				
			||||||
*************************************************/
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef GRAPHIC_H
 | 
					#ifndef GRAPHIC_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@
 | 
				
			||||||
*                https://canaan-creative.com/developer
 | 
					*                https://canaan-creative.com/developer
 | 
				
			||||||
* @version 1.0 
 | 
					* @version 1.0 
 | 
				
			||||||
* @author AIIT XUOS Lab
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
* @date 2021-04-25
 | 
					* @date 2022-10-25
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __HARDWARE_SPI_H__
 | 
					#ifndef __HARDWARE_SPI_H__
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +58,8 @@ extern int IoConfigInit(void);
 | 
				
			||||||
extern int HwI2cInit(void);
 | 
					extern int HwI2cInit(void);
 | 
				
			||||||
extern int HwTouchInit(void);
 | 
					extern int HwTouchInit(void);
 | 
				
			||||||
extern int HwCh376Init(void);
 | 
					extern int HwCh376Init(void);
 | 
				
			||||||
 | 
					extern int HwLcdInit(void);
 | 
				
			||||||
 | 
					extern int HwSpiInit(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef FS_CH376
 | 
					#ifdef FS_CH376
 | 
				
			||||||
#include <iot-vfs.h>
 | 
					#include <iot-vfs.h>
 | 
				
			||||||
| 
						 | 
					@ -170,7 +172,12 @@ struct InitSequenceDesc _board_init[] =
 | 
				
			||||||
#ifdef BSP_USING_I2C
 | 
					#ifdef BSP_USING_I2C
 | 
				
			||||||
    { "hw_i2c", HwI2cInit },
 | 
					    { "hw_i2c", HwI2cInit },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef BSP_USING_SPI
 | 
				
			||||||
 | 
						{ "hw_spi", HwSpiInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef BSP_USING_LCD
 | 
				
			||||||
 | 
						{ "hw_lcd", HwLcdInit },
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#ifdef BSP_USING_USB
 | 
					#ifdef BSP_USING_USB
 | 
				
			||||||
    { "hw_usb", HwCh376Init},
 | 
					    { "hw_usb", HwCh376Init},
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,63 +1,80 @@
 | 
				
			||||||
menuconfig BSP_USING_CH376
 | 
					menuconfig BSP_USING_CH376
 | 
				
			||||||
bool "Using CH376 device"
 | 
					    bool "Using CH376 device"
 | 
				
			||||||
default n
 | 
					    default n
 | 
				
			||||||
select FS_VFS
 | 
					    select FS_VFS
 | 
				
			||||||
select FS_CH376
 | 
					    select FS_CH376
 | 
				
			||||||
if BSP_USING_CH376
 | 
					    if BSP_USING_CH376
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/ch376/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/ch376/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					menuconfig BSP_USING_SPI
 | 
				
			||||||
 | 
					    bool "Using SPI device"
 | 
				
			||||||
 | 
					    default n
 | 
				
			||||||
 | 
					    select RESOURCES_SPI
 | 
				
			||||||
 | 
					    select  BSP_USING_DMA
 | 
				
			||||||
 | 
					    if BSP_USING_SPI
 | 
				
			||||||
 | 
					        source "$BSP_DIR/third_party_driver/spi/Kconfig"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					menuconfig BSP_USING_LCD
 | 
				
			||||||
 | 
					    bool "Using LCD device"
 | 
				
			||||||
 | 
					    default n
 | 
				
			||||||
 | 
					    select BSP_USING_SPI
 | 
				
			||||||
 | 
					    select RESOURCES_LCD
 | 
				
			||||||
 | 
					    if BSP_USING_LCD
 | 
				
			||||||
 | 
					        source "$BSP_DIR/third_party_driver/lcd/Kconfig"
 | 
				
			||||||
 | 
					    endif 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_DMA
 | 
					menuconfig BSP_USING_DMA
 | 
				
			||||||
bool "Using DMA device"
 | 
					    bool "Using DMA device"
 | 
				
			||||||
default y
 | 
					    default y
 | 
				
			||||||
if BSP_USING_DMA
 | 
					    if BSP_USING_DMA
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/dma/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/dma/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_GPIO
 | 
					menuconfig BSP_USING_GPIO
 | 
				
			||||||
bool "Using GPIO device"
 | 
					    bool "Using GPIO device"
 | 
				
			||||||
default y
 | 
					    default y
 | 
				
			||||||
select RESOURCES_PIN
 | 
					    select RESOURCES_PIN
 | 
				
			||||||
if BSP_USING_GPIO
 | 
					    if BSP_USING_GPIO
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/gpio/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/gpio/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_I2C
 | 
					menuconfig BSP_USING_I2C
 | 
				
			||||||
bool "Using I2C device"
 | 
					    bool "Using I2C device"
 | 
				
			||||||
default n
 | 
					    default n
 | 
				
			||||||
select RESOURCES_I2C
 | 
					    select RESOURCES_I2C
 | 
				
			||||||
if BSP_USING_I2C
 | 
					    if BSP_USING_I2C
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/i2c/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/i2c/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_TOUCH
 | 
					menuconfig BSP_USING_TOUCH
 | 
				
			||||||
bool "Using TOUCH device"
 | 
					    bool "Using TOUCH device"
 | 
				
			||||||
default n
 | 
					    default n
 | 
				
			||||||
select RESOURCES_TOUCH
 | 
					    select BSP_USING_I2C
 | 
				
			||||||
select BSP_USING_I2C
 | 
					    select RESOURCES_TOUCH
 | 
				
			||||||
if BSP_USING_TOUCH
 | 
					    if BSP_USING_TOUCH
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/touch/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/touch/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_PLIC
 | 
					menuconfig BSP_USING_PLIC
 | 
				
			||||||
bool "Using PLIC device"
 | 
					    bool "Using PLIC device"
 | 
				
			||||||
default y
 | 
					    default y
 | 
				
			||||||
if BSP_USING_PLIC
 | 
					    if BSP_USING_PLIC
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/plic/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/plic/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_SYSCLOCK
 | 
					menuconfig BSP_USING_SYSCLOCK
 | 
				
			||||||
bool "Using SYSCLOCK device"
 | 
					    bool "Using SYSCLOCK device"
 | 
				
			||||||
default y
 | 
					    default y
 | 
				
			||||||
if BSP_USING_SYSCLOCK
 | 
					    if BSP_USING_SYSCLOCK
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/sys_clock/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/sys_clock/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuconfig BSP_USING_UART
 | 
					menuconfig BSP_USING_UART
 | 
				
			||||||
bool "Using UART device"
 | 
					    bool "Using UART device"
 | 
				
			||||||
default y
 | 
					    default y
 | 
				
			||||||
select RESOURCES_SERIAL
 | 
					    select RESOURCES_SERIAL
 | 
				
			||||||
if BSP_USING_UART
 | 
					    if BSP_USING_UART
 | 
				
			||||||
source "$BSP_DIR/third_party_driver/uart/Kconfig"
 | 
					        source "$BSP_DIR/third_party_driver/uart/Kconfig"
 | 
				
			||||||
endif
 | 
					    endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,10 @@ ifeq ($(CONFIG_BSP_USING_GPIO),y)
 | 
				
			||||||
  SRC_DIR += gpio
 | 
					  SRC_DIR += gpio
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_BSP_USING_SPI),y)
 | 
				
			||||||
 | 
					  SRC_DIR += spi
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_BSP_USING_I2C),y)
 | 
					ifeq ($(CONFIG_BSP_USING_I2C),y)
 | 
				
			||||||
  SRC_DIR += i2c
 | 
					  SRC_DIR += i2c
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
| 
						 | 
					@ -32,4 +36,8 @@ ifeq ($(CONFIG_BSP_USING_UART),y)
 | 
				
			||||||
  SRC_DIR += uart
 | 
					  SRC_DIR += uart
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_BSP_USING_LCD),y)
 | 
				
			||||||
 | 
					  SRC_DIR += lcd
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(KERNEL_ROOT)/compiler.mk
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,7 +46,8 @@ static struct io_config
 | 
				
			||||||
#ifdef BSP_USING_LCD
 | 
					#ifdef BSP_USING_LCD
 | 
				
			||||||
    IOCONFIG(BSP_LCD_CS_PIN, FUNC_SPI0_SS0),                
 | 
					    IOCONFIG(BSP_LCD_CS_PIN, FUNC_SPI0_SS0),                
 | 
				
			||||||
    IOCONFIG(BSP_LCD_WR_PIN, FUNC_SPI0_SCLK),                
 | 
					    IOCONFIG(BSP_LCD_WR_PIN, FUNC_SPI0_SCLK),                
 | 
				
			||||||
    IOCONFIG(BSP_LCD_DC_PIN, HS_GPIO(LCD_DC_PIN)),     
 | 
					    IOCONFIG(BSP_LCD_DC_PIN, HS_GPIO(FPIOA_LCD_DC)),
 | 
				
			||||||
 | 
					    IOCONFIG(BSP_LCD_RST_PIN, HS_GPIO(FPIOA_LCD_RST)),     
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef BSP_USING_SPI1
 | 
					#ifdef BSP_USING_SPI1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					/* Copyright 2018 Canaan Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_lcd.h
 | 
				
			||||||
 | 
					* @brief define aiit-riscv64-board lcd function
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2021-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*************************************************
 | 
				
			||||||
 | 
					File name: connect_lcd.h
 | 
				
			||||||
 | 
					Description: define aiit-riscv64-board lcd function
 | 
				
			||||||
 | 
					Others:  https://canaan-creative.com/developer
 | 
				
			||||||
 | 
					History: 
 | 
				
			||||||
 | 
					1. Date: 2021-04-25
 | 
				
			||||||
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
 | 
					Modification: 
 | 
				
			||||||
 | 
					1. add aiit-riscv64-board lcd function
 | 
				
			||||||
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CONNECT_LCD_H
 | 
				
			||||||
 | 
					#define CONNECT_LCD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <device.h>
 | 
				
			||||||
 | 
					#include "hardware_spi.h"
 | 
				
			||||||
 | 
					#include <sysctl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_USING_TOUCH
 | 
				
			||||||
 | 
					#include "connect_touch.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DrvLcdClear(uint16_t color);
 | 
				
			||||||
 | 
					void LcdDrawLine(uint16 x1, uint16 y1, uint16 x2, uint16 y2,uint16 color);							
 | 
				
			||||||
 | 
					void LcdDrawRectangle(uint16 x1, uint16 y1, uint16 x2, uint16 y2,uint16 color);		   			
 | 
				
			||||||
 | 
					void LcdDrawCircle(uint16 x0,uint16 y0,uint8 r,uint16 color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int HwLcdInit(void);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright (c) 2020 AIIT XUOS Lab
 | 
				
			||||||
 | 
					* XiUOS is licensed under Mulan PSL v2.
 | 
				
			||||||
 | 
					* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
				
			||||||
 | 
					* You may obtain a copy of Mulan PSL v2 at:
 | 
				
			||||||
 | 
					*        http://license.coscl.org.cn/MulanPSL2
 | 
				
			||||||
 | 
					* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
				
			||||||
 | 
					* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
				
			||||||
 | 
					* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					* See the Mulan PSL v2 for more details.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_spi.h
 | 
				
			||||||
 | 
					* @brief define aiit-riscv64-board spi function and struct
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2021-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CONNECT_SPI_H
 | 
				
			||||||
 | 
					#define CONNECT_SPI_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <device.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int HwSpiInit(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,93 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2006-2018, RT-Thread Development Team
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Change Logs:
 | 
				
			||||||
 | 
					 * Date           Author       Notes
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file graphic.h
 | 
				
			||||||
 | 
					* @brief define aiit-riscv64-board lcd operation
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2021-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*************************************************
 | 
				
			||||||
 | 
					File name: graphic.h
 | 
				
			||||||
 | 
					Description: define aiit-riscv64-board lcd operation
 | 
				
			||||||
 | 
					Others: take RT-Thread v4.0.2/include/rtdef.h for references
 | 
				
			||||||
 | 
					                https://github.com/RT-Thread/rt-thread/tree/v4.0.2
 | 
				
			||||||
 | 
					History: 
 | 
				
			||||||
 | 
					1. Date: 2021-04-25
 | 
				
			||||||
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
 | 
					Modification: add aiit-riscv64-board lcd configure and operation function
 | 
				
			||||||
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GRAPHIC_H
 | 
				
			||||||
 | 
					#define GRAPIHC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <xizi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GRAPHIC_CTRL_RECT_UPDATE                      0
 | 
				
			||||||
 | 
					#define GRAPHIC_CTRL_POWERON                          1
 | 
				
			||||||
 | 
					#define GRAPHIC_CTRL_POWEROFF                         2
 | 
				
			||||||
 | 
					#define GRAPHIC_CTRL_GET_INFO                         3
 | 
				
			||||||
 | 
					#define GRAPHIC_CTRL_SET_MODE                         4
 | 
				
			||||||
 | 
					#define GRAPHIC_CTRL_GET_EXT                          5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_MONO = 0,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_GRAY4,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_GRAY16,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_RGB332,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_RGB444,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_RGB565 ,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_RGB565P,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_BGR565 = PIXEL_FORMAT_RGB565P,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_RGB666,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_RGB888,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_ARGB888,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_ABGR888,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_ARGB565,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_ALPHA,
 | 
				
			||||||
 | 
					    PIXEL_FORMAT_COLOR,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct DeviceLcdInfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8 pixel_format;                           
 | 
				
			||||||
 | 
					    uint8 bits_per_pixel;                       
 | 
				
			||||||
 | 
					    uint16 reserved;                               
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16 width;                                 
 | 
				
			||||||
 | 
					    uint16 height;                                
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8 *framebuffer;                            
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct DeviceRectInfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16 x;                                    
 | 
				
			||||||
 | 
					    uint16 y;                                  
 | 
				
			||||||
 | 
					    uint16 width;                              
 | 
				
			||||||
 | 
					    uint16 height;                             
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct DeviceGraphicDone
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    void (*set_pixel) (const char *pixel, int x, int y);
 | 
				
			||||||
 | 
					    void (*get_pixel) (char *pixel, int x, int y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void (*draw_hline) (const char *pixel, int x1, int x2, int y);
 | 
				
			||||||
 | 
					    void (*draw_vline) (const char *pixel, int x, int y1, int y2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void (*blit_line) (const char *pixel, int x, int y, x_size_t size);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GraphixDone(device) ((struct DeviceGraphicDone *)(device->UserData))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,494 @@
 | 
				
			||||||
 | 
					/* Copyright 2018 Canaan Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file hardware_spi.h
 | 
				
			||||||
 | 
					* @brief add from Canaan k210 SDK
 | 
				
			||||||
 | 
					*                https://canaan-creative.com/developer
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2021-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __HARDWARE_SPI_H__
 | 
				
			||||||
 | 
					#define __HARDWARE_SPI_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dmac.h"
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* clang-format off */
 | 
				
			||||||
 | 
					typedef struct _spi
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* SPI Control Register 0                                    (0x00)*/
 | 
				
			||||||
 | 
					    volatile uint32_t ctrlr0;
 | 
				
			||||||
 | 
					    /* SPI Control Register 1                                    (0x04)*/
 | 
				
			||||||
 | 
					    volatile uint32_t ctrlr1;
 | 
				
			||||||
 | 
					    /* SPI Enable Register                                       (0x08)*/
 | 
				
			||||||
 | 
					    volatile uint32_t ssienr;
 | 
				
			||||||
 | 
					    /* SPI Microwire Control Register                            (0x0c)*/
 | 
				
			||||||
 | 
					    volatile uint32_t mwcr;
 | 
				
			||||||
 | 
					    /* SPI Slave Enable Register                                 (0x10)*/
 | 
				
			||||||
 | 
					    volatile uint32_t ser;
 | 
				
			||||||
 | 
					    /* SPI Baud Rate Select                                      (0x14)*/
 | 
				
			||||||
 | 
					    volatile uint32_t baudr;
 | 
				
			||||||
 | 
					    /* SPI Transmit FIFO Threshold Level                         (0x18)*/
 | 
				
			||||||
 | 
					    volatile uint32_t txftlr;
 | 
				
			||||||
 | 
					    /* SPI Receive FIFO Threshold Level                          (0x1c)*/
 | 
				
			||||||
 | 
					    volatile uint32_t rxftlr;
 | 
				
			||||||
 | 
					    /* SPI Transmit FIFO Level Register                          (0x20)*/
 | 
				
			||||||
 | 
					    volatile uint32_t txflr;
 | 
				
			||||||
 | 
					    /* SPI Receive FIFO Level Register                           (0x24)*/
 | 
				
			||||||
 | 
					    volatile uint32_t rxflr;
 | 
				
			||||||
 | 
					    /* SPI Status Register                                       (0x28)*/
 | 
				
			||||||
 | 
					    volatile uint32_t sr;
 | 
				
			||||||
 | 
					    /* SPI Interrupt Mask Register                               (0x2c)*/
 | 
				
			||||||
 | 
					    volatile uint32_t imr;
 | 
				
			||||||
 | 
					    /* SPI Interrupt Status Register                             (0x30)*/
 | 
				
			||||||
 | 
					    volatile uint32_t isr;
 | 
				
			||||||
 | 
					    /* SPI Raw Interrupt Status Register                         (0x34)*/
 | 
				
			||||||
 | 
					    volatile uint32_t risr;
 | 
				
			||||||
 | 
					    /* SPI Transmit FIFO Overflow Interrupt Clear Register       (0x38)*/
 | 
				
			||||||
 | 
					    volatile uint32_t txoicr;
 | 
				
			||||||
 | 
					    /* SPI Receive FIFO Overflow Interrupt Clear Register        (0x3c)*/
 | 
				
			||||||
 | 
					    volatile uint32_t rxoicr;
 | 
				
			||||||
 | 
					    /* SPI Receive FIFO Underflow Interrupt Clear Register       (0x40)*/
 | 
				
			||||||
 | 
					    volatile uint32_t rxuicr;
 | 
				
			||||||
 | 
					    /* SPI Multi-Master Interrupt Clear Register                 (0x44)*/
 | 
				
			||||||
 | 
					    volatile uint32_t msticr;
 | 
				
			||||||
 | 
					    /* SPI Interrupt Clear Register                              (0x48)*/
 | 
				
			||||||
 | 
					    volatile uint32_t icr;
 | 
				
			||||||
 | 
					    /* SPI DMA Control Register                                  (0x4c)*/
 | 
				
			||||||
 | 
					    volatile uint32_t dmacr;
 | 
				
			||||||
 | 
					    /* SPI DMA Transmit Data Level                               (0x50)*/
 | 
				
			||||||
 | 
					    volatile uint32_t dmatdlr;
 | 
				
			||||||
 | 
					    /* SPI DMA Receive Data Level                                (0x54)*/
 | 
				
			||||||
 | 
					    volatile uint32_t dmardlr;
 | 
				
			||||||
 | 
					    /* SPI Identification Register                               (0x58)*/
 | 
				
			||||||
 | 
					    volatile uint32_t idr;
 | 
				
			||||||
 | 
					    /* SPI DWC_ssi component version                             (0x5c)*/
 | 
				
			||||||
 | 
					    volatile uint32_t ssic_version_id;
 | 
				
			||||||
 | 
					    /* SPI Data Register 0-36                                    (0x60 -- 0xec)*/
 | 
				
			||||||
 | 
					    volatile uint32_t dr[36];
 | 
				
			||||||
 | 
					    /* SPI RX Sample Delay Register                              (0xf0)*/
 | 
				
			||||||
 | 
					    volatile uint32_t rx_sample_delay;
 | 
				
			||||||
 | 
					    /* SPI SPI Control Register                                  (0xf4)*/
 | 
				
			||||||
 | 
					    volatile uint32_t spi_ctrlr0;
 | 
				
			||||||
 | 
					    /* reserved                                                  (0xf8)*/
 | 
				
			||||||
 | 
					    volatile uint32_t resv;
 | 
				
			||||||
 | 
					    /* SPI XIP Mode bits                                         (0xfc)*/
 | 
				
			||||||
 | 
					    volatile uint32_t xip_mode_bits;
 | 
				
			||||||
 | 
					    /* SPI XIP INCR transfer opcode                              (0x100)*/
 | 
				
			||||||
 | 
					    volatile uint32_t xip_incr_inst;
 | 
				
			||||||
 | 
					    /* SPI XIP WRAP transfer opcode                              (0x104)*/
 | 
				
			||||||
 | 
					    volatile uint32_t xip_wrap_inst;
 | 
				
			||||||
 | 
					    /* SPI XIP Control Register                                  (0x108)*/
 | 
				
			||||||
 | 
					    volatile uint32_t xip_ctrl;
 | 
				
			||||||
 | 
					    /* SPI XIP Slave Enable Register                             (0x10c)*/
 | 
				
			||||||
 | 
					    volatile uint32_t xip_ser;
 | 
				
			||||||
 | 
					    /* SPI XIP Receive FIFO Overflow Interrupt Clear Register    (0x110)*/
 | 
				
			||||||
 | 
					    volatile uint32_t xrxoicr;
 | 
				
			||||||
 | 
					    /* SPI XIP time out register for continuous transfers        (0x114)*/
 | 
				
			||||||
 | 
					    volatile uint32_t xip_cnt_time_out;
 | 
				
			||||||
 | 
					    volatile uint32_t endian;
 | 
				
			||||||
 | 
					} __attribute__((packed, aligned(4))) spi_t;
 | 
				
			||||||
 | 
					/* clang-format on */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _spi_device_num
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SPI_DEVICE_0,
 | 
				
			||||||
 | 
					    SPI_DEVICE_1,
 | 
				
			||||||
 | 
					    SPI_DEVICE_2,
 | 
				
			||||||
 | 
					    SPI_DEVICE_3,
 | 
				
			||||||
 | 
					    SPI_DEVICE_MAX,
 | 
				
			||||||
 | 
					} spi_device_num_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _spi_work_mode
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SPI_WORK_MODE_0,
 | 
				
			||||||
 | 
					    SPI_WORK_MODE_1,
 | 
				
			||||||
 | 
					    SPI_WORK_MODE_2,
 | 
				
			||||||
 | 
					    SPI_WORK_MODE_3,
 | 
				
			||||||
 | 
					} spi_work_mode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _spi_frame_format
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SPI_FF_STANDARD,
 | 
				
			||||||
 | 
					    SPI_FF_DUAL,
 | 
				
			||||||
 | 
					    SPI_FF_QUAD,
 | 
				
			||||||
 | 
					    SPI_FF_OCTAL
 | 
				
			||||||
 | 
					} spi_frame_format_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _spi_instruction_address_trans_mode
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SPI_AITM_STANDARD,
 | 
				
			||||||
 | 
					    SPI_AITM_ADDR_STANDARD,
 | 
				
			||||||
 | 
					    SPI_AITM_AS_FRAME_FORMAT
 | 
				
			||||||
 | 
					} spi_instruction_address_trans_mode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _spi_transfer_mode
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SPI_TMOD_TRANS_RECV,
 | 
				
			||||||
 | 
					    SPI_TMOD_TRANS,
 | 
				
			||||||
 | 
					    SPI_TMOD_RECV,
 | 
				
			||||||
 | 
					    SPI_TMOD_EEROM
 | 
				
			||||||
 | 
					} spi_transfer_mode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _spi_transfer_width
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SPI_TRANS_CHAR  = 0x1,
 | 
				
			||||||
 | 
					    SPI_TRANS_SHORT = 0x2,
 | 
				
			||||||
 | 
					    SPI_TRANS_INT   = 0x4,
 | 
				
			||||||
 | 
					} spi_transfer_width_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _spi_chip_select
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SPI_CHIP_SELECT_0,
 | 
				
			||||||
 | 
					    SPI_CHIP_SELECT_1,
 | 
				
			||||||
 | 
					    SPI_CHIP_SELECT_2,
 | 
				
			||||||
 | 
					    SPI_CHIP_SELECT_3,
 | 
				
			||||||
 | 
					    SPI_CHIP_SELECT_MAX,
 | 
				
			||||||
 | 
					} spi_chip_select_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    WRITE_CONFIG,
 | 
				
			||||||
 | 
					    READ_CONFIG,
 | 
				
			||||||
 | 
					    WRITE_DATA_BYTE,
 | 
				
			||||||
 | 
					    READ_DATA_BYTE,
 | 
				
			||||||
 | 
					    WRITE_DATA_BLOCK,
 | 
				
			||||||
 | 
					    READ_DATA_BLOCK,
 | 
				
			||||||
 | 
					} spi_slave_command_e;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t cmd;
 | 
				
			||||||
 | 
					    uint8_t err;
 | 
				
			||||||
 | 
					    uint32_t addr;
 | 
				
			||||||
 | 
					    uint32_t len;
 | 
				
			||||||
 | 
					} spi_slave_command_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    IDLE,
 | 
				
			||||||
 | 
					    COMMAND,
 | 
				
			||||||
 | 
					    TRANSFER,
 | 
				
			||||||
 | 
					} spi_slave_status_e;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef int (*spi_slave_receive_callback_t)(void *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _spi_slave_instance
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t int_pin;
 | 
				
			||||||
 | 
					    uint8_t ready_pin;
 | 
				
			||||||
 | 
					    dmac_channel_number_t dmac_channel;
 | 
				
			||||||
 | 
					    uint8_t dfs;
 | 
				
			||||||
 | 
					    uint8_t slv_oe;
 | 
				
			||||||
 | 
					    uint8_t work_mode;
 | 
				
			||||||
 | 
					    size_t data_bit_length;
 | 
				
			||||||
 | 
					    volatile spi_slave_status_e status;
 | 
				
			||||||
 | 
					    volatile spi_slave_command_t command;
 | 
				
			||||||
 | 
					    volatile uint8_t *config_ptr;
 | 
				
			||||||
 | 
					    uint32_t config_len;
 | 
				
			||||||
 | 
					    spi_slave_receive_callback_t callback;
 | 
				
			||||||
 | 
					} spi_slave_instance_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _spi_data_t
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    dmac_channel_number_t tx_channel;
 | 
				
			||||||
 | 
					    dmac_channel_number_t rx_channel;
 | 
				
			||||||
 | 
					    uint32_t *tx_buf;
 | 
				
			||||||
 | 
					    size_t tx_len;
 | 
				
			||||||
 | 
					    uint32_t *rx_buf;
 | 
				
			||||||
 | 
					    size_t rx_len;
 | 
				
			||||||
 | 
					    spi_transfer_mode_t TransferMode;
 | 
				
			||||||
 | 
					    bool fill_mode;
 | 
				
			||||||
 | 
					} spi_data_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern volatile spi_t *const spi[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Set spi configuration
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num             Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   mode                Spi mode
 | 
				
			||||||
 | 
					 * @param[in]   frame_format        Spi frame format
 | 
				
			||||||
 | 
					 * @param[in]   data_bit_length     Spi data bit length
 | 
				
			||||||
 | 
					 * @param[in]   endian              0:little-endian 1:big-endian
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Void
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_init(spi_device_num_t spi_num, spi_work_mode_t work_mode, spi_frame_format_t frame_format,
 | 
				
			||||||
 | 
					              size_t data_bit_length, uint32_t endian);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Set multiline configuration
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num                                 Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   instruction_length                      Instruction length
 | 
				
			||||||
 | 
					 * @param[in]   address_length                          Address length
 | 
				
			||||||
 | 
					 * @param[in]   wait_cycles                             Wait cycles
 | 
				
			||||||
 | 
					 * @param[in]   instruction_address_trans_mode          Spi transfer mode
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_init_non_standard(spi_device_num_t spi_num, uint32_t instruction_length, uint32_t address_length,
 | 
				
			||||||
 | 
					                           uint32_t wait_cycles, spi_instruction_address_trans_mode_t instruction_address_trans_mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi send data
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff        Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen         Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   tx_buff         Spi transmit buffer point
 | 
				
			||||||
 | 
					 * @param[in]   tx_len          Spi transmit buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_send_data_standard(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *CmdBuff,
 | 
				
			||||||
 | 
					                            size_t CmdLen, const uint8_t *tx_buff, size_t tx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi receive data
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num             Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select         Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff            Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen             Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   rx_buff             Spi receive buffer point
 | 
				
			||||||
 | 
					 * @param[in]   rx_len              Spi receive buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_receive_data_standard(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *CmdBuff,
 | 
				
			||||||
 | 
					                               size_t CmdLen, uint8_t *rx_buff, size_t rx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi special receive data
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff        Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen         Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   rx_buff         Spi receive buffer point
 | 
				
			||||||
 | 
					 * @param[in]   rx_len          Spi receive buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_receive_data_multiple(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint32_t *CmdBuff,
 | 
				
			||||||
 | 
					                               size_t CmdLen, uint8_t *rx_buff, size_t rx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi special send data
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff        Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen         Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   tx_buff         Spi transmit buffer point
 | 
				
			||||||
 | 
					 * @param[in]   tx_len          Spi transmit buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_send_data_multiple(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint32_t *CmdBuff,
 | 
				
			||||||
 | 
					                            size_t CmdLen, const uint8_t *tx_buff, size_t tx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi send data by dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   channel_num     Dmac channel number
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff        Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen         Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   tx_buff         Spi transmit buffer point
 | 
				
			||||||
 | 
					 * @param[in]   tx_len          Spi transmit buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_send_data_standard_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num,
 | 
				
			||||||
 | 
					                                spi_chip_select_t chip_select,
 | 
				
			||||||
 | 
					                                const uint8_t *CmdBuff, size_t CmdLen, const uint8_t *tx_buff, size_t tx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi receive data by dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   w_channel_num       Dmac write channel number
 | 
				
			||||||
 | 
					 * @param[in]   r_channel_num       Dmac read channel number
 | 
				
			||||||
 | 
					 * @param[in]   spi_num             Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select         Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff            Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen             Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   rx_buff             Spi receive buffer point
 | 
				
			||||||
 | 
					 * @param[in]   rx_len              Spi receive buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_receive_data_standard_dma(dmac_channel_number_t dma_send_channel_num,
 | 
				
			||||||
 | 
					                                   dmac_channel_number_t dma_receive_channel_num,
 | 
				
			||||||
 | 
					                                   spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *CmdBuff,
 | 
				
			||||||
 | 
					                                   size_t CmdLen, uint8_t *rx_buff, size_t rx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi special send data by dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   channel_num     Dmac channel number
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff        Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen         Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   tx_buff         Spi transmit buffer point
 | 
				
			||||||
 | 
					 * @param[in]   tx_len          Spi transmit buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_send_data_multiple_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num,
 | 
				
			||||||
 | 
					                                spi_chip_select_t chip_select,
 | 
				
			||||||
 | 
					                                const uint32_t *CmdBuff, size_t CmdLen, const uint8_t *tx_buff, size_t tx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi special receive data by dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   dma_send_channel_num        Dmac write channel number
 | 
				
			||||||
 | 
					 * @param[in]   dma_receive_channel_num     Dmac read channel number
 | 
				
			||||||
 | 
					 * @param[in]   spi_num                     Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select                 Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   CmdBuff                    Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   CmdLen                     Spi command length
 | 
				
			||||||
 | 
					 * @param[in]   rx_buff                     Spi receive buffer point
 | 
				
			||||||
 | 
					 * @param[in]   rx_len                      Spi receive buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_receive_data_multiple_dma(dmac_channel_number_t dma_send_channel_num,
 | 
				
			||||||
 | 
					                                   dmac_channel_number_t dma_receive_channel_num,
 | 
				
			||||||
 | 
					                                   spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint32_t *CmdBuff,
 | 
				
			||||||
 | 
					                                   size_t CmdLen, uint8_t *rx_buff, size_t rx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi fill dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   channel_num     Dmac channel number
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   tx_buff        Spi command buffer point
 | 
				
			||||||
 | 
					 * @param[in]   tx_len         Spi command length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_fill_data_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num, spi_chip_select_t chip_select,
 | 
				
			||||||
 | 
					                       const uint32_t *tx_buff, size_t tx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi normal send by dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   channel_num     Dmac channel number
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   tx_buff         Spi transmit buffer point
 | 
				
			||||||
 | 
					 * @param[in]   tx_len          Spi transmit buffer length
 | 
				
			||||||
 | 
					 * @param[in]   stw             Spi transfer width
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Result
 | 
				
			||||||
 | 
					 *     - 0      Success
 | 
				
			||||||
 | 
					 *     - Other  Fail
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_send_data_normal_dma(dmac_channel_number_t channel_num, spi_device_num_t spi_num,
 | 
				
			||||||
 | 
					                              spi_chip_select_t chip_select,
 | 
				
			||||||
 | 
					                              const void *tx_buff, size_t tx_len, spi_transfer_width_t spi_transfer_width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi normal send by dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   spi_clk         Spi clock rate
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      The real spi clock rate
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					uint32_t spi_set_clk_rate(spi_device_num_t spi_num, uint32_t spi_clk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi full duplex send receive data by dma
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   dma_send_channel_num          Dmac write channel number
 | 
				
			||||||
 | 
					 * @param[in]   dma_receive_channel_num       Dmac read channel number
 | 
				
			||||||
 | 
					 * @param[in]   spi_num                       Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select                   Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   tx_buf                        Spi send buffer
 | 
				
			||||||
 | 
					 * @param[in]   tx_len                        Spi send buffer length
 | 
				
			||||||
 | 
					 * @param[in]   rx_buf                        Spi receive buffer
 | 
				
			||||||
 | 
					 * @param[in]   rx_len                        Spi receive buffer length
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_dup_send_receive_data_dma(dmac_channel_number_t dma_send_channel_num,
 | 
				
			||||||
 | 
					                               dmac_channel_number_t dma_receive_channel_num,
 | 
				
			||||||
 | 
					                               spi_device_num_t spi_num, spi_chip_select_t chip_select,
 | 
				
			||||||
 | 
					                               const uint8_t *tx_buf, size_t tx_len, uint8_t *rx_buf, size_t rx_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Set spi slave configuration
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   int_pin             SPI master starts sending data interrupt.
 | 
				
			||||||
 | 
					 * @param[in]   ready_pin           SPI slave ready.
 | 
				
			||||||
 | 
					 * @param[in]   dmac_channel        Dmac channel number for block.
 | 
				
			||||||
 | 
					 * @param[in]   data_bit_length     Spi data bit length
 | 
				
			||||||
 | 
					 * @param[in]   data                SPI slave device data buffer.
 | 
				
			||||||
 | 
					 * @param[in]   len                 The length of SPI slave device data buffer.
 | 
				
			||||||
 | 
					 * @param[in]   callback            Callback of spi slave.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @return      Void
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_slave_config(uint8_t int_pin, uint8_t ready_pin, dmac_channel_number_t dmac_channel, size_t data_bit_length, uint8_t *data, uint32_t len, spi_slave_receive_callback_t callback);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief       Spi handle transfer data operations
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param[in]   spi_num         Spi bus number
 | 
				
			||||||
 | 
					 * @param[in]   chip_select     Spi chip select
 | 
				
			||||||
 | 
					 * @param[in]   data            Spi transfer data information
 | 
				
			||||||
 | 
					 * @param[in]   cb              Spi DMA callback
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void spi_handle_data_dma(spi_device_num_t spi_num, spi_chip_select_t chip_select, spi_data_t data, plic_interrupt_t *cb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __HARDWARE_SPI_H__ */
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if BSP_USING_LCD
 | 
				
			||||||
 | 
					    config LCD_BUS_NAME
 | 
				
			||||||
 | 
					        string "lcd bus name"
 | 
				
			||||||
 | 
					        default "lcd"
 | 
				
			||||||
 | 
					    config LCD_DRV_NAME
 | 
				
			||||||
 | 
					        string "lcd bus driver name"
 | 
				
			||||||
 | 
					        default "lcd_drv"
 | 
				
			||||||
 | 
					    config LCD_DEVICE_NAME
 | 
				
			||||||
 | 
					            string "lcd bus device name"
 | 
				
			||||||
 | 
					            default "lcd_dev"   
 | 
				
			||||||
 | 
					    config BSP_LCD_CS_PIN
 | 
				
			||||||
 | 
					        int "CS pin number of 8080 interface"
 | 
				
			||||||
 | 
					        default 37
 | 
				
			||||||
 | 
					    config BSP_LCD_WR_PIN
 | 
				
			||||||
 | 
					        int "WR pin number of 8080 interface"
 | 
				
			||||||
 | 
					        default 38
 | 
				
			||||||
 | 
					    config BSP_LCD_DC_PIN
 | 
				
			||||||
 | 
					        int "DC pin number of 8080 interface"
 | 
				
			||||||
 | 
					        default 39
 | 
				
			||||||
 | 
					    config BSP_LCD_RST_PIN
 | 
				
			||||||
 | 
					        int "RST pin number of 8080 interface"
 | 
				
			||||||
 | 
					        default 36
 | 
				
			||||||
 | 
					    config FPIOA_LCD_DC
 | 
				
			||||||
 | 
					        int "DC FPIOA number of 8080 interface"
 | 
				
			||||||
 | 
					        default 9
 | 
				
			||||||
 | 
					    config FPIOA_LCD_RST
 | 
				
			||||||
 | 
					        int "RST FPIOA number of 8080 interface"
 | 
				
			||||||
 | 
					        default 10
 | 
				
			||||||
 | 
					    config BSP_LCD_X_MAX
 | 
				
			||||||
 | 
					        int "LCD Height"
 | 
				
			||||||
 | 
					        default 320
 | 
				
			||||||
 | 
					    config BSP_LCD_Y_MAX
 | 
				
			||||||
 | 
					        int "LCD Width"
 | 
				
			||||||
 | 
					        default 320
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					SRC_FILES := connect_lcd.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,704 @@
 | 
				
			||||||
 | 
					/* Copyright 2018 Canaan Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_lcd.c
 | 
				
			||||||
 | 
					* @brief support aiit-riscv64-board lcd function and register to bus framework
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2021-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*************************************************
 | 
				
			||||||
 | 
					File name: connect_lcd.c
 | 
				
			||||||
 | 
					Description: support aiit-riscv64-board lcd configure and lcd bus register function
 | 
				
			||||||
 | 
					Others: https://canaan-creative.com/developer
 | 
				
			||||||
 | 
					History: 
 | 
				
			||||||
 | 
					1. Date: 2021-04-25
 | 
				
			||||||
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
 | 
					Modification: 
 | 
				
			||||||
 | 
					1. support aiit-riscv64-board lcd configure, write and read
 | 
				
			||||||
 | 
					2. support aiit-riscv64-board lcd bus device and driver register
 | 
				
			||||||
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <connect_lcd.h>
 | 
				
			||||||
 | 
					#include <board.h>
 | 
				
			||||||
 | 
					#include <drv_io_config.h>
 | 
				
			||||||
 | 
					#include <font.h>
 | 
				
			||||||
 | 
					#include <fpioa.h>
 | 
				
			||||||
 | 
					#include <gpiohs.h>
 | 
				
			||||||
 | 
					#include <graphic.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NO_OPERATION                      0x00
 | 
				
			||||||
 | 
					#define SOFTWARE_RESET                0x01
 | 
				
			||||||
 | 
					#define READ_ID                                     0x04
 | 
				
			||||||
 | 
					#define READ_STATUS                         0x09
 | 
				
			||||||
 | 
					#define READ_POWER_MODE           0x0A
 | 
				
			||||||
 | 
					#define READ_MADCTL                        0x0B
 | 
				
			||||||
 | 
					#define READ_PIXEL_FORMAT          0x0C
 | 
				
			||||||
 | 
					#define READ_IMAGE_FORMAT         0x0D
 | 
				
			||||||
 | 
					#define READ_SIGNAL_MODE           0x0E
 | 
				
			||||||
 | 
					#define READ_SELT_DIAG_RESULT 0x0F
 | 
				
			||||||
 | 
					#define SLEEP_ON                                 0x10
 | 
				
			||||||
 | 
					#define SLEEP_OFF                               0x11
 | 
				
			||||||
 | 
					#define PARTIAL_DISPALY_ON          0x12
 | 
				
			||||||
 | 
					#define NORMAL_DISPALY_ON          0x13
 | 
				
			||||||
 | 
					#define INVERSION_DISPALY_OFF   0x20
 | 
				
			||||||
 | 
					#define INVERSION_DISPALY_ON     0x21
 | 
				
			||||||
 | 
					#define GAMMA_SET                              0x26
 | 
				
			||||||
 | 
					#define DISPALY_OFF                             0x28
 | 
				
			||||||
 | 
					#define DISPALY_ON                              0x29
 | 
				
			||||||
 | 
					#define HORIZONTAL_ADDRESS_SET          0x2A
 | 
				
			||||||
 | 
					#define VERTICAL_ADDRESS_SET                  0x2B
 | 
				
			||||||
 | 
					#define MEMORY_WRITE                                    0x2C
 | 
				
			||||||
 | 
					#define COLOR_SET                                              0x2D
 | 
				
			||||||
 | 
					#define MEMORY_READ                                       0x2E
 | 
				
			||||||
 | 
					#define PARTIAL_AREA                                        0x30
 | 
				
			||||||
 | 
					#define VERTICAL_SCROL_DEFINE                 0x33
 | 
				
			||||||
 | 
					#define TEAR_EFFECT_LINE_OFF                   0x34
 | 
				
			||||||
 | 
					#define TEAR_EFFECT_LINE_ON                     0x35
 | 
				
			||||||
 | 
					#define MEMORY_ACCESS_CTL                        0x36
 | 
				
			||||||
 | 
					#define VERTICAL_SCROL_S_ADD                  0x37
 | 
				
			||||||
 | 
					#define IDLE_MODE_OFF                                    0x38
 | 
				
			||||||
 | 
					#define IDLE_MODE_ON                                      0x39
 | 
				
			||||||
 | 
					#define PIXEL_FORMAT_SET                             0x3A
 | 
				
			||||||
 | 
					#define WRITE_MEMORY_CONTINUE            0x3C
 | 
				
			||||||
 | 
					#define READ_MEMORY_CONTINUE              0x3E
 | 
				
			||||||
 | 
					#define SET_TEAR_SCANLINE                          0x44
 | 
				
			||||||
 | 
					#define GET_SCANLINE                                       0x45
 | 
				
			||||||
 | 
					#define WRITE_BRIGHTNESS                            0x51
 | 
				
			||||||
 | 
					#define READ_BRIGHTNESS                              0x52
 | 
				
			||||||
 | 
					#define WRITE_CTRL_DISPALY                         0x53
 | 
				
			||||||
 | 
					#define READ_CTRL_DISPALY                           0x54
 | 
				
			||||||
 | 
					#define WRITE_BRIGHTNESS_CTL                  0x55
 | 
				
			||||||
 | 
					#define READ_BRIGHTNESS_CTL                    0x56
 | 
				
			||||||
 | 
					#define WRITE_MIN_BRIGHTNESS                  0x5E
 | 
				
			||||||
 | 
					#define READ_MIN_BRIGHTNESS                    0x5F
 | 
				
			||||||
 | 
					#define READ_ID1                                                   0xDA
 | 
				
			||||||
 | 
					#define READ_ID2                                                   0xDB
 | 
				
			||||||
 | 
					#define READ_ID3                                                   0xDC
 | 
				
			||||||
 | 
					#define RGB_IF_SIGNAL_CTL                            0xB0
 | 
				
			||||||
 | 
					#define NORMAL_FRAME_CTL                           0xB1
 | 
				
			||||||
 | 
					#define IDLE_FRAME_CTL                                   0xB2
 | 
				
			||||||
 | 
					#define PARTIAL_FRAME_CTL                           0xB3
 | 
				
			||||||
 | 
					#define INVERSION_CTL                                      0xB4
 | 
				
			||||||
 | 
					#define BLANK_PORCH_CTL                              0xB5
 | 
				
			||||||
 | 
					#define DISPALY_FUNCTION_CTL                    0xB6
 | 
				
			||||||
 | 
					#define ENTRY_MODE_SET                                 0xB7
 | 
				
			||||||
 | 
					#define BACKLIGHT_CTL1                                   0xB8
 | 
				
			||||||
 | 
					#define BACKLIGHT_CTL2                                   0xB9
 | 
				
			||||||
 | 
					#define BACKLIGHT_CTL3                                   0xBA
 | 
				
			||||||
 | 
					#define BACKLIGHT_CTL4                                   0xBB
 | 
				
			||||||
 | 
					#define BACKLIGHT_CTL5                                   0xBC
 | 
				
			||||||
 | 
					#define BACKLIGHT_CTL7                                   0xBE
 | 
				
			||||||
 | 
					#define BACKLIGHT_CTL8                                   0xBF
 | 
				
			||||||
 | 
					#define POWER_CTL1                                            0xC0
 | 
				
			||||||
 | 
					#define POWER_CTL2                                            0xC1
 | 
				
			||||||
 | 
					#define VCOM_CTL1                                                0xC5
 | 
				
			||||||
 | 
					#define VCOM_CTL2                                                0xC7
 | 
				
			||||||
 | 
					#define NV_MEMORY_WRITE                              0xD0
 | 
				
			||||||
 | 
					#define NV_MEMORY_PROTECT_KEY             0xD1
 | 
				
			||||||
 | 
					#define NV_MEMORY_STATUS_READ             0xD2
 | 
				
			||||||
 | 
					#define READ_ID4                                                    0xD3
 | 
				
			||||||
 | 
					#define POSITIVE_GAMMA_CORRECT             0xE0
 | 
				
			||||||
 | 
					#define NEGATIVE_GAMMA_CORRECT            0xE1
 | 
				
			||||||
 | 
					#define DIGITAL_GAMMA_CTL1                         0xE2
 | 
				
			||||||
 | 
					#define DIGITAL_GAMMA_CTL2                         0xE3
 | 
				
			||||||
 | 
					#define INTERFACE_CTL                                       0xF6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _lcd_dir
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DIR_XY_RLUD = 0x00,
 | 
				
			||||||
 | 
					    DIR_YX_RLUD = 0x20,
 | 
				
			||||||
 | 
					    DIR_XY_LRUD = 0x40,
 | 
				
			||||||
 | 
					    DIR_YX_LRUD = 0x60,
 | 
				
			||||||
 | 
					    DIR_XY_RLDU = 0x80,
 | 
				
			||||||
 | 
					    DIR_YX_RLDU = 0xA0,
 | 
				
			||||||
 | 
					    DIR_XY_LRDU = 0xC0,
 | 
				
			||||||
 | 
					    DIR_YX_LRDU = 0xE0,
 | 
				
			||||||
 | 
					    DIR_XY_MASK = 0x20,
 | 
				
			||||||
 | 
					    DIR_MASK = 0xE0,
 | 
				
			||||||
 | 
					} lcd_dir_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LCD_SPI_CHANNEL                 SPI_DEVICE_0
 | 
				
			||||||
 | 
					#define LCD_SPI_CHIP_SELECT         SPI_CHIP_SELECT_0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct Lcd8080Device
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct LcdBus lcd_bus;
 | 
				
			||||||
 | 
					    struct DeviceLcdInfo lcd_info;
 | 
				
			||||||
 | 
					    int spi_channel;
 | 
				
			||||||
 | 
					    int cs;
 | 
				
			||||||
 | 
					    int dc_pin;
 | 
				
			||||||
 | 
					    int dma_channel;
 | 
				
			||||||
 | 
					} * Lcd8080DeviceType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Lcd8080DeviceType aiit_lcd ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdCmd(uint8 cmd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gpiohs_set_pin(aiit_lcd->dc_pin, GPIO_PV_LOW);
 | 
				
			||||||
 | 
					    spi_init(aiit_lcd->spi_channel, SPI_WORK_MODE_0, SPI_FF_OCTAL, 8, 0);
 | 
				
			||||||
 | 
					    spi_init_non_standard(aiit_lcd->spi_channel/*spi num*/, 8 /*instrction length*/, 0 /*address length*/, 0 /*wait cycles*/,
 | 
				
			||||||
 | 
					                          SPI_AITM_AS_FRAME_FORMAT /*spi address trans mode*/);
 | 
				
			||||||
 | 
					    spi_send_data_normal_dma(aiit_lcd->dma_channel, aiit_lcd->spi_channel, aiit_lcd->cs, &cmd, 1, SPI_TRANS_CHAR);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdDataByte(uint8 *data_buf, uint32 length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gpiohs_set_pin(aiit_lcd->dc_pin, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					    spi_init(aiit_lcd->spi_channel, SPI_WORK_MODE_0, SPI_FF_OCTAL, 8, 0);
 | 
				
			||||||
 | 
					    spi_init_non_standard(aiit_lcd->spi_channel, 8 /*instrction length*/, 0 /*address length*/, 0 /*wait cycles*/,
 | 
				
			||||||
 | 
					                          SPI_AITM_AS_FRAME_FORMAT /*spi address trans mode*/);
 | 
				
			||||||
 | 
					    spi_send_data_normal_dma(aiit_lcd->dma_channel, aiit_lcd->spi_channel, aiit_lcd->cs, data_buf, length, SPI_TRANS_CHAR);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdDataHalfWord(uint16 *data_buf, uint32 length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gpiohs_set_pin(aiit_lcd->dc_pin, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					    spi_init(aiit_lcd->spi_channel, SPI_WORK_MODE_0, SPI_FF_OCTAL, 16, 0);
 | 
				
			||||||
 | 
					    spi_init_non_standard(aiit_lcd->spi_channel, 16 /*instrction length*/, 0 /*address length*/, 0 /*wait cycles*/,
 | 
				
			||||||
 | 
					                          SPI_AITM_AS_FRAME_FORMAT /*spi address trans mode*/);
 | 
				
			||||||
 | 
					    spi_send_data_normal_dma(aiit_lcd->dma_channel, aiit_lcd->spi_channel, aiit_lcd->cs, data_buf, length, SPI_TRANS_SHORT);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdDataWord(uint32 *data_buf, uint32 length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gpiohs_set_pin(aiit_lcd->dc_pin, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					 /*spi  num      Polarity and phase mode   Multi-line mode    Data bit width    little endian  */
 | 
				
			||||||
 | 
					    spi_init(aiit_lcd->spi_channel, SPI_WORK_MODE_0, SPI_FF_OCTAL, 32, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  spi num      instrction length    address length     wait cycles    spi address trans mode*/
 | 
				
			||||||
 | 
					    spi_init_non_standard(aiit_lcd->spi_channel, 0 , 32, 0 ,SPI_AITM_AS_FRAME_FORMAT );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*dma  channel     spi num   chip_selete   tx_buff   tx_len    spi_trans_data_width */
 | 
				
			||||||
 | 
					    spi_send_data_normal_dma(aiit_lcd->dma_channel, aiit_lcd->spi_channel, aiit_lcd->cs, data_buf, length, SPI_TRANS_INT);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdHwInit(Lcd8080DeviceType lcd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gpiohs_set_drive_mode(lcd->dc_pin, GPIO_DM_OUTPUT);
 | 
				
			||||||
 | 
					    gpiohs_set_pin(lcd->dc_pin, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					    spi_init(lcd->spi_channel, SPI_WORK_MODE_0, SPI_FF_OCTAL, 8, 0);
 | 
				
			||||||
 | 
					    spi_set_clk_rate(lcd->spi_channel, 25000000);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdSetDirection(lcd_dir_t dir)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if !BOARD_LICHEEDAN
 | 
				
			||||||
 | 
					    dir |= 0x08;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    if (dir & DIR_XY_MASK) {
 | 
				
			||||||
 | 
					        aiit_lcd->lcd_info.width = BSP_LCD_Y_MAX;
 | 
				
			||||||
 | 
					        aiit_lcd->lcd_info.height = BSP_LCD_X_MAX;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        aiit_lcd->lcd_info.width = BSP_LCD_X_MAX;
 | 
				
			||||||
 | 
					        aiit_lcd->lcd_info.height = BSP_LCD_Y_MAX;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DrvLcdCmd(MEMORY_ACCESS_CTL);
 | 
				
			||||||
 | 
					    DrvLcdDataByte((uint8 *)&dir, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdSetArea(uint16 x1, uint16 y1, uint16 x2, uint16 y2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8 data[4] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    data[0] = (uint8)(x1 >> 8);
 | 
				
			||||||
 | 
					    data[1] = (uint8)(x1);
 | 
				
			||||||
 | 
					    data[2] = (uint8)(x2 >> 8);
 | 
				
			||||||
 | 
					    data[3] = (uint8)(x2);
 | 
				
			||||||
 | 
					    DrvLcdCmd(HORIZONTAL_ADDRESS_SET);
 | 
				
			||||||
 | 
					    DrvLcdDataByte(data, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    data[0] = (uint8)(y1 >> 8);
 | 
				
			||||||
 | 
					    data[1] = (uint8)(y1);
 | 
				
			||||||
 | 
					    data[2] = (uint8)(y2 >> 8);
 | 
				
			||||||
 | 
					    data[3] = (uint8)(y2);
 | 
				
			||||||
 | 
					    DrvLcdCmd(VERTICAL_ADDRESS_SET);
 | 
				
			||||||
 | 
					    DrvLcdDataByte(data, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DrvLcdCmd(MEMORY_WRITE);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdSetPixel(uint16_t x, uint16_t y, uint16_t color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DrvLcdSetArea(x, y, x, y);
 | 
				
			||||||
 | 
					    DrvLcdDataHalfWord(&color, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdSetPixelDot(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,void* color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32 size = 0;
 | 
				
			||||||
 | 
					    size = (x2- x1 + 1)*(y2 - y1 + 1);
 | 
				
			||||||
 | 
					    DrvLcdSetArea(x1, y1, x2, y2);
 | 
				
			||||||
 | 
					    DrvLcdDataHalfWord(color, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void LcdShowChar(uint16 x,uint16 y,uint8 num,uint8 size,uint16 color,uint16 back_color)
 | 
				
			||||||
 | 
					{  							  
 | 
				
			||||||
 | 
					    uint8 temp,t1,t;
 | 
				
			||||||
 | 
						uint16 y0=y;
 | 
				
			||||||
 | 
						uint8 csize=(size/8+((size%8)?1:0))*(size/2);	
 | 
				
			||||||
 | 
					 	num=num-' ';
 | 
				
			||||||
 | 
						for (t = 0;t < csize;t ++) {   
 | 
				
			||||||
 | 
							if (size==12)
 | 
				
			||||||
 | 
					            temp=asc2_1206[num][t]; 	 	     //1206
 | 
				
			||||||
 | 
							else if (size==16)
 | 
				
			||||||
 | 
					            temp=asc2_1608[num][t];	//1608
 | 
				
			||||||
 | 
							else if (size==24)
 | 
				
			||||||
 | 
					            temp=asc2_2412[num][t];	//2412
 | 
				
			||||||
 | 
							else if (size==32)
 | 
				
			||||||
 | 
					            temp=asc2_3216[num][t];	//3216
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
					            return;				
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(t1 = 0;t1 < 8;t1 ++) {			    
 | 
				
			||||||
 | 
								if (temp&0x80)
 | 
				
			||||||
 | 
					                DrvLcdSetPixel(x,y,color);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                DrvLcdSetPixel(x,y,back_color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								temp<<=1;
 | 
				
			||||||
 | 
								y++;
 | 
				
			||||||
 | 
								if(y>=aiit_lcd->lcd_info.height)
 | 
				
			||||||
 | 
					                return;	
 | 
				
			||||||
 | 
								if ((y-y0) == size) {
 | 
				
			||||||
 | 
									y=y0;
 | 
				
			||||||
 | 
									x++;
 | 
				
			||||||
 | 
									if(x>=aiit_lcd->lcd_info.width)
 | 
				
			||||||
 | 
					                    return;	
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}  	 
 | 
				
			||||||
 | 
						}  	    	   	 	  
 | 
				
			||||||
 | 
					}   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void LcdShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8 size,uint8 *p,uint16_t color,uint16_t back_color)
 | 
				
			||||||
 | 
					{         
 | 
				
			||||||
 | 
						uint16_t x0 = x;
 | 
				
			||||||
 | 
						width += x;
 | 
				
			||||||
 | 
						height += y;
 | 
				
			||||||
 | 
					    while ((*p<='~')&&(*p>=' ')) {       
 | 
				
			||||||
 | 
					        if (x>=width) {
 | 
				
			||||||
 | 
					            x=x0;
 | 
				
			||||||
 | 
					            y+=size;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(y>=height)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        LcdShowChar(x,y,*p,size,color,back_color);
 | 
				
			||||||
 | 
					        x += size/2;
 | 
				
			||||||
 | 
					        p++;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					*   clear lcd by  color
 | 
				
			||||||
 | 
					*   para     color
 | 
				
			||||||
 | 
					*   return  none
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					void DrvLcdClear(uint16 color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint32 data = ((uint32)color << 16) | (uint32)color;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DrvLcdSetArea(0, 0, aiit_lcd->lcd_info.width - 1, aiit_lcd->lcd_info.height - 1);
 | 
				
			||||||
 | 
					    gpiohs_set_pin(aiit_lcd->dc_pin, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					    spi_init(aiit_lcd->spi_channel, SPI_WORK_MODE_0, SPI_FF_OCTAL, 32, 0);
 | 
				
			||||||
 | 
					    spi_init_non_standard(aiit_lcd->spi_channel,
 | 
				
			||||||
 | 
					                                                          0                         /*instrction length*/, 
 | 
				
			||||||
 | 
					                                                          32                       /*address length   */, 
 | 
				
			||||||
 | 
					                                                          0                         /*wait cycles            */,
 | 
				
			||||||
 | 
					                                                         SPI_AITM_AS_FRAME_FORMAT );
 | 
				
			||||||
 | 
					    spi_fill_data_dma(aiit_lcd->dma_channel, aiit_lcd->spi_channel, aiit_lcd->cs, (const uint32_t *)&data, aiit_lcd->lcd_info.width * aiit_lcd->lcd_info.height / 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void DrvLcdRectUpdate(uint16_t x1, uint16_t y1, uint16_t width, uint16_t height)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    static uint16 * rect_buffer = NONE;
 | 
				
			||||||
 | 
					    if (!rect_buffer) {
 | 
				
			||||||
 | 
					        rect_buffer = x_malloc(aiit_lcd->lcd_info.height * aiit_lcd->lcd_info.width * (aiit_lcd->lcd_info.bits_per_pixel / 8));
 | 
				
			||||||
 | 
					        if (!rect_buffer) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (x1 == 0 && y1 == 0 && width == aiit_lcd->lcd_info.width && height == aiit_lcd->lcd_info.height) {
 | 
				
			||||||
 | 
					        DrvLcdSetArea(x1, y1, x1 + width - 1, y1 + height - 1);
 | 
				
			||||||
 | 
					        DrvLcdDataWord((uint32 *)aiit_lcd->lcd_info.framebuffer, width * height / (aiit_lcd->lcd_info.bits_per_pixel / 8));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        DrvLcdSetArea(x1, y1, x1 + width - 1, y1 + height - 1);
 | 
				
			||||||
 | 
					        DrvLcdDataWord((uint32 *)rect_buffer, width * height / 2);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					x_err_t DrvLcdInit(Lcd8080DeviceType dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					    aiit_lcd = (Lcd8080DeviceType)dev;
 | 
				
			||||||
 | 
					    uint8 data = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!aiit_lcd)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    DrvLcdHwInit(aiit_lcd);
 | 
				
			||||||
 | 
					    /* reset LCD */
 | 
				
			||||||
 | 
					    DrvLcdCmd(SOFTWARE_RESET);
 | 
				
			||||||
 | 
					    MdelayKTask(100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enter normal status */
 | 
				
			||||||
 | 
					    DrvLcdCmd(SLEEP_OFF);
 | 
				
			||||||
 | 
					    MdelayKTask(100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* pixel format rgb565 */
 | 
				
			||||||
 | 
					    DrvLcdCmd(PIXEL_FORMAT_SET);
 | 
				
			||||||
 | 
					    data = 0x55;
 | 
				
			||||||
 | 
					    DrvLcdDataByte(&data, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* set direction */
 | 
				
			||||||
 | 
					    DrvLcdSetDirection(DIR_YX_RLUD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    aiit_lcd->lcd_info.framebuffer = x_malloc(aiit_lcd->lcd_info.height * aiit_lcd->lcd_info.width * (aiit_lcd->lcd_info.bits_per_pixel / 8));
 | 
				
			||||||
 | 
					    CHECK(aiit_lcd->lcd_info.framebuffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*display on*/
 | 
				
			||||||
 | 
					    DrvLcdCmd(DISPALY_ON);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 drv_lcd_control(void* drv, struct BusConfigureInfo *configure_info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					    struct LcdDriver *lcddrv = (struct LcdDriver *)drv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct DeviceRectInfo* rect_info;
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(drv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (configure_info->configure_cmd)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case GRAPHIC_CTRL_RECT_UPDATE: 
 | 
				
			||||||
 | 
					            rect_info = (struct DeviceRectInfo*)configure_info->private_data;
 | 
				
			||||||
 | 
					            if(!rect_info)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                SYS_ERR("GRAPHIC_CTRL_RECT_UPDATE error args");
 | 
				
			||||||
 | 
					                return -ERROR;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            DrvLcdRectUpdate(rect_info->x, rect_info->y, rect_info->width, rect_info->height);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case GRAPHIC_CTRL_POWERON:
 | 
				
			||||||
 | 
					            /* Todo: power on */
 | 
				
			||||||
 | 
					            ret = -ENONESYS;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case GRAPHIC_CTRL_POWEROFF:
 | 
				
			||||||
 | 
					            /* Todo: power off */
 | 
				
			||||||
 | 
					            ret = -ENONESYS;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case GRAPHIC_CTRL_GET_INFO:
 | 
				
			||||||
 | 
					            *(struct DeviceLcdInfo *)configure_info->private_data = aiit_lcd->lcd_info;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case GRAPHIC_CTRL_SET_MODE:
 | 
				
			||||||
 | 
					            ret = -ENONESYS;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case GRAPHIC_CTRL_GET_EXT:
 | 
				
			||||||
 | 
					            ret = -ENONESYS;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            SYS_ERR("drv_lcd_control cmd: %d", configure_info->configure_cmd);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ClearHandwriting (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    //clear  the lcd    
 | 
				
			||||||
 | 
					    DrvLcdClear(WHITE);
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					    LcdShowString(10, 10, 100, 24, 24, "RST ", RED, WHITE);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_TOUCH
 | 
				
			||||||
 | 
					void HandTest(unsigned short *x_pos, unsigned short *y_pos)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    float x1,y1;
 | 
				
			||||||
 | 
					    TpReadXy(x_pos,y_pos);     //address
 | 
				
			||||||
 | 
					    float  a = 12.1875,b = 16.25;
 | 
				
			||||||
 | 
					    x1 = 320 -  (*x_pos)/a +10;
 | 
				
			||||||
 | 
					    y1 = (* y_pos)/b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((*x_pos> 500)&&(*y_pos<500)) {
 | 
				
			||||||
 | 
					        ClearHandwriting();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        DrvLcdSetPixel(x1,  y1,  RED);
 | 
				
			||||||
 | 
					        DrvLcdSetPixel(x1+1,  y1,  RED);
 | 
				
			||||||
 | 
					        DrvLcdSetPixel(x1-1,  y1,  RED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        DrvLcdSetPixel(x1,  y1+1,  RED);
 | 
				
			||||||
 | 
					        DrvLcdSetPixel(x1,  y1-1,  RED);
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					       DrvLcdSetPixel(x1+1,  y1+1,  RED);
 | 
				
			||||||
 | 
					       DrvLcdSetPixel(x1-1,  y1-1,  RED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       DrvLcdSetPixel(x1+1,  y1-1,  RED);
 | 
				
			||||||
 | 
					       DrvLcdSetPixel(x1-1,  y1+1,  RED);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 LcdWrite(void *dev, struct BusBlockWriteParam *write_param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (write_param  == NONE) {
 | 
				
			||||||
 | 
					         return  -ERROR;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					    LcdWriteParam * show = (LcdWriteParam *)write_param->buffer;
 | 
				
			||||||
 | 
					    // KPrintf("DEBUG TYPE %d X1:%d X2:%d Y1:%d Y2:%d\n",show->type,show->pixel_info.x_startpos, show->pixel_info.x_endpos,show->pixel_info.y_startpos, show->pixel_info.y_endpos);
 | 
				
			||||||
 | 
					    if(0 == show->type) //output string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LcdShowString(show->string_info.x_pos,show->string_info.y_pos,show->string_info.width,show->string_info.height,show->string_info.font_size,show->string_info.addr,show->string_info.font_color,show->string_info.back_color);
 | 
				
			||||||
 | 
					        return  EOK;   
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					    else if(1 == show->type)   //output dot
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // DrvLcdSetPixel(show->pixel_info.x_pos, show->pixel_info.y_pos, show->pixel_info.pixel_color);
 | 
				
			||||||
 | 
					        DrvLcdSetPixelDot(show->pixel_info.x_startpos,show->pixel_info.y_startpos, show->pixel_info.x_endpos, show->pixel_info.y_endpos,show->pixel_info.pixel_color);
 | 
				
			||||||
 | 
					        return  EOK;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					    else 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32 DrvLcdClearDone(void * dev, struct BusConfigureInfo *configure_info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16 color =   0;
 | 
				
			||||||
 | 
					    color =(uint16)(configure_info->configure_cmd |0x0000ffff );
 | 
				
			||||||
 | 
					    DrvLcdClear( color);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const struct LcdDevDone lcd_dev_done  = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    .open = NONE,
 | 
				
			||||||
 | 
					    .close = NONE,
 | 
				
			||||||
 | 
					    .write = LcdWrite,
 | 
				
			||||||
 | 
					    .read  = NONE
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int BoardLcdBusInit(struct LcdBus * lcd_bus, struct LcdDriver * lcd_driver,const char *bus_name, const char *drv_name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the lcd bus */
 | 
				
			||||||
 | 
					    ret = LcdBusInit( lcd_bus, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_lcd_init LcdBusInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the lcd driver*/
 | 
				
			||||||
 | 
					    ret = LcdDriverInit( lcd_driver, drv_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDriverInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Attach the lcd driver to the lcd bus*/
 | 
				
			||||||
 | 
					    ret = LcdDriverAttachToBus(drv_name, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDriverAttachToBus error %d\n", ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Attach the lcd device to the lcd bus*/
 | 
				
			||||||
 | 
					static int BoardLcdDevBend(struct LcdHardwareDevice *lcd_device, void *param, const char *bus_name, const char *dev_name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = LcdDeviceRegister(lcd_device, NONE, dev_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDeviceInit device %s error %d\n", dev_name, ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = LcdDeviceAttachToBus(dev_name, bus_name);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_LCD_init LcdDeviceAttachToBus device %s error %d\n", dev_name, ret);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return  ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int HwLcdInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct LcdDriver lcd_driver;
 | 
				
			||||||
 | 
					    memset(&lcd_driver, 0, sizeof(struct LcdDriver));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Lcd8080DeviceType  lcd_dev = (Lcd8080DeviceType  )x_malloc(sizeof(  struct Lcd8080Device));
 | 
				
			||||||
 | 
					    if (!lcd_dev) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(lcd_dev, 0, sizeof(struct Lcd8080Device));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // FpioaSetFunction(BSP_LCD_DC_PIN, FUNC_GPIOHS9);    //DC order/data
 | 
				
			||||||
 | 
					    // FpioaSetFunction(BSP_LCD_BL_PIN, FUNC_GPIOHS10);   //BL
 | 
				
			||||||
 | 
					    // FpioaSetFunction(BSP_LCD_CS_PIN, FUNC_SPI0_SS0);   //chip  select
 | 
				
			||||||
 | 
					    // FpioaSetFunction(BSP_LCD_WR_PIN, FUNC_SPI0_SCLK);  //clk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_dev->cs                       = SPI_CHIP_SELECT_0;
 | 
				
			||||||
 | 
					    lcd_dev->dc_pin                   = FPIOA_LCD_DC;  
 | 
				
			||||||
 | 
					    lcd_dev->dma_channel              = DMAC_CHANNEL0;
 | 
				
			||||||
 | 
					    lcd_dev->spi_channel              = SPI_DEVICE_0;
 | 
				
			||||||
 | 
					    lcd_dev->lcd_info.bits_per_pixel  = 16;
 | 
				
			||||||
 | 
					    lcd_dev->lcd_info.pixel_format    = PIXEL_FORMAT_BGR565;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sysctl_set_power_mode(SYSCTL_POWER_BANK6, SYSCTL_POWER_V18);
 | 
				
			||||||
 | 
					    sysctl_set_power_mode(SYSCTL_POWER_BANK7, SYSCTL_POWER_V18);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sysctl_set_spi0_dvp_data(1); //open  the lcd  interface  with spi0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_driver.configure = &drv_lcd_control;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardLcdBusInit(&lcd_dev->lcd_bus, &lcd_driver, LCD_BUS_NAME, LCD_DRV_NAME);  //init  lcd bus
 | 
				
			||||||
 | 
					    if (EOK != ret)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("Board_lcd_Init error ret %u\n", ret);
 | 
				
			||||||
 | 
					        x_free(lcd_dev);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct LcdHardwareDevice lcd_device;      
 | 
				
			||||||
 | 
					    memset(&lcd_device, 0, sizeof(struct LcdHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lcd_device.dev_done = &(lcd_dev_done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardLcdDevBend(&lcd_device, NONE, LCD_BUS_NAME, LCD_DEVICE_NAME);                             //init  lcd device
 | 
				
			||||||
 | 
					    if (EOK != ret)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        KPrintf("BoardLcdDevBend error ret %u\n", ret);
 | 
				
			||||||
 | 
					        x_free(lcd_dev);
 | 
				
			||||||
 | 
					        return -ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gpiohs_set_drive_mode(FPIOA_LCD_RST, GPIO_DM_OUTPUT);
 | 
				
			||||||
 | 
					    gpiohs_set_pin(FPIOA_LCD_RST, GPIO_PV_LOW);
 | 
				
			||||||
 | 
					    MdelayKTask(100);
 | 
				
			||||||
 | 
					    gpiohs_set_pin(FPIOA_LCD_RST, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					    MdelayKTask(100);   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    KPrintf("LCD driver inited ...\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DrvLcdInit(lcd_dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//x1,y1:start
 | 
				
			||||||
 | 
					//x2,y2:end  
 | 
				
			||||||
 | 
					void LcdDrawLine(uint16 x1, uint16 y1, uint16 x2, uint16 y2,uint16 color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint16 t; 
 | 
				
			||||||
 | 
						int xerr = 0, yerr = 0, delta_x, delta_y, distance; 
 | 
				
			||||||
 | 
						int incx,incy,uRow,uCol; 
 | 
				
			||||||
 | 
						delta_x = x2 - x1;  
 | 
				
			||||||
 | 
						delta_y = y2 - y1; 
 | 
				
			||||||
 | 
						uRow = x1; 
 | 
				
			||||||
 | 
						uCol = y1; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(delta_x>0)
 | 
				
			||||||
 | 
					        incx = 1; 
 | 
				
			||||||
 | 
						else if(delta_x==0)
 | 
				
			||||||
 | 
					        incx = 0;
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
					        incx = -1;
 | 
				
			||||||
 | 
					        delta_x = -delta_x;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(delta_y>0)
 | 
				
			||||||
 | 
					        incy = 1; 
 | 
				
			||||||
 | 
						else if(delta_y==0)
 | 
				
			||||||
 | 
					        incy = 0;
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
					        incy= -1;
 | 
				
			||||||
 | 
					        delta_y = -delta_y;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (delta_x>delta_y)
 | 
				
			||||||
 | 
					        distance=delta_x; 
 | 
				
			||||||
 | 
						else 
 | 
				
			||||||
 | 
					        distance=delta_y; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(t = 0;t <= distance+1;t ++ ) {  
 | 
				
			||||||
 | 
					        DrvLcdSetPixel(uRow,uCol,color);
 | 
				
			||||||
 | 
							xerr += delta_x ; 
 | 
				
			||||||
 | 
							yerr += delta_y ; 
 | 
				
			||||||
 | 
							if (xerr>distance) { 
 | 
				
			||||||
 | 
								xerr-=distance; 
 | 
				
			||||||
 | 
								uRow+=incx; 
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							if (yerr>distance) { 
 | 
				
			||||||
 | 
								yerr-=distance; 
 | 
				
			||||||
 | 
								uCol+=incy; 
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
						}  
 | 
				
			||||||
 | 
					}    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void LcdDrawRectangle(uint16 x1, uint16 y1, uint16 x2, uint16 y2,uint16 color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						LcdDrawLine(x1,y1,x2,y1,color);
 | 
				
			||||||
 | 
						LcdDrawLine(x1,y1,x1,y2,color);
 | 
				
			||||||
 | 
						LcdDrawLine(x1,y2,x2,y2,color);
 | 
				
			||||||
 | 
						LcdDrawLine(x2,y1,x2,y2,color);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void LcdDrawCircle(uint16 x0,uint16 y0,uint8 r,uint16 color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int a,b;
 | 
				
			||||||
 | 
						int di;
 | 
				
			||||||
 | 
						a = 0;
 | 
				
			||||||
 | 
					    b = r;	  
 | 
				
			||||||
 | 
						di = 3-(r<<1);            
 | 
				
			||||||
 | 
						while(a <= b) {
 | 
				
			||||||
 | 
							DrvLcdSetPixel(x0+a,y0-b,color);             //5
 | 
				
			||||||
 | 
					 		DrvLcdSetPixel(x0+b,y0-a,color);             //0           
 | 
				
			||||||
 | 
							DrvLcdSetPixel(x0+b,y0+a,color);             //4               
 | 
				
			||||||
 | 
							DrvLcdSetPixel(x0+a,y0+b,color);             //6 
 | 
				
			||||||
 | 
							DrvLcdSetPixel(x0-a,y0+b,color);             //1       
 | 
				
			||||||
 | 
					 		DrvLcdSetPixel(x0-b,y0+a,color);             
 | 
				
			||||||
 | 
							DrvLcdSetPixel(x0-a,y0-b,color);             //2             
 | 
				
			||||||
 | 
					  		DrvLcdSetPixel(x0-b,y0-a,color);             //7     	         
 | 
				
			||||||
 | 
							a++;
 | 
				
			||||||
 | 
							//Bresenham     
 | 
				
			||||||
 | 
							if(di<0)
 | 
				
			||||||
 | 
					            di += 4*a+6;	  
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								di += 10+4*(a-b);   
 | 
				
			||||||
 | 
								b--;
 | 
				
			||||||
 | 
							} 						    
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}								  
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,125 @@
 | 
				
			||||||
 | 
					config BSP_USING_SPI1
 | 
				
			||||||
 | 
					bool "Using spi1  "
 | 
				
			||||||
 | 
					default y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if BSP_USING_SPI1
 | 
				
			||||||
 | 
					    config SPI_BUS_NAME_1
 | 
				
			||||||
 | 
					        string "spi bus 1 name"
 | 
				
			||||||
 | 
					        default "spi1"
 | 
				
			||||||
 | 
					    config SPI_1_DRV_NAME
 | 
				
			||||||
 | 
					        string "spi bus 1 driver name"
 | 
				
			||||||
 | 
					        default "spi1_drv"    
 | 
				
			||||||
 | 
					    config BSP_SPI1_CLK_PIN
 | 
				
			||||||
 | 
					        int "spi1 clk pin number"
 | 
				
			||||||
 | 
					        default 6
 | 
				
			||||||
 | 
					    config BSP_SPI1_D0_PIN
 | 
				
			||||||
 | 
					        int "spi1 d0 pin number"
 | 
				
			||||||
 | 
					        default 8
 | 
				
			||||||
 | 
					    config BSP_SPI1_D1_PIN
 | 
				
			||||||
 | 
					        int "spi1 d1 pin number"
 | 
				
			||||||
 | 
					        default 7
 | 
				
			||||||
 | 
					    menuconfig BSP_SPI1_USING_SS0
 | 
				
			||||||
 | 
					        bool "SPI1 Enable SS0"
 | 
				
			||||||
 | 
					        default y
 | 
				
			||||||
 | 
					    if BSP_SPI1_USING_SS0
 | 
				
			||||||
 | 
					        config SPI_1_DEVICE_NAME_0
 | 
				
			||||||
 | 
					            string "spi bus 1 device 0 name"
 | 
				
			||||||
 | 
					            default "spi1_dev0"        
 | 
				
			||||||
 | 
					        config BSP_SPI1_SS0_PIN
 | 
				
			||||||
 | 
					            int "spi1 ss0 pin number"
 | 
				
			||||||
 | 
					            default 9
 | 
				
			||||||
 | 
					    menuconfig RESOURCES_SPI_LORA
 | 
				
			||||||
 | 
					    bool "Using spi lora function"
 | 
				
			||||||
 | 
					    default n
 | 
				
			||||||
 | 
					        if RESOURCES_SPI_LORA
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_NAME
 | 
				
			||||||
 | 
					            string "SX1278 lora device name"
 | 
				
			||||||
 | 
					            default "spi1_lora"
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_RST_PIN
 | 
				
			||||||
 | 
					            int
 | 
				
			||||||
 | 
					            default 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_DO0_PIN
 | 
				
			||||||
 | 
					            int
 | 
				
			||||||
 | 
					            default 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_DO1_PIN
 | 
				
			||||||
 | 
					            int
 | 
				
			||||||
 | 
					            default 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_DO2_PIN
 | 
				
			||||||
 | 
					            int
 | 
				
			||||||
 | 
					            default 10
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_DO3_PIN
 | 
				
			||||||
 | 
					            int
 | 
				
			||||||
 | 
					            default 10
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_DO4_PIN
 | 
				
			||||||
 | 
					            int
 | 
				
			||||||
 | 
					            default 10
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        config SX12XX_DEVICE_DO5_PIN
 | 
				
			||||||
 | 
					            int
 | 
				
			||||||
 | 
					            default 10
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    menuconfig BSP_SPI1_USING_SS1
 | 
				
			||||||
 | 
					        bool "SPI1 Enable SS1"
 | 
				
			||||||
 | 
					        default y
 | 
				
			||||||
 | 
					    if BSP_SPI1_USING_SS1
 | 
				
			||||||
 | 
					        config SPI_1_DEVICE_NAME_1
 | 
				
			||||||
 | 
					            string "spi bus 1 device 1 name"
 | 
				
			||||||
 | 
					            default "spi1_dev1"             
 | 
				
			||||||
 | 
					        config BSP_SPI1_SS1_PIN
 | 
				
			||||||
 | 
					            int "spi1 ss1 pin number"
 | 
				
			||||||
 | 
					            default 33
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    menuconfig BSP_SPI1_USING_SS2
 | 
				
			||||||
 | 
					        bool "SPI1 Enable SS2"
 | 
				
			||||||
 | 
					        default n
 | 
				
			||||||
 | 
					    if BSP_SPI1_USING_SS2
 | 
				
			||||||
 | 
					        config SPI_1_DEVICE_NAME_2
 | 
				
			||||||
 | 
					            string "spi bus 1 device 2 name"
 | 
				
			||||||
 | 
					            default "spi1_dev2"              
 | 
				
			||||||
 | 
					        config BSP_SPI1_SS2_PIN
 | 
				
			||||||
 | 
					            int "spi1 ss2 pin number"
 | 
				
			||||||
 | 
					            default 26
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    menuconfig BSP_SPI1_USING_SS3
 | 
				
			||||||
 | 
					        bool "SPI1 Enable SS3"
 | 
				
			||||||
 | 
					        default n
 | 
				
			||||||
 | 
					    if BSP_SPI1_USING_SS3
 | 
				
			||||||
 | 
					        config SPI_1_DEVICE_NAME_3
 | 
				
			||||||
 | 
					            string "spi bus 1 device 3 name"
 | 
				
			||||||
 | 
					            default "spi1_dev3"               
 | 
				
			||||||
 | 
					        config BSP_SPI1_SS3_PIN
 | 
				
			||||||
 | 
					            int "spi1 ss3 pin number"
 | 
				
			||||||
 | 
					            default 27
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config BSP_USING_TP
 | 
				
			||||||
 | 
					bool "Using LCD touch  "
 | 
				
			||||||
 | 
					default n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if BSP_USING_TP
 | 
				
			||||||
 | 
					    config BSP_TP_SCK_PIN
 | 
				
			||||||
 | 
					        int "TP SCK pin number"
 | 
				
			||||||
 | 
					        default 42
 | 
				
			||||||
 | 
					    config BSP_TP_NCS_PIN
 | 
				
			||||||
 | 
					        int "TP NCS pin number"
 | 
				
			||||||
 | 
					        default 43
 | 
				
			||||||
 | 
					    config BSP_TP_MISO_PIN
 | 
				
			||||||
 | 
					        int "TP MISO pin number"
 | 
				
			||||||
 | 
					        default 44
 | 
				
			||||||
 | 
					    config BSP_TP_IRQ_PIN
 | 
				
			||||||
 | 
					        int "TP IRQ pin number"
 | 
				
			||||||
 | 
					        default 45
 | 
				
			||||||
 | 
					    config BSP_TP_MOSI_PIN
 | 
				
			||||||
 | 
					        int "TP MOSI pin number"
 | 
				
			||||||
 | 
					        default 46
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					SRC_FILES := connect_spi.c hardware_spi.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_RESOURCES_SPI_LORA),y)
 | 
				
			||||||
 | 
						SRC_DIR += third_party_spi_lora
 | 
				
			||||||
 | 
						SRC_FILES += connect_lora_spi.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,475 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2020 RT-Thread Development Team
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Change Logs:
 | 
				
			||||||
 | 
					 * Date           Author       Notes
 | 
				
			||||||
 | 
					 * 2019-03-18     ZYH          first version
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file connect_spi.c
 | 
				
			||||||
 | 
					* @brief support aiit-riscv64-board spi function and register to bus framework
 | 
				
			||||||
 | 
					* @version 1.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2021-04-25
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*************************************************
 | 
				
			||||||
 | 
					File name: connect_spi.c
 | 
				
			||||||
 | 
					Description: support aiit-riscv64-board spi configure and spi bus register function
 | 
				
			||||||
 | 
					Others: take RT-Thread v4.0.2/bsp/k210/driver/drv_spi.c for references
 | 
				
			||||||
 | 
					                https://github.com/RT-Thread/rt-thread/tree/v4.0.2
 | 
				
			||||||
 | 
					History: 
 | 
				
			||||||
 | 
					1. Date: 2021-04-25
 | 
				
			||||||
 | 
					Author: AIIT XUOS Lab
 | 
				
			||||||
 | 
					Modification: 
 | 
				
			||||||
 | 
					1. support aiit-riscv64-board spi configure, write and read
 | 
				
			||||||
 | 
					2. support aiit-riscv64-board spi bus device and driver register
 | 
				
			||||||
 | 
					*************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <connect_spi.h>
 | 
				
			||||||
 | 
					#include <dmac.h>
 | 
				
			||||||
 | 
					#include <drv_io_config.h>
 | 
				
			||||||
 | 
					#include <gpiohs.h>
 | 
				
			||||||
 | 
					#include <hardware_spi.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <sysctl.h>
 | 
				
			||||||
 | 
					#include <utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef  BSP_SPI1_USING_SS0
 | 
				
			||||||
 | 
					#define SPI_DEVICE_SLAVE_ID_0 0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_SPI1_USING_SS1
 | 
				
			||||||
 | 
					#define SPI_DEVICE_SLAVE_ID_1 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_SPI1_USING_SS2
 | 
				
			||||||
 | 
					#define SPI_DEVICE_SLAVE_ID_2 2
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_SPI1_USING_SS3
 | 
				
			||||||
 | 
					#define SPI_DEVICE_SLAVE_ID_3 3
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static volatile spi_t *const spi_instance[4] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    (volatile spi_t *)SPI0_BASE_ADDR,
 | 
				
			||||||
 | 
					    (volatile spi_t *)SPI1_BASE_ADDR,
 | 
				
			||||||
 | 
					    (volatile spi_t *)SPI_SLAVE_BASE_ADDR,
 | 
				
			||||||
 | 
					    (volatile spi_t *)SPI3_BASE_ADDR
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void __spi_set_tmod(uint8_t spi_num, uint32_t tmod)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    CHECK(spi_num < SPI_DEVICE_MAX);
 | 
				
			||||||
 | 
					    volatile spi_t *spi_handle = spi[spi_num];
 | 
				
			||||||
 | 
					    uint8_t tmod_offset = 0;
 | 
				
			||||||
 | 
					    switch(spi_num)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case 0:
 | 
				
			||||||
 | 
					        case 1:
 | 
				
			||||||
 | 
					        case 2:
 | 
				
			||||||
 | 
					            tmod_offset = 8;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 3:
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            tmod_offset = 10;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    set_bit(&spi_handle->ctrlr0, 3 << tmod_offset, tmod << tmod_offset);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Init the spi sdk intetface */
 | 
				
			||||||
 | 
					static uint32 SpiSdkInit(struct SpiDriver *spi_drv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(spi_drv);    
 | 
				
			||||||
 | 
					    uint8 cs_gpio_pin, cs_select_id;
 | 
				
			||||||
 | 
					    uint32 max_frequency;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SpiDeviceParam *dev_param = (SpiDeviceParam *)(spi_drv->driver.private_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cs_gpio_pin = dev_param->spi_slave_param->spi_cs_gpio_pin;
 | 
				
			||||||
 | 
					    cs_select_id = dev_param->spi_slave_param->spi_cs_select_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gpiohs_set_drive_mode(cs_select_id, GPIO_DM_OUTPUT);//Set the cs pin as output
 | 
				
			||||||
 | 
					    gpiohs_set_pin(cs_gpio_pin, GPIO_PV_HIGH);//set the cs gpio high
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_init(dev_param->spi_dma_param->spi_master_id, 
 | 
				
			||||||
 | 
					                        dev_param->spi_master_param->spi_work_mode & SPI_MODE_3, 
 | 
				
			||||||
 | 
					                        dev_param->spi_master_param->spi_frame_format, 
 | 
				
			||||||
 | 
					                        dev_param->spi_master_param->spi_data_bit_width,
 | 
				
			||||||
 | 
					                        dev_param->spi_master_param->spi_data_endian);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    max_frequency = (dev_param->spi_master_param->spi_maxfrequency < SPI_MAX_CLOCK) ? dev_param->spi_master_param->spi_maxfrequency : SPI_MAX_CLOCK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32 real_freq = spi_set_clk_rate(dev_param->spi_dma_param->spi_master_id, max_frequency);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return EOK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 SpiSdkCfg(struct SpiDriver *spi_drv, struct SpiMasterParam *spi_param)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(spi_drv);
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(spi_param);  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SpiDeviceParam *dev_param = (SpiDeviceParam *)(spi_drv->driver.private_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dev_param->spi_master_param = spi_param;
 | 
				
			||||||
 | 
					    dev_param->spi_master_param->spi_work_mode = dev_param->spi_master_param->spi_work_mode  & SPI_MODE_MASK;
 | 
				
			||||||
 | 
					    dev_param->spi_master_param->spi_frame_format = SPI_FF_STANDARD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return EOK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Configure the spi device param, make sure struct (configure_info->private_data) = (SpiMasterParam)*/
 | 
				
			||||||
 | 
					static uint32 SpiDrvConfigure(void *drv, struct BusConfigureInfo *configure_info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(drv);
 | 
				
			||||||
 | 
					    NULL_PARAM_CHECK(configure_info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					    struct SpiDriver *spi_drv = (struct SpiDriver *)drv;
 | 
				
			||||||
 | 
					    struct SpiMasterParam *spi_param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (configure_info->configure_cmd)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case OPE_INT:
 | 
				
			||||||
 | 
					            ret = SpiSdkInit(spi_drv);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case OPE_CFG:
 | 
				
			||||||
 | 
					            spi_param = (struct SpiMasterParam *)configure_info->private_data;
 | 
				
			||||||
 | 
					            ret = SpiSdkCfg(spi_drv, spi_param);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 SpiWriteData(struct SpiHardwareDevice *spi_dev, struct SpiDataStandard *spi_datacfg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SpiDeviceParam *dev_param = (SpiDeviceParam *)(spi_dev->haldev.private_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8 device_id = dev_param->spi_slave_param->spi_slave_id;
 | 
				
			||||||
 | 
					    uint8 device_master_id = dev_param->spi_dma_param->spi_master_id;
 | 
				
			||||||
 | 
					    uint8 cs_gpio_pin = dev_param->spi_slave_param->spi_cs_gpio_pin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (NONE != spi_datacfg)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        uint32_t * tx_buff = NONE;
 | 
				
			||||||
 | 
					        int i;
 | 
				
			||||||
 | 
					        x_ubase dummy = 0xFFFFFFFFU;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        __spi_set_tmod(device_master_id, SPI_TMOD_TRANS_RECV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (spi_datacfg->spi_chip_select) {
 | 
				
			||||||
 | 
					            gpiohs_set_pin(cs_gpio_pin, GPIO_PV_LOW);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (spi_datacfg->length) {
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->dmacr = 0x3;
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ssienr = 0x01;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sysctl_dma_select(dev_param->spi_dma_param->spi_dmac_txchannel, SYSCTL_DMA_SELECT_SSI0_TX_REQ + device_master_id * 2);
 | 
				
			||||||
 | 
					            sysctl_dma_select(dev_param->spi_dma_param->spi_dmac_rxchannel, SYSCTL_DMA_SELECT_SSI0_RX_REQ + device_master_id* 2);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_rxchannel, (void *)(&spi_instance[device_master_id]->dr[0]), &dummy, DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
 | 
				
			||||||
 | 
					                DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!spi_datacfg->tx_buff) {
 | 
				
			||||||
 | 
					                dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_txchannel, &dummy, (void *)(&spi_instance[device_master_id]->dr[0]), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
 | 
				
			||||||
 | 
					                            DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                tx_buff = x_malloc(spi_datacfg->length * 4);
 | 
				
			||||||
 | 
					                if (!tx_buff) {
 | 
				
			||||||
 | 
					                    goto transfer_done;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                for (i = 0; i < spi_datacfg->length; i++) {
 | 
				
			||||||
 | 
					                    tx_buff[i] = ((uint8_t *)spi_datacfg->tx_buff)[i];
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_txchannel, tx_buff, (void *)(&spi_instance[device_master_id]->dr[0]), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
 | 
				
			||||||
 | 
					                            DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ser = 1U << dev_param->spi_slave_param->spi_cs_select_id;
 | 
				
			||||||
 | 
					            dmac_wait_done(dev_param->spi_dma_param->spi_dmac_txchannel);
 | 
				
			||||||
 | 
					            dmac_wait_done(dev_param->spi_dma_param->spi_dmac_rxchannel);
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ser = 0x00;
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ssienr = 0x00;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    transfer_done:
 | 
				
			||||||
 | 
					            if (tx_buff) {
 | 
				
			||||||
 | 
					                x_free(tx_buff);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (spi_datacfg->spi_cs_release) {
 | 
				
			||||||
 | 
					            gpiohs_set_pin(cs_gpio_pin, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        spi_datacfg = spi_datacfg->next;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return EOK;    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32 SpiReadData(struct SpiHardwareDevice *spi_dev, struct SpiDataStandard *spi_datacfg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SpiDeviceParam *dev_param = (SpiDeviceParam *)(spi_dev->haldev.private_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32 spi_read_length = 0;;
 | 
				
			||||||
 | 
					    uint8 device_id = dev_param->spi_slave_param->spi_slave_id;
 | 
				
			||||||
 | 
					    uint8 device_master_id = dev_param->spi_dma_param->spi_master_id;
 | 
				
			||||||
 | 
					    uint8 cs_gpio_pin = dev_param->spi_slave_param->spi_cs_gpio_pin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (NONE != spi_datacfg)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        uint32_t * rx_buff = NONE;
 | 
				
			||||||
 | 
					        int i;
 | 
				
			||||||
 | 
					        x_ubase dummy = 0xFFFFFFFFU;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        __spi_set_tmod(device_master_id, SPI_TMOD_TRANS_RECV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (spi_datacfg->spi_chip_select) {
 | 
				
			||||||
 | 
					            gpiohs_set_pin(cs_gpio_pin, GPIO_PV_LOW);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (spi_datacfg->length) {
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->dmacr = 0x3;
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ssienr = 0x01;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sysctl_dma_select(dev_param->spi_dma_param->spi_dmac_txchannel, SYSCTL_DMA_SELECT_SSI0_TX_REQ + device_master_id * 2);
 | 
				
			||||||
 | 
					            sysctl_dma_select(dev_param->spi_dma_param->spi_dmac_rxchannel, SYSCTL_DMA_SELECT_SSI0_RX_REQ + device_master_id* 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_txchannel, &dummy, (void *)(&spi_instance[device_master_id]->dr[0]), DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
 | 
				
			||||||
 | 
					                DMAC_MSIZE_4, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!spi_datacfg->rx_buff) {
 | 
				
			||||||
 | 
					                dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_rxchannel, (void *)(&spi_instance[device_master_id]->dr[0]), &dummy, DMAC_ADDR_NOCHANGE, DMAC_ADDR_NOCHANGE,
 | 
				
			||||||
 | 
					                            DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                rx_buff = x_calloc(spi_datacfg->length * 4, 1);
 | 
				
			||||||
 | 
					                if(!rx_buff)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    goto transfer_done;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                dmac_set_single_mode(dev_param->spi_dma_param->spi_dmac_rxchannel, (void *)(&spi_instance[device_master_id]->dr[0]), rx_buff, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
 | 
				
			||||||
 | 
					                            DMAC_MSIZE_1, DMAC_TRANS_WIDTH_32, spi_datacfg->length);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ser = 1U << dev_param->spi_slave_param->spi_cs_select_id;
 | 
				
			||||||
 | 
					            dmac_wait_done(dev_param->spi_dma_param->spi_dmac_txchannel);
 | 
				
			||||||
 | 
					            dmac_wait_done(dev_param->spi_dma_param->spi_dmac_rxchannel);
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ser = 0x00;
 | 
				
			||||||
 | 
					            spi_instance[device_master_id]->ssienr = 0x00;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (spi_datacfg->rx_buff) {
 | 
				
			||||||
 | 
					                for (i = 0; i < spi_datacfg->length; i++) {           
 | 
				
			||||||
 | 
					                    ((uint8_t *)spi_datacfg->rx_buff)[i] = (uint8_t)rx_buff[i];
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    transfer_done:
 | 
				
			||||||
 | 
					            if (rx_buff) {
 | 
				
			||||||
 | 
					                x_free(rx_buff);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (spi_datacfg->spi_cs_release) {
 | 
				
			||||||
 | 
					            gpiohs_set_pin(cs_gpio_pin, GPIO_PV_HIGH);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        spi_read_length += spi_datacfg->length;
 | 
				
			||||||
 | 
					        spi_datacfg = spi_datacfg->next;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return spi_read_length;    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*manage the spi device operations*/
 | 
				
			||||||
 | 
					static const struct SpiDevDone spi_dev_done =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    .dev_open = NONE,
 | 
				
			||||||
 | 
					    .dev_close = NONE,
 | 
				
			||||||
 | 
					    .dev_write = SpiWriteData,
 | 
				
			||||||
 | 
					    .dev_read = SpiReadData,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int BoardSpiBusInit(struct SpiBus *spi_bus, struct SpiDriver *spi_driver)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the spi bus */
 | 
				
			||||||
 | 
					    ret = SpiBusInit(spi_bus, SPI_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiBusInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Init the spi driver*/
 | 
				
			||||||
 | 
					    ret = SpiDriverInit(spi_driver, SPI_1_DRV_NAME);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDriverInit error %d\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*Attach the spi driver to the spi bus*/
 | 
				
			||||||
 | 
					    ret = SpiDriverAttachToBus(SPI_1_DRV_NAME, SPI_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDriverAttachToBus error %d\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Attach the spi device to the spi bus*/
 | 
				
			||||||
 | 
					static int BoardSpiDevBend(struct SpiDmaParam *spi_initparam)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_SPI1_USING_SS0
 | 
				
			||||||
 | 
					    static struct SpiHardwareDevice spi_device0;
 | 
				
			||||||
 | 
					    memset(&spi_device0, 0, sizeof(struct SpiHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct SpiSlaveParam spi_slaveparam0;
 | 
				
			||||||
 | 
					    memset(&spi_slaveparam0, 0, sizeof(struct SpiSlaveParam));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_slaveparam0.spi_slave_id = SPI_DEVICE_SLAVE_ID_0;
 | 
				
			||||||
 | 
					    spi_slaveparam0.spi_cs_gpio_pin = SPI1_CS0_PIN;
 | 
				
			||||||
 | 
					    spi_slaveparam0.spi_cs_select_id = SPI_CHIP_SELECT_0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_device0.spi_param.spi_dma_param = spi_initparam;
 | 
				
			||||||
 | 
					    spi_device0.spi_param.spi_slave_param = &spi_slaveparam0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_device0.spi_dev_done = &(spi_dev_done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceRegister(&spi_device0, (void *)(&spi_device0.spi_param), SPI_1_DEVICE_NAME_0);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceInit device %s error %d\n", SPI_1_DEVICE_NAME_0, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceAttachToBus(SPI_1_DEVICE_NAME_0, SPI_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceAttachToBus device %s error %d\n", SPI_1_DEVICE_NAME_0, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_SPI1_USING_SS1
 | 
				
			||||||
 | 
					    static struct SpiHardwareDevice spi_device1;
 | 
				
			||||||
 | 
					    memset(&spi_device1, 0, sizeof(struct SpiHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct SpiSlaveParam spi_slaveparam1;
 | 
				
			||||||
 | 
					    memset(&spi_slaveparam1, 0, sizeof(struct SpiSlaveParam));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_slaveparam1.spi_slave_id = SPI_DEVICE_SLAVE_ID_1;
 | 
				
			||||||
 | 
					    spi_slaveparam1.spi_cs_gpio_pin = SPI1_CS1_PIN;
 | 
				
			||||||
 | 
					    spi_slaveparam1.spi_cs_select_id = SPI_CHIP_SELECT_1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_device1.spi_param.spi_dma_param = spi_initparam;
 | 
				
			||||||
 | 
					    spi_device1.spi_param.spi_slave_param = &spi_slaveparam1;    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    spi_device1.spi_dev_done = &(spi_dev_done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceRegister(&spi_device1, (void *)(&spi_device1.spi_param), SPI_1_DEVICE_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceInit device %s error %d\n", SPI_1_DEVICE_NAME_1, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceAttachToBus(SPI_1_DEVICE_NAME_1, SPI_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceAttachToBus device %s error %d\n", SPI_1_DEVICE_NAME_1, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_SPI1_USING_SS2
 | 
				
			||||||
 | 
					    static struct SpiHardwareDevice spi_device2;
 | 
				
			||||||
 | 
					    memset(&spi_device2, 0, sizeof(struct SpiHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_initparam->spi_slave_id[SPI_DEVICE_SLAVE_ID_2] = SPI_DEVICE_SLAVE_ID_2;
 | 
				
			||||||
 | 
					    spi_initparam->spi_cs_gpio_pin[SPI_DEVICE_SLAVE_ID_2] = SPI1_CS2_PIN;
 | 
				
			||||||
 | 
					    spi_initparam->spi_cs_select_id[SPI_DEVICE_SLAVE_ID_2] = SPI_CHIP_SELECT_2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_device2.spi_dev_done = &(spi_dev_done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceRegister(&spi_device2, (void *)(&spi_device2.spi_param), SPI_1_DEVICE_NAME_2);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceInit device %s error %d\n", SPI_1_DEVICE_NAME_2, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceAttachToBus(SPI_1_DEVICE_NAME_2, SPI_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceAttachToBus device %s error %d\n", SPI_1_DEVICE_NAME_2, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BSP_SPI1_USING_SS3
 | 
				
			||||||
 | 
					    static struct SpiHardwareDevice spi_device3;
 | 
				
			||||||
 | 
					    memset(&spi_device3, 0, sizeof(struct SpiHardwareDevice));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_initparam->spi_slave_id[SPI_DEVICE_SLAVE_ID_3] = SPI_DEVICE_SLAVE_ID_3;
 | 
				
			||||||
 | 
					    spi_initparam->spi_cs_gpio_pin[SPI_DEVICE_SLAVE_ID_3] = SPI1_CS3_PIN;
 | 
				
			||||||
 | 
					    spi_initparam->spi_cs_select_id[SPI_DEVICE_SLAVE_ID_3] = SPI_CHIP_SELECT_3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_device3.spi_dev_done = &(spi_dev_done);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceRegister(&spi_device3, (void *)(&spi_device3.spi_param), SPI_1_DEVICE_NAME_3);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceInit device %s error %d\n", SPI_1_DEVICE_NAME_3, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = SpiDeviceAttachToBus(SPI_1_DEVICE_NAME_3, SPI_BUS_NAME_1);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_init SpiDeviceAttachToBus device %s error %d\n", SPI_1_DEVICE_NAME_3, ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return  ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*RISC-V 64 BOARD SPI INIT*/
 | 
				
			||||||
 | 
					int HwSpiInit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    x_err_t ret = EOK;
 | 
				
			||||||
 | 
					    static struct SpiDmaParam spi_initparam;
 | 
				
			||||||
 | 
					    memset(&spi_initparam, 0, sizeof(struct SpiDmaParam));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef  BSP_USING_SPI1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct SpiBus spi_bus;
 | 
				
			||||||
 | 
					    memset(&spi_bus, 0, sizeof(struct SpiBus));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct SpiDriver spi_driver;
 | 
				
			||||||
 | 
					    memset(&spi_driver, 0, sizeof(struct SpiDriver));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spi_initparam.spi_master_id = SPI_DEVICE_1;
 | 
				
			||||||
 | 
					    spi_initparam.spi_dmac_txchannel = DMAC_CHANNEL1;
 | 
				
			||||||
 | 
					    spi_initparam.spi_dmac_rxchannel = DMAC_CHANNEL2;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    spi_driver.configure = &(SpiDrvConfigure);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardSpiBusInit(&spi_bus, &spi_driver);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_Init error ret %u\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = BoardSpiDevBend(&spi_initparam);
 | 
				
			||||||
 | 
					    if (EOK != ret) {
 | 
				
			||||||
 | 
					        KPrintf("Board_Spi_Init error ret %u\n", ret);
 | 
				
			||||||
 | 
					        return ERROR;
 | 
				
			||||||
 | 
					    }    
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue