Files

309 lines
11 KiB
C

#ifndef _SPI_DRV_H_
#define _SPI_DRV_H_
#include "QuecPrjName.h"
#include "quec_mfpr_api.h"
#if defined (__QUECTEL_PROJECT_EC600MCN_LA__) || defined (__QUECTEL_PROJECT_EC600MCN_LE__)\
|| defined (__QUECTEL_PROJECT_EC600MCN_LC__) || defined (__QUECTEL_PROJECT_EC600MCN_LF__) \
|| defined (__QUECTEL_PROJECT_EC600MCN_CC__) || defined (__QUECTEL_PROJECT_EC600MCN_MC__)\
|| defined (__QUECTEL_PROJECT_EC600MEU_LA__) || defined (__QUECTEL_PROJECT_EC600MLA_LA__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_14
#define QUEC_LCD_SPI_CS_NUM GPIO_13
#define QUEC_LCD_SPI_RST_NUM GPIO_50
#define QUEC_LCD_SPI_SCLK_NUM GPIO_12
#define QUEC_LCD_SPI_SDA_NUM GPIO_15
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF1
#define QUEC_LCD_SPI_SDA_AF MFP_AF1
#define SPI_LCD_CS 13
#define SPI_LCD_RST 50
#define SPI_LCD_DCX 14
#elif defined (__QUECTEL_PROJECT_EC800MCN_GA__)||defined (__QUECTEL_PROJECT_EC800MCN_GD__) \
|| defined (__QUECTEL_PROJECT_EC800MCN_LA__)||defined (__QUECTEL_PROJECT_EG810MCN_GA__)\
|| defined (__QUECTEL_PROJECT_EC800MCN_CC__) || defined (__QUECTEL_PROJECT_EC800MCN_NC__)\
|| defined (__QUECTEL_PROJECT_EC800MCN_MC__)|| defined (__QUECTEL_PROJECT_EC800MCN_LF__)\
|| defined (__QUECTEL_PROJECT_EC800MCN_LC__)|| defined (__QUECTEL_PROJECT_EG810MCN_LA__)\
|| defined (__QUECTEL_PROJECT_EC800MCN_LE__)|| defined (__QUECTEL_PROJECT_EC800MCN_GM__)\
|| defined (__QUECTEL_PROJECT_EG800PCN_LA__)|| defined (__QUECTEL_PROJECT_EC800MCN_GC__)\
|| defined (__QUECTEL_PROJECT_EG810MCN_LC__)|| defined (__QUECTEL_PROJECT_EG810MEU_LC__)\
|| defined (__QUECTEL_PROJECT_EG810MLA_LC__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_35
#define QUEC_LCD_SPI_CS_NUM GPIO_34
#define QUEC_LCD_SPI_RST_NUM GPIO_32
#define QUEC_LCD_SPI_SCLK_NUM GPIO_33
#define QUEC_LCD_SPI_SDA_NUM GPIO_36
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF2
#define QUEC_LCD_SPI_SDA_AF MFP_AF2
#define SPI_LCD_CS 34
#define SPI_LCD_RST 32
#define SPI_LCD_DCX 35
#elif defined (__QUECTEL_PROJECT_EC600KCN_CC__) || defined (__QUECTEL_PROJECT_EC600KCN_LC__) || defined (__QUECTEL_PROJECT_EC600KCN_MC__)\
|| defined(__QUECTEL_PROJECT_EC600KCN_CK__) || defined (__QUECTEL_PROJECT_EC600KCN_LK__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_35
#define QUEC_LCD_SPI_CS_NUM GPIO_34
#define QUEC_LCD_SPI_RST_NUM MFPR_OFFSET(50) //GPIO55
#define QUEC_LCD_SPI_SCLK_NUM GPIO_33
#define QUEC_LCD_SPI_SDA_NUM GPIO_36
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF1
#define QUEC_LCD_SPI_SDA_AF MFP_AF1
#define SPI_LCD_CS 34
#define SPI_LCD_RST 55
#define SPI_LCD_DCX 35
//600K???SPI??????0
#define SPI_CONETROLER_0_ENABLE
#elif defined (__QUECTEL_PROJECT_EG800KCN_GC__) || defined (__QUECTEL_PROJECT_EC800KCN_LC__)||defined (__QUECTEL_PROJECT_EG800AKCN_91LC__)\
|| defined (__QUECTEL_PROJECT_EC800KCN_CC__) || defined (__QUECTEL_PROJECT_EG800KLA_CC__)\
|| defined (__QUECTEL_PROJECT_EC800KCN_MD__) || defined (__QUECTEL_PROJECT_EC800KCN_MC__)\
|| defined (__QUECTEL_PROJECT_EG800KEU_CC__) || defined (__QUECTEL_PROJECT_EG800KLA_LC__)\
|| defined (__QUECTEL_PROJECT_EC800KCN_CK__) || defined (__QUECTEL_PROJECT_EC800KCN_LK__)\
|| defined (__QUECTEL_PROJECT_EG800KEU_LC__) || defined (__QUECTEL_PROJECT_EG800WCN_11LG__) || defined (__QUECTEL_PROJECT_EG800AKCN_90LC__)\
||defined (__QUECTEL_PROJECT_EG800AKCN_11LG__)||defined (__QUECTEL_PROJECT_EG800AKEU_11LC__) \
||defined (__QUECTEL_PROJECT_EG800AKLA_11LC__)||defined (__QUECTEL_PROJECT_EG800AKEU_11LG__)|| defined (__QUECTEL_PROJECT_EG800AKLA_00LC__)\
||defined (__QUECTEL_PROJECT_EG800AKCN_11LN__)||defined (__QUECTEL_PROJECT_EG800AKEU_00LC__)||defined (__QUECTEL_PROJECT_EG800AKGL_11LC__)\
||defined (__QUECTEL_PROJECT_EG800AKLA_11LG__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_14
#define QUEC_LCD_SPI_CS_NUM GPIO_13
#define QUEC_LCD_SPI_RST_NUM MFPR_OFFSET(48) //GPIO_90
#define QUEC_LCD_SPI_SCLK_NUM GPIO_12
#define QUEC_LCD_SPI_SDA_NUM GPIO_15
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF1
#define QUEC_LCD_SPI_SDA_AF MFP_AF1
#define SPI_LCD_CS 13
#define SPI_LCD_RST 90
#define SPI_LCD_DCX 14
#elif defined (__QUECTEL_PROJECT_EC200MCN_LC__)|| defined (__QUECTEL_PROJECT_EC200MCN_LF__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_35
#define QUEC_LCD_SPI_CS_NUM GPIO_34
#define QUEC_LCD_SPI_RST_NUM GPIO_12
#define QUEC_LCD_SPI_SCLK_NUM GPIO_33
#define QUEC_LCD_SPI_SDA_NUM GPIO_36
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF2
#define QUEC_LCD_SPI_SDA_AF MFP_AF2
#define SPI_LCD_CS 34
#define SPI_LCD_RST 12
#define SPI_LCD_DCX 35
#elif defined(__QUECTEL_PROJECT_EG915KEU_LA__)|| defined (__QUECTEL_PROJECT_EG915KEU_LC__)|| defined (__QUECTEL_PROJECT_EG915KEU_LG__)|| defined (__QUECTEL_PROJECT_EG915KLA_LC__)|| defined (__QUECTEL_PROJECT_EG915KLA_LA__) || defined (__QUECTEL_PROJECT_EG915KLA_LG__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_35
#define QUEC_LCD_SPI_CS_NUM GPIO_34
#define QUEC_LCD_SPI_RST_NUM GPIO_08
#define QUEC_LCD_SPI_SCLK_NUM GPIO_33
#define QUEC_LCD_SPI_SDA_NUM GPIO_36
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF1
#define QUEC_LCD_SPI_SDA_AF MFP_AF1
#define SPI_LCD_CS 34
#define SPI_LCD_RST 8
#define SPI_LCD_DCX 35
#elif defined (__QUECTEL_PROJECT_EG600AKCN_90LC__) || defined (__QUECTEL_PROJECT_EG600AKCN_91LC__)\
||defined (__QUECTEL_PROJECT_EG600AKCN_00LC__) || defined (__QUECTEL_PROJECT_EG600AKCN_11LC__)\
||defined (__QUECTEL_PROJECT_EG600AKCN_11LG__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_35
#define QUEC_LCD_SPI_CS_NUM GPIO_34
#define QUEC_LCD_SPI_RST_NUM MFPR_OFFSET(48) //GPIO_90 PRI_TDO
#define QUEC_LCD_SPI_SCLK_NUM GPIO_33
#define QUEC_LCD_SPI_SDA_NUM GPIO_36
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF1
#define QUEC_LCD_SPI_SDA_AF MFP_AF1
#define SPI_LCD_CS 34
#define SPI_LCD_RST 90
#define SPI_LCD_DCX 35
#define SPI_CONETROLER_0_ENABLE
#elif defined(__QUECTEL_PROJECT_EG915NEA_AK__) || defined(__QUECTEL_PROJECT_EG915NLA_AK__) || \
defined(__QUECTEL_PROJECT_EG915NLA_AF__) || defined(__QUECTEL_PROJECT_EG915NEA_AG__) || \
defined(__QUECTEL_PROJECT_EG915NEA_AC__) || defined(__QUECTEL_PROJECT_EC600NCN_AC__) || \
defined(__QUECTEL_PROJECT_EG915NLA_GK__)
#define QUEC_LCD_SPI_DCX_NUM GPIO_14
#define QUEC_LCD_SPI_CS_NUM GPIO_13
#define QUEC_LCD_SPI_RST_NUM GPIO_31
#define QUEC_LCD_SPI_SCLK_NUM GPIO_12
#define QUEC_LCD_SPI_SDA_NUM GPIO_15
#define QUEC_LCD_SPI_DCX_AF MFP_AF0
#define QUEC_LCD_SPI_CS_AF MFP_AF0
#define QUEC_LCD_SPI_RST_AF MFP_AF0
#define QUEC_LCD_SPI_SCLK_AF MFP_AF1
#define QUEC_LCD_SPI_SDA_AF MFP_AF1
#define SPI_LCD_CS 13
#define SPI_LCD_RST 31
#define SPI_LCD_DCX 14
#else
#error "Please configure the project"
#endif
#define SPI_SCLK_FREQ 10000
enum{
SPI_EDGE_RISING = 0,
SPI_EDGE_FALLING = 1,
SPI_EDGE_LIMIT
};
enum{
SPI_INTER_FLAG_FRAMEDONE = 0x1,
SPI_INTER_FLAG_LIMIT,
};
enum{
SPI_ENDIAN_LSB = 0,
SPI_ENDIAN_MSB = 1,
SPI_ENDIAN_LIMIT
};
enum{
SPI_PATH_IMAGE = 0,
SPI_PATH_REGISTER = 1,
SPI_PATH_LIMIT
};
enum{
SPI_FORMAT_RGB565 = 0,
SPI_FORMAT_RGB666 = 1,
SPI_FORMAT_RGB666_2_3 = 2,
SPI_FORMAT_RGB888 = 3,
SPI_FORMAT_RGB888_2_3 = 4,
SPI_FORMAT_LIMIT
};
enum{
SPI_STATUS_UNINIT = 0,
SPI_STATUS_INIT = 1,
SPI_STATUS_LIMIT
};
enum{
SPI_CONETROLER_0 = 0,
SPI_CONETROLER_1 = 1,
SPI_CONETROLER_LIMIT
};
enum{
SPI_WORK_MODE_POLLING,
SPI_WORK_MODE_DMA,
SPI_WORK_MODE_LIMIT
};
enum{
SPI_6_5M = 0,
SPI_13M = 1,
SPI_26M,
SPI_52M,
SPI_3_25M,
SPI_1_625M,
SPI_812_5k,
SPI_CLK_LIMIT
};
typedef enum
{
spi_rx = 0,
spi_tx,
max_dir,
}spidir;
struct timing_spi {
unsigned int wclk; /*KHz*/
unsigned int rclk; /*KHz*/
};
struct spi_info{
unsigned short line_num; /*3 or 4*/
unsigned short interface_id; /*1 or 2*/
unsigned short data_lane_num; /*1 or 2*/
unsigned short format;
unsigned short device_id; /*0 or 1*/
unsigned short sample_edge;
unsigned short force_cs; /*0-disable, 1-enable*/
unsigned short endian;
unsigned short reserved;
struct timing_spi *timing;
};
struct s_spi_base_ctx{
unsigned int base_addr;
unsigned int sclk; /*KHz*/
unsigned char cur_path;
unsigned char cur_cs;
unsigned char work_mode;
unsigned char reserved;
};
struct s_spi_ctx{
unsigned int base_addr;
unsigned int sclk; /*KHz*/
unsigned short cur_path;
unsigned short cur_cs;
unsigned short status;
unsigned char work_mode;
unsigned char reserved;
struct spi_info info;
};
struct s_spi_ctx* spi_init(unsigned int sclk, struct spi_info *info, int work_mode);
int spi_write_cmd(struct s_spi_ctx *spi_ctx, unsigned int cmd, unsigned int bits);
int spi_write_data(struct s_spi_ctx *spi_ctx, unsigned int data, unsigned int bits);
int spi_read_data(struct s_spi_ctx *spi_ctx, unsigned int cmd, unsigned int cmd_bits,
unsigned int *data, unsigned int data_bits);
int spi_lcd_init(unsigned char controler);
void spi_set_clk_rate(unsigned int clk_dev);
void ssp_write_cmd_data_to_LCD(unsigned int cmd, unsigned int data,unsigned int data_bits,unsigned short line_num);
void ssp_write_data_to_LCD_Gram(unsigned short* data,unsigned int sum_pixel,unsigned int data_bits,unsigned short line_num);
void spi_dma_init(void);
void ssp_read_data_from_LCD(unsigned int *data, unsigned int data_bits);
void wait_ssp_write_data_to_LCD_complete(void);
void spi_set_cs_high(void);
void spi_set_cs_low(void);
void LCD_Pinmuxcfg(unsigned int interface);
int spi_update(struct s_spi_ctx *spi_ctx, int work_mode);
void lcd_spi_set_data_mode(void);
void spi_write_data_dma(unsigned short* data,unsigned int sum_pixel,unsigned int data_bits,unsigned short line_num);
void lcd_spi_set_cmd_mode(void);
void spi_uninit(struct s_spi_ctx *spi_ctx);
void spi_reset(struct s_spi_ctx *spi_ctx);
#endif /*_SPI_DRV_H_*/