demo工程暂存 优化菜单界面UI和功能
This commit is contained in:
202
MCU/components/drivers/bsp/display/driver_display.c
Normal file
202
MCU/components/drivers/bsp/display/driver_display.c
Normal file
@ -0,0 +1,202 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file driver_display.c
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2022
|
||||
* @brief display abstract interfase.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2022 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "app_lvgl.h"
|
||||
#include "app_config.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include "driver_display.h"
|
||||
|
||||
#ifdef DISPLAY_TYPE_GC9C01
|
||||
#include "driver_gc9c01.h"
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_JD9854
|
||||
#include "driver_jd9854.h"
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601A
|
||||
#include "driver_sh8601a.h"
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_ICNA3310
|
||||
#include "driver_icna3310.h"
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
#include "driver_sh8601z.h"
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_NV3047_RGB
|
||||
#include "driver_nv3047_rgb.h"
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_ST7701_RGB
|
||||
#include "driver_st7701_rgb.h"
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_NV3041A
|
||||
#include "driver_nv3041a.h"
|
||||
#endif
|
||||
|
||||
void display_init(void)
|
||||
{
|
||||
#ifdef DISPLAY_TYPE_GC9C01
|
||||
gc9c01_init();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_JD9854
|
||||
jd9854_init();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601A
|
||||
sh8601a_init();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_ICNA3310
|
||||
icna3310_init();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
sh8601z_init();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_NV3047_RGB
|
||||
extern void* get_display_buffer1(void);
|
||||
extern void rgb_display_controller_init(void);
|
||||
rgb_display_controller_init();
|
||||
rgb_display_init(get_display_buffer1());
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_ST7701_RGB
|
||||
extern void* get_display_buffer1(void);
|
||||
st7701_init(get_display_buffer1());
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_NV3041A
|
||||
nv3041a_init();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void display_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
|
||||
{
|
||||
#ifdef DISPLAY_TYPE_GC9C01
|
||||
gc9c01_set_window(x_s, x_e, y_s, y_e);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_JD9854
|
||||
jd9854_set_window(x_s, x_e, y_s, y_e);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601A
|
||||
sh8601a_set_window(x_s, x_e, y_s, y_e);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_ICNA3310
|
||||
icna3310_set_window(x_s, x_e, y_s, y_e);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
sh8601z_set_window(x_s, x_e, y_s, y_e);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_NV3041A
|
||||
nv3041a_set_window(x_s, x_e, y_s, y_e);
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_update(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
#ifdef DISPLAY_TYPE_GC9C01
|
||||
gc9c01_display(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_JD9854
|
||||
jd9854_display(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601A
|
||||
sh8601a_display(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_ICNA3310
|
||||
icna3310_display(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
sh8601z_display(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_NV3041A
|
||||
nv3041a_display(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_update_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
#ifdef DISPLAY_TYPE_GC9C01
|
||||
gc9c01_display_dma(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_JD9854
|
||||
jd9854_display_dma(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601A
|
||||
sh8601a_display_dma(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_ICNA3310
|
||||
icna3310_display_dma(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
sh8601z_display_dma(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_NV3047_RGB
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_ST7701_RGB
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_NV3041A
|
||||
nv3041a_display_dma(pixel_count, pixel_width, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_power_off(void)
|
||||
{
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
sh8601z_power_off();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void display_power_on(void)
|
||||
{
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
sh8601z_power_on();
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_update_dma_isr(void)
|
||||
{
|
||||
#ifdef DISPLAY_TYPE_GC9C01
|
||||
gc9c01_display_dma_isr();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_JD9854
|
||||
jd9854_display_dma_isr();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601A
|
||||
sh8601a_display_dma_isr();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_ICNA3310
|
||||
icna3310_display_dma_isr();
|
||||
#endif
|
||||
#ifdef DISPLAY_TYPE_SH8601Z
|
||||
sh8601z_display_dma_isr();
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_ST7701_RGB
|
||||
st7701_rgb_display_dma_irq();
|
||||
#endif
|
||||
|
||||
#ifdef DISPLAY_TYPE_NV3041A
|
||||
nv3041a_display_dma_isr();
|
||||
#endif
|
||||
}
|
162
MCU/components/drivers/bsp/display/driver_display.h
Normal file
162
MCU/components/drivers/bsp/display/driver_display.h
Normal file
@ -0,0 +1,162 @@
|
||||
|
||||
#ifndef __DRIVER_DISPLAY_H__
|
||||
#define __DRIVER_DISPLAY_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "driver_spi.h"
|
||||
#include "driver_dma.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Macro Variables definitions
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#define __DISPLAY_CS_SET() display_cs_set()
|
||||
#define __DISPLAY_CS_CLEAR() display_cs_clear()
|
||||
#define __DISPLAY_RESET_SET() display_reset_set()
|
||||
#define __DISPLAY_RESET_CLEAR() display_reset_clear()
|
||||
#define __DISPLAY_VCI_SET() display_vci_set()
|
||||
#define __DISPLAY_VCI_CLEAR() display_vci_clear()
|
||||
#define __DISPLAY_DELAY_MS(counter) display_delay_ms(counter)
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Global Variables definitions
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern SPI_HandleTypeDef spi_display_handle;
|
||||
extern DMA_HandleTypeDef dma_display_handle;
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// External function definitions
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_cs_set
|
||||
*
|
||||
* @brief Set display driver CS pin to HIGH, this function should be implemented by user when
|
||||
* CS is controlled by software.
|
||||
*/
|
||||
void display_cs_set(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_cs_release
|
||||
*
|
||||
* @brief Set display driver CS pin to LOW, this function should be implemented by user when
|
||||
* CS is controlled by software.
|
||||
*/
|
||||
void display_cs_clear(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_reset_set
|
||||
*
|
||||
* @brief Set display driver RESET pin to HIGH, this function should be implemented by user..
|
||||
*/
|
||||
void display_reset_set(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_reset_clear
|
||||
*
|
||||
* @brief Set display driver RESET pin to LOW, this function should be implemented by user.
|
||||
*/
|
||||
void display_reset_clear(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_vci_set
|
||||
*
|
||||
* @brief Set display driver VCI pin to HIGH, this function should be implemented by user..
|
||||
*/
|
||||
void display_vci_set(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_vci_clear
|
||||
*
|
||||
* @brief Set display driver VCI pin to LOW, this function should be implemented by user.
|
||||
*/
|
||||
void display_vci_clear(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_delay_ms
|
||||
*
|
||||
* @brief Used in display driver. co_delay_100us or vTaskDelay can be used for implementation
|
||||
* by user.
|
||||
*/
|
||||
void display_delay_ms(uint32_t counter);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_init
|
||||
*
|
||||
* @brief Initial display drivers.
|
||||
*/
|
||||
void display_init(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_set_window
|
||||
*
|
||||
* @brief used to define area of frame memory where MCU can access.
|
||||
*
|
||||
* @param x_s: SC.
|
||||
* x_e: EC.
|
||||
* y_s: SP.
|
||||
* y_e: EP.
|
||||
*/
|
||||
void display_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_update
|
||||
*
|
||||
* @brief transfer data to framebuffer of display controller in block mode.
|
||||
*
|
||||
* @param pixel_count: total pixels count to be sent.
|
||||
* pixel_width: this parameter should be 16, 24.
|
||||
* data: pointer to data buffer
|
||||
*/
|
||||
void display_update(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_update_dma
|
||||
*
|
||||
* @brief transfer data to framebuffer of display controller in DMA mode.
|
||||
*
|
||||
* @param pixel_count: total pixels count to be sent.
|
||||
* pixel_width: this parameter should be 16, 24.
|
||||
* data: pointer to data buffer
|
||||
*/
|
||||
void display_update_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_update_dma_isr
|
||||
*
|
||||
* @brief this function will be called in DMA isr handler when dma transfer is done.
|
||||
*/
|
||||
void display_update_dma_isr(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_power_off
|
||||
*
|
||||
* @brief used to power off display to save power.
|
||||
*/
|
||||
void display_power_off(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn display_power_on
|
||||
*
|
||||
* @brief turn on display.
|
||||
*/
|
||||
void display_power_on(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DRIVER_DISPLAY_H__ */
|
||||
|
238
MCU/components/drivers/bsp/display/driver_icna3310.c
Normal file
238
MCU/components/drivers/bsp/display/driver_icna3310.c
Normal file
@ -0,0 +1,238 @@
|
||||
#include "driver_display.h"
|
||||
|
||||
static void reg_write(uint8_t addr, uint8_t *value, uint8_t length)
|
||||
{
|
||||
uint8_t sdat[length + 4];
|
||||
|
||||
sdat[0] = 0x02;
|
||||
sdat[1] = 0x00;
|
||||
sdat[2] = addr;
|
||||
sdat[3] = 0x00;
|
||||
memcpy(&sdat[4], value, length);
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
static void reg_read(uint8_t addr, uint8_t *value, uint8_t length)
|
||||
{
|
||||
uint8_t sdat[4];
|
||||
|
||||
sdat[0] = 0x03;
|
||||
sdat[1] = 0x00;
|
||||
sdat[2] = addr;
|
||||
sdat[3] = 0x00;
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
|
||||
spi_master_receive_X1(&spi_display_handle, value, length);
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
void icna3310_init(void)
|
||||
{
|
||||
uint8_t buffer[4];
|
||||
|
||||
__DISPLAY_VCI_CLEAR();
|
||||
__DISPLAY_RESET_CLEAR();
|
||||
__DISPLAY_DELAY_MS(200);
|
||||
__DISPLAY_VCI_SET();
|
||||
__DISPLAY_DELAY_MS(50);
|
||||
__DISPLAY_RESET_SET();
|
||||
__DISPLAY_DELAY_MS(5);
|
||||
__DISPLAY_RESET_CLEAR();
|
||||
__DISPLAY_DELAY_MS(5);
|
||||
__DISPLAY_RESET_SET();
|
||||
__DISPLAY_DELAY_MS(5);
|
||||
|
||||
// __DISPLAY_VCI_CLEAR();
|
||||
// __DISPLAY_RESET_CLEAR();
|
||||
// __DISPLAY_DELAY_MS(20);
|
||||
// __DISPLAY_RESET_SET();
|
||||
// __DISPLAY_DELAY_MS(40);
|
||||
// __DISPLAY_VCI_SET();
|
||||
// __DISPLAY_DELAY_MS(80);
|
||||
|
||||
buffer[0] = 0x20;
|
||||
reg_write(0xFE, &buffer[0], 1);
|
||||
buffer[0] = 0x5a;
|
||||
reg_write(0xF4, &buffer[0], 1);
|
||||
buffer[0] = 0x59;
|
||||
reg_write(0xF5, &buffer[0], 1);
|
||||
|
||||
buffer[0] = 0x40;
|
||||
reg_write(0xFE, &buffer[0], 1);
|
||||
buffer[0] = 0x0a;
|
||||
reg_write(0x08, &buffer[0], 1);
|
||||
|
||||
buffer[0] = 0x00;
|
||||
reg_write(0xFE, &buffer[0], 1);
|
||||
buffer[0] = 0x80;
|
||||
reg_write(0xC4, &buffer[0], 1);//SPI sram write enable
|
||||
buffer[0] = 0x55;
|
||||
reg_write(0x3A, &buffer[0], 1);//55 RGB565, 77 RGB888
|
||||
buffer[0] = 0x00;
|
||||
reg_write(0x35, &buffer[0], 1);
|
||||
buffer[0] = 0x20;
|
||||
reg_write(0x53, &buffer[0], 1);
|
||||
buffer[0] = 0xFF;
|
||||
reg_write(0x51, &buffer[0], 1);
|
||||
buffer[0] = 0xFF;
|
||||
reg_write(0x63, &buffer[0], 1);
|
||||
buffer[0] = 0x00;
|
||||
buffer[1] = 0x06;
|
||||
buffer[2] = 0x01;
|
||||
buffer[3] = 0xD7;
|
||||
reg_write(0x2A, &buffer[0], 4); // paritial update:466RGB
|
||||
buffer[0] = 0x00;
|
||||
buffer[1] = 0x00;
|
||||
buffer[2] = 0x01;
|
||||
buffer[3] = 0xD1;
|
||||
reg_write(0x2B, &buffer[0], 4); // partial update:466line
|
||||
// buffer[0] = 0x00;
|
||||
// reg_write(0xFE, &buffer[0], 1);
|
||||
reg_write(0x11, NULL, 0);
|
||||
__DISPLAY_DELAY_MS(120);
|
||||
// buffer[0] = 0x00;
|
||||
// reg_write(0xFE, &buffer[0], 1);
|
||||
reg_write(0x29, NULL, 0);
|
||||
__DISPLAY_DELAY_MS(50);
|
||||
}
|
||||
|
||||
void icna3310_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
|
||||
{
|
||||
uint8_t data[4];
|
||||
|
||||
x_s += 6;
|
||||
x_e += 6;
|
||||
|
||||
data[0] = x_s >> 8;
|
||||
data[1] = x_s & 0xff;
|
||||
data[2] = x_e >> 8;
|
||||
data[3] = x_e & 0xff;
|
||||
reg_write(0x2A, &data[0], 4);
|
||||
|
||||
data[0] = y_s >> 8;
|
||||
data[1] = y_s & 0xff;
|
||||
data[2] = y_e >> 8;
|
||||
data[3] = y_e & 0xff;
|
||||
reg_write(0x2B, &data[0], 4);
|
||||
|
||||
// reg_write(0x2C, &data[0], 4);
|
||||
}
|
||||
|
||||
void icna3310_adjust_brightness(uint8_t value) //Value 0x00 - 0xFF
|
||||
{
|
||||
uint8_t buffer[1];
|
||||
|
||||
buffer[0] = 0x00;
|
||||
reg_write(0xFE, &buffer[0], 1);
|
||||
buffer[0] = value;
|
||||
reg_write(0x51, &buffer[0], 1);
|
||||
}
|
||||
|
||||
void icna3310_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
uint8_t frame_size;
|
||||
|
||||
if (pixel_width == 16) {
|
||||
frame_size = SPI_FRAME_SIZE_16BIT;
|
||||
}
|
||||
else if (pixel_width == 32) {
|
||||
frame_size = SPI_FRAME_SIZE_24BIT;
|
||||
}
|
||||
spi_display_handle.Init.Frame_Size = frame_size;
|
||||
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_display_handle.MultWireParam.Instruct = 0x32;
|
||||
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_display_handle.MultWireParam.Address = 0x002C00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X2X4X8(&spi_display_handle, data, pixel_count);
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
|
||||
}
|
||||
|
||||
void icna3310_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
uint8_t spi_trans_width;
|
||||
uint32_t dma_sample_count;
|
||||
|
||||
switch (dma_display_handle.Init.Source_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
dma_sample_count = pixel_count * pixel_width / 32;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
dma_sample_count = pixel_count * pixel_width / 16;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
dma_sample_count = pixel_count * pixel_width / 8;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
switch (dma_display_handle.Init.Desination_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
spi_trans_width = SPI_FRAME_SIZE_32BIT;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
spi_trans_width = SPI_FRAME_SIZE_16BIT;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
spi_trans_width = SPI_FRAME_SIZE_8BIT;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (pixel_width != 32) {
|
||||
spi_display_handle.Init.Frame_Size = spi_trans_width;
|
||||
}
|
||||
else {
|
||||
spi_display_handle.Init.Frame_Size = SPI_FRAME_SIZE_24BIT;
|
||||
}
|
||||
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_display_handle.MultWireParam.Instruct = 0x32;
|
||||
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_display_handle.MultWireParam.Address = 0x002C00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
__SPI_ENABLE(spi_display_handle.SPIx);
|
||||
spi_master_transmit_X2X4X8_DMA(&spi_display_handle);
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
if ((spi_trans_width == SPI_FRAME_SIZE_32BIT)
|
||||
&& (pixel_width != 32)) {
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_2143);
|
||||
}
|
||||
else {
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
}
|
||||
__SPI_ENABLE(spi_display_handle.SPIx);
|
||||
|
||||
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&spi_display_handle.SPIx->DR, dma_sample_count);
|
||||
}
|
||||
|
||||
void icna3310_display_dma_isr(void)
|
||||
{
|
||||
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
|
||||
|
||||
// CS Release
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
/* Clear Transfer complete status */
|
||||
dma_clear_tfr_Status(&dma_display_handle);
|
||||
/* channel Transfer complete interrupt disable */
|
||||
dma_tfr_interrupt_disable(&dma_display_handle);
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
}
|
16
MCU/components/drivers/bsp/display/driver_icna3310.h
Normal file
16
MCU/components/drivers/bsp/display/driver_icna3310.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef __DRIVER_ICNA3310_H
|
||||
#define __DRIVER_ICNA3310_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void icna3310_init(void);
|
||||
|
||||
void icna3310_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
|
||||
|
||||
void icna3310_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
void icna3310_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
void icna3310_display_dma_isr(void);
|
||||
|
||||
#endif // __DRIVER_ICNA3310_H
|
466
MCU/components/drivers/bsp/display/driver_nv3041a.c
Normal file
466
MCU/components/drivers/bsp/display/driver_nv3041a.c
Normal file
@ -0,0 +1,466 @@
|
||||
#include "driver_display.h"
|
||||
#include "driver_nv3041a.h"
|
||||
|
||||
#include "driver_parallel_interface.h"
|
||||
|
||||
|
||||
extern PARALLEL_HandTypeDef hparallel;
|
||||
|
||||
static void WriteComm(uint8_t reg)
|
||||
{
|
||||
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
/* writer cmd */
|
||||
Parallel_write_cmd(&hparallel,reg);
|
||||
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
}
|
||||
static void WriteData(uint8_t data)
|
||||
{
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
/* writer cmd */
|
||||
Parallel_write_param(&hparallel,data);
|
||||
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
}
|
||||
|
||||
static void LCD_READ_DATA(uint8_t reg)
|
||||
{
|
||||
static uint16_t data=0;
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
/* writer cmd */
|
||||
|
||||
//Parallel_write_cmd(&hparallel,reg);
|
||||
// Parallel_read_data_cmd(&hparallel,reg,&data,1);
|
||||
printf("reg_param:0x%x\r\n",data);
|
||||
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
}
|
||||
void display_backlight_set(void)
|
||||
{
|
||||
gpio_write_pin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
void display_backlight_clear(void)
|
||||
{
|
||||
gpio_write_pin(GPIOA, GPIO_PIN_4, GPIO_PIN_CLEAR);
|
||||
}
|
||||
void nv3041a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
|
||||
{
|
||||
WriteComm(0x2a);//列地址设置
|
||||
WriteData(x_s>>8);
|
||||
WriteData(x_s&0xff);
|
||||
WriteData(x_e>>8);
|
||||
WriteData(x_e&0xff);
|
||||
WriteComm(0x2b);//行地址设置
|
||||
WriteData(y_s>>8);
|
||||
WriteData(y_s&0xff);
|
||||
WriteData(y_e>>8);
|
||||
WriteData(y_e&0xff);
|
||||
WriteComm(0x2c);//储存器写
|
||||
// write_cmd(0x2c);
|
||||
}
|
||||
|
||||
|
||||
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
|
||||
{
|
||||
uint16_t i,j,size;
|
||||
nv3041a_set_window(xsta,xend-1,ysta,yend-1);//设置显示范围
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
|
||||
if(hparallel.Init.DataBusSelect == DATA_BUS_8_BIT)
|
||||
{
|
||||
size=2;
|
||||
}else{
|
||||
size=2;
|
||||
}
|
||||
for(i=ysta;i<yend;i++)
|
||||
{
|
||||
for(j=xsta;j<xend;j++)
|
||||
{
|
||||
// LCD_WR_DATA(color);
|
||||
/* writer data */
|
||||
Parallel_write_data(&hparallel,(uint32_t *)&color,size);
|
||||
}
|
||||
}
|
||||
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
}
|
||||
void nv3041a_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
uint32_t frame_size=0;
|
||||
|
||||
if (pixel_width == 8) {
|
||||
frame_size = (pixel_count*4);
|
||||
}
|
||||
if (pixel_width == 16) {
|
||||
// frame_size = SPI_FRAME_SIZE_16BIT;
|
||||
frame_size = (pixel_count*2);
|
||||
}
|
||||
else if (pixel_width == 32) {
|
||||
frame_size = (pixel_count);
|
||||
}
|
||||
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
//Parallel_write_param(&hparallel,data);
|
||||
Parallel_write_data(&hparallel,data,(frame_size));
|
||||
//while(__PARALLEL_IS_BUS_BUSY(hparallel.PARALLELx));
|
||||
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
|
||||
}
|
||||
|
||||
void nv3041a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
uint8_t dma_trans_width=0;
|
||||
uint32_t dma_sample_count=0;
|
||||
switch (dma_display_handle.Init.Source_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
//272x480 16
|
||||
dma_sample_count = pixel_count * pixel_width / 32;
|
||||
//dma_sample_count=dma_sample_count*4;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
dma_sample_count = pixel_count * pixel_width / 16;
|
||||
// dma_sample_count=dma_sample_count*2;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
dma_sample_count = pixel_count * pixel_width / 8;
|
||||
// dma_sample_count=dma_sample_count;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
// switch(hparallel.Init.DataBusSelect)
|
||||
// {
|
||||
// case DATA_BUS_8_BIT:
|
||||
// dma_trans_width = 2;
|
||||
// break;
|
||||
//
|
||||
// case DATA_BUS_16_BIT:
|
||||
// dma_trans_width=2;
|
||||
// break;
|
||||
// }
|
||||
dma_sample_count=dma_sample_count*2;
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
__PARALLEL_SET_WR_LEN(hparallel.PARALLELx,dma_sample_count);
|
||||
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&hparallel.PARALLELx->TX_FIFO, (dma_sample_count));
|
||||
}
|
||||
|
||||
void nv3041a_display_dma_isr(void)
|
||||
{
|
||||
#if 0
|
||||
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
|
||||
// CS Release
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
/* Clear Transfer complete status */
|
||||
dma_clear_tfr_Status(&dma_display_handle);
|
||||
/* channel Transfer complete interrupt disable */
|
||||
dma_tfr_interrupt_disable(&dma_display_handle);
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
|
||||
#endif
|
||||
//printf("nv3041a_display_dma_isr1\r\n");
|
||||
while(!( __PARALLEL_INT_STATUS(hparallel.PARALLELx)&INT_TXFIFO_EMPTY));
|
||||
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
/* Clear Transfer complete status */
|
||||
dma_clear_tfr_Status(&dma_display_handle);
|
||||
/* channel Transfer complete interrupt disable */
|
||||
dma_tfr_interrupt_disable(&dma_display_handle);
|
||||
//printf("nv3041a_display_dma_isr2\r\n");
|
||||
}
|
||||
|
||||
#define pixel_size 100*100
|
||||
uint16_t color_buffer[pixel_size]={0};
|
||||
|
||||
void nv3041a_init(void)
|
||||
{
|
||||
display_backlight_clear();
|
||||
WriteComm(0xff);
|
||||
WriteData(0xa5);
|
||||
WriteComm(0xE7);//TE_output_en
|
||||
WriteData(0x10);
|
||||
WriteComm(0x35);//TE_ interface_en
|
||||
WriteData(0x01);
|
||||
WriteComm(0x3A);
|
||||
WriteData(0x01);//00---666//01--565
|
||||
WriteComm(0x40);
|
||||
WriteData(0x01); //01:IPS/00:TN
|
||||
WriteComm(0x41);
|
||||
WriteData(0x03);//01--8bit//03--16bit
|
||||
WriteComm(0x55);
|
||||
WriteData(0x01);
|
||||
WriteComm(0x44);//VBP
|
||||
WriteData(0x15);//21NVu NV3041A-01
|
||||
|
||||
WriteComm(0x45);//VFP
|
||||
WriteData(0x15);//21
|
||||
WriteComm(0x7d);//vdds_trim[2:0]
|
||||
WriteData(0x03);//2.07V
|
||||
WriteComm(0xc1);//avdd_clp_en avdd_clp[1:0] avcl_clp_en avcl_clp[1:0]
|
||||
WriteData(0xab);//6.74V/-5.16V
|
||||
WriteComm(0xc2);//vgh_clp_en vgl_clp[2:0]
|
||||
WriteData(0x17);
|
||||
WriteComm(0xc3);//vgl_clp_en vgl_clp[2:0]
|
||||
WriteData(0x10);//-10.951
|
||||
WriteComm(0xc6);//avdd_ratio_sel avcl_ratio_sel vgh_ratio_sel[1:0] vgl_ratio_sel[1:0]
|
||||
WriteData(0x3a);//35
|
||||
WriteComm(0xc7);//mv_clk_sel[1:0] avdd_clk_sel[1:0] avcl_clk_sel[1:0]
|
||||
WriteData(0x25); //2e
|
||||
WriteComm(0xc8);// VGL_CLK_sel
|
||||
WriteData(0x11);
|
||||
WriteComm(0x6f);// user_gvdd
|
||||
WriteData(0x2f);
|
||||
WriteComm(0x78);// user_gvcl
|
||||
WriteData(0x4b);
|
||||
//WriteComm(0x7a);// user_vgsp
|
||||
//WriteData(0x5f);
|
||||
//test
|
||||
WriteComm(0x7a);// user_vgsp
|
||||
WriteData(0x49);
|
||||
WriteComm(0xc9);
|
||||
WriteData(0x00);
|
||||
//gate_ed
|
||||
WriteComm(0x51);//gate_st_o[7:0]
|
||||
//WriteData(0x4b);
|
||||
WriteData(0x20);
|
||||
WriteComm(0x52);//gate_ed_o[7:0]
|
||||
WriteData(0x7c);
|
||||
WriteComm(0x53);//gate_st_e[7:0]
|
||||
//WriteData(0x45);
|
||||
WriteData(0x1c);
|
||||
WriteComm(0x54);//gate_ed_e[7:0]
|
||||
WriteData(0x77);
|
||||
////sorce oldNVu NV3041A-01
|
||||
|
||||
WriteComm(0x46);//fsm_hbp_o[5:0]
|
||||
WriteData(0x0a);
|
||||
WriteComm(0x47);//fsm_hfp_o[5:0]
|
||||
WriteData(0x2a);
|
||||
WriteComm(0x48);//fsm_hbp_e[5:0]
|
||||
WriteData(0x0a);
|
||||
WriteComm(0x49);//fsm_hfp_e[5:0]
|
||||
WriteData(0x1a);
|
||||
WriteComm(0x56);//src_ld_wd[1:0] src_ld_st[5:0]
|
||||
WriteData(0x43);
|
||||
WriteComm(0x57);//pn_cs_en src_cs_st[5:0]
|
||||
WriteData(0x42);
|
||||
WriteComm(0x58);//src_cs_p_wd[6:0]
|
||||
WriteData(0x3c);
|
||||
WriteComm(0x59);//src_cs_n_wd[6:0]
|
||||
WriteData(0x64);
|
||||
WriteComm(0x5a);//src_pchg_st_o[6:0]
|
||||
WriteData(0x41);
|
||||
WriteComm(0x5b);//src_pchg_wd_o[6:0]
|
||||
WriteData(0x3c);
|
||||
WriteComm(0x5c);//src_pchg_st_e[6:0]
|
||||
WriteData(0x02);
|
||||
WriteComm(0x5d);//src_pchg_wd_e[6:0]
|
||||
WriteData(0x3c);
|
||||
WriteComm(0x5e);//src_pol_sw[7:0]
|
||||
WriteData(0x1f);
|
||||
WriteComm(0x60);//src_op_st_o[7:0]
|
||||
WriteData(0x80);
|
||||
WriteComm(0x61);//src_op_st_e[7:0]
|
||||
WriteData(0x3f);
|
||||
WriteComm(0x62);//src_op_ed_o[9:8] src_op_ed_e[9:8]
|
||||
WriteData(0x21);
|
||||
WriteComm(0x63);//src_op_ed_o[7:0]
|
||||
WriteData(0x07);
|
||||
WriteComm(0x64);//src_op_ed_e[7:0]
|
||||
WriteData(0xe0);
|
||||
WriteComm(0x65);//chopper
|
||||
WriteData(0x01);//01-A2,02--A1NVu NV3041A-01
|
||||
|
||||
//WriteComm(0x67);
|
||||
//WriteData(0x33);//01
|
||||
WriteComm(0xca); //avdd_mux_st_o[7:0]
|
||||
WriteData(0x20);
|
||||
WriteComm(0xcb); //avdd_mux_ed_o[7:0]
|
||||
WriteData(0x52);
|
||||
WriteComm(0xcc); //avdd_mux_st_e[7:0]
|
||||
WriteData(0x10);
|
||||
WriteComm(0xcD); //avdd_mux_ed_e[7:0]
|
||||
WriteData(0x42);
|
||||
WriteComm(0xD0); //avcl_mux_st_o[7:0]
|
||||
WriteData(0x20);
|
||||
WriteComm(0xD1); //avcl_mux_ed_o[7:0]
|
||||
WriteData(0x52);
|
||||
WriteComm(0xD2); //avcl_mux_st_e[7:0]
|
||||
WriteData(0x10);
|
||||
WriteComm(0xD3); //avcl_mux_ed_e[7:0]
|
||||
WriteData(0x42);
|
||||
WriteComm(0xD4); //vgh_mux_st[7:0]
|
||||
WriteData(0x0a);
|
||||
WriteComm(0xD5); //vgh_mux_ed[7:0]
|
||||
WriteData(0x32);
|
||||
WriteComm(0xe5); //DVDD_TRIM
|
||||
WriteData(0x05); //1.65 05
|
||||
WriteComm(0xe6); //ESD_CTRL
|
||||
WriteData(0x00);
|
||||
WriteComm(0x6e); //LVD_en
|
||||
WriteData(0x14);
|
||||
//gammma 01
|
||||
WriteComm(0x80); //gam_vrp0 63
|
||||
WriteData(0x04);
|
||||
WriteComm(0xA0); //gam_VRN0 63
|
||||
WriteData(0x00);
|
||||
WriteComm(0x81); //gam_vrp1 62
|
||||
WriteData(0x07);
|
||||
WriteComm(0xA1); //gam_VRN1 62-
|
||||
WriteData(0x05);
|
||||
WriteComm(0x82); //gam_vrp2 61
|
||||
WriteData(0x06);
|
||||
WriteComm(0xA2); //gam_VRN2 61-NVu NV3041A-01
|
||||
|
||||
WriteData(0x04);
|
||||
WriteComm(0x83); //gam_vrp3 2
|
||||
WriteData(0x39);
|
||||
WriteComm(0xA3); //gam_VRN3 2-
|
||||
WriteData(0x39);
|
||||
WriteComm(0x84); //gam_vrp4 1
|
||||
WriteData(0x3a);
|
||||
WriteComm(0xA4); //gam_VRN4 1-
|
||||
WriteData(0x3a);
|
||||
WriteComm(0x85); //gam_vrp5 0
|
||||
WriteData(0x3f); //2a~39-0.43
|
||||
WriteComm(0xA5); //gam_VRN5 0-
|
||||
WriteData(0x3f);
|
||||
WriteComm(0x86); //gam_prp0 50
|
||||
WriteData(0x2c); //33
|
||||
WriteComm(0xA6); //gam_PRN0 50-
|
||||
WriteData(0x2a); //2a
|
||||
//WriteComm(0x87); //gam_prp1 14
|
||||
//WriteData(0x46); //2d
|
||||
//WriteComm(0xA7); //gam_PRN1 14-
|
||||
//WriteData(0x44); //2d
|
||||
WriteComm(0x87); //gam_prp1 14
|
||||
WriteData(0x43); //2d
|
||||
WriteComm(0xA7); //gam_PRN1 14-
|
||||
WriteData(0x47); //2d
|
||||
WriteComm(0x88); //gam_pkp0 59
|
||||
WriteData(0x08); //0b
|
||||
WriteComm(0xA8); //gam_PKN0 59-
|
||||
WriteData(0x08); //0b
|
||||
WriteComm(0x89); //gam_pkp1 57
|
||||
WriteData(0x0f); //14
|
||||
WriteComm(0xA9); //gam_PKN1 57-
|
||||
WriteData(0x0f); //14
|
||||
WriteComm(0x8a); //gam_pkp2 54
|
||||
WriteData(0x17); //1a
|
||||
WriteComm(0xAa); //gam_PKN2 54-
|
||||
WriteData(0x17); //1a
|
||||
WriteComm(0x8b); //gam_PKP3 44
|
||||
WriteData(0x10);
|
||||
WriteComm(0xAb); //gam_PKN3 44-
|
||||
WriteData(0x10);
|
||||
WriteComm(0x8c); //gam_PKP4 38
|
||||
WriteData(0x16);
|
||||
WriteComm(0xAc); //gam_PKN4 38-
|
||||
WriteData(0x16);//NVu NV3041A-01
|
||||
|
||||
WriteComm(0x8d); //gam_PKP5 32
|
||||
WriteData(0x14);
|
||||
WriteComm(0xAd); //gam_PKN5 32-
|
||||
WriteData(0x14);
|
||||
WriteComm(0x8e); //gam_PKP6 26
|
||||
WriteData(0x11); //16
|
||||
WriteComm(0xAe); //gam_PKN6 26-
|
||||
WriteData(0x11); //13
|
||||
WriteComm(0x8f); //gam_PKP7 20
|
||||
WriteData(0x14); //1c
|
||||
WriteComm(0xAf); //gam_PKN7 20-
|
||||
WriteData(0x14); //0a
|
||||
WriteComm(0x90); //gam_PKP8 10
|
||||
WriteData(0x06);
|
||||
WriteComm(0xB0); //gam_PKN8 10-
|
||||
WriteData(0x06);
|
||||
WriteComm(0x91); //gam_PKP9 6
|
||||
WriteData(0x0f);
|
||||
WriteComm(0xB1); //gam_PKN9 6-
|
||||
WriteData(0x0f);
|
||||
WriteComm(0x92); //gam_PKP10 4
|
||||
WriteData(0x16);
|
||||
WriteComm(0xB2); //gam_PKN10 4-
|
||||
WriteData(0x16);
|
||||
WriteComm(0xff);
|
||||
WriteData(0x00);
|
||||
WriteComm(0x11);
|
||||
|
||||
WriteComm(0x36);
|
||||
WriteData(0x00);
|
||||
|
||||
system_delay_us(120*1000);
|
||||
WriteComm(0x29);
|
||||
system_delay_us(20*1000);
|
||||
|
||||
// LCD_READ_DATA(0x36);
|
||||
// for(uint32_t i=0;i<pixel_size;i++)
|
||||
// {
|
||||
// color_buffer[i]=0xf800;
|
||||
// }
|
||||
// nv3041a_set_window(0,240-1,0,320-1);
|
||||
// __PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
// /* writer data */
|
||||
// Parallel_write_data(&hparallel,(uint32_t *)&color_buffer,(pixel_size));
|
||||
// __PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
// system_delay_us(2000*1000);
|
||||
#if 0
|
||||
for(uint32_t i=0;i<pixel_size;i++)
|
||||
{
|
||||
color_buffer[i]=0xf800;
|
||||
}
|
||||
nv3041a_set_window(0,100-1,0,100-1);
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
/* writer data */
|
||||
Parallel_write_data(&hparallel,(uint32_t *)&color_buffer,(pixel_size));
|
||||
system_delay_us(100);
|
||||
__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
|
||||
system_delay_us(1000*1000);
|
||||
|
||||
#if 0
|
||||
extern uint32_t *user_get_display_framebuffer(void);
|
||||
uint16_t *buf = (uint16_t*)user_get_display_framebuffer();
|
||||
|
||||
nv3041a_set_window(0,100-1,0,100-1);
|
||||
for(uint32_t i=0;i<pixel_size;i++)
|
||||
{
|
||||
color_buffer[i]=0x001f;
|
||||
}
|
||||
nv3041a_display_dma(pixel_size,16,color_buffer);
|
||||
|
||||
system_delay_us(2000*1000);
|
||||
uint16_t color_buf[16]={
|
||||
0xf800,0x001f,0x01e0,0xffff,0x0fff,
|
||||
};
|
||||
static uint8_t index=0;
|
||||
while(1)
|
||||
{
|
||||
for(uint32_t i=0;i<480*272;i++)
|
||||
{
|
||||
buf[i]=color_buf[index];
|
||||
}
|
||||
++index;
|
||||
index%=4;
|
||||
nv3041a_set_window(0,480-1,0,272-1);
|
||||
nv3041a_display_dma((480*272),16,buf);
|
||||
system_delay_us(2000*1000);
|
||||
if(index==0)break;
|
||||
}
|
||||
|
||||
for(uint32_t i=0;i<480*272;i++)
|
||||
{
|
||||
buf[i]=0xf800;
|
||||
}
|
||||
nv3041a_set_window(0,480-1,0,272-1);
|
||||
nv3041a_display_dma((480*272),16,buf);
|
||||
system_delay_us(2000*1000);
|
||||
#endif
|
||||
// LCD_Fill(0,0,240,320,0x001f);
|
||||
// system_delay_us(2000*1000);
|
||||
// LCD_Fill(0,0,240,320,0x01e0);
|
||||
// system_delay_us(2000*1000);
|
||||
// LCD_Fill(0,0,240,320,0xffff);
|
||||
|
||||
#endif
|
||||
printf("LCD_Fill\r\n");
|
||||
|
||||
}
|
14
MCU/components/drivers/bsp/display/driver_nv3041a.h
Normal file
14
MCU/components/drivers/bsp/display/driver_nv3041a.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef __DRIVER_NV3041A_H
|
||||
#define __DRIVER_NV3041A_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void nv3041a_init(void);
|
||||
void nv3041a_display_dma_isr(void);
|
||||
void nv3041a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
void nv3041a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
|
||||
void nv3041a_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
|
||||
|
||||
#endif // __DRIVER_SH8601A_H
|
201
MCU/components/drivers/bsp/display/driver_nv3047_rgb.c
Normal file
201
MCU/components/drivers/bsp/display/driver_nv3047_rgb.c
Normal file
@ -0,0 +1,201 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file RGB_demo.c
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2023
|
||||
* @brief RGB interface module Demo.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "driver_nv3047_rgb.h"
|
||||
|
||||
#if (BOARD_SEL == BOARD_EVB_FR3092E_RGB)
|
||||
|
||||
static GPIO_InitTypeDef GPIO_Handle;
|
||||
PARALLEL_HandTypeDef hparallel;
|
||||
SPI_HandleTypeDef spi_handle;
|
||||
DMA_HandleTypeDef dma_handle;
|
||||
DMA_HandleTypeDef dma1_handle;
|
||||
struct_RGB_TypeDef_t rgb_handle;
|
||||
|
||||
unsigned char *coply = NULL;
|
||||
|
||||
void timer0_irq(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn rgb_display_controller_init
|
||||
*
|
||||
* @brief rgb_display_controller_init
|
||||
*
|
||||
|
||||
*/
|
||||
void rgb_display_controller_init(void)
|
||||
{
|
||||
/* init parallel CLOCK */
|
||||
__SYSTEM_PARALLEL_CLK_ENABLE();
|
||||
__SYSTEM_PARALLEL_CLK_SELECT_SPLL();
|
||||
__SYSTEM_GPIOA_CLK_ENABLE();
|
||||
__SYSTEM_GPIOB_CLK_ENABLE();
|
||||
__SYSTEM_GPIOC_CLK_ENABLE();
|
||||
__SYSTEM_GPIOD_CLK_ENABLE();
|
||||
__SYSTEM_DMA0_CLK_ENABLE();
|
||||
__SYSTEM_DMA1_CLK_ENABLE();
|
||||
__SYSTEM_TIMER0_CLK_ENABLE();
|
||||
//__SYSTEM_SPI_MASTER1_X8_CLK_ENABLE();
|
||||
__SYSTEM_SPI_MASTER0_X8_CLK_ENABLE();
|
||||
printf("parallel clock:%d\r\n", system_get_peripheral_clock( PER_CLK_PARALLEL));
|
||||
|
||||
/* RGB io init */
|
||||
/*
|
||||
D0~D15 PC0~15
|
||||
DCLK PB13
|
||||
*/
|
||||
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
|
||||
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_DATA_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_DATA_PORT, &GPIO_Handle);
|
||||
|
||||
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
|
||||
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_DCLK_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_DCLK_PORT, &GPIO_Handle);
|
||||
|
||||
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
|
||||
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_VSYNC_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_VSYNC_PORT, &GPIO_Handle);
|
||||
|
||||
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_HSYNC_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_HSYNC_PORT, &GPIO_Handle);
|
||||
|
||||
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_DE_EN_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_DE_EN_PORT, &GPIO_Handle);
|
||||
|
||||
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_RESET_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_RESET_PORT, &GPIO_Handle);
|
||||
|
||||
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_Handle.Pin = GPIO_PIN_13;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(GPIOD, &GPIO_Handle);
|
||||
rgb_lcd_reset_release();
|
||||
|
||||
/* backlight */
|
||||
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_BACKLIGHT_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_BACKLIGHT_PORT, &GPIO_Handle);
|
||||
rgb_lcd_backlight_set();
|
||||
rgb_lcd_disp_set();//Display control / standby mode selection. Internal pull low.DISP = “Low” : Standby.DISP = “High” : Normal display.
|
||||
system_delay_us(1000 * 20);
|
||||
|
||||
#ifdef RGB56_LCD_INIT_CONFIG
|
||||
/* SPI CS */
|
||||
GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_SPI_CS_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_SPI_CS_PORT, &GPIO_Handle);
|
||||
|
||||
/* SPI io init */
|
||||
// B0,B2 B3
|
||||
GPIO_Handle.Alternate = GPIO_FUNCTION_7;
|
||||
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_Handle.Pin = RGB565_LCD_SPI_CLK_GPIO|RGB565_LCD_SPI_MOSI_GPIO|RGB565_LCD_SPI_MISO_GPIO;
|
||||
GPIO_Handle.Pull = GPIO_PULLUP;
|
||||
gpio_init(RGB565_LCD_SPI_CLK_PORT, &GPIO_Handle);
|
||||
|
||||
/* SPI init */
|
||||
spi_handle.SPIx = SPIMX8_0;
|
||||
spi_handle.Init.Work_Mode = SPI_WORK_MODE_3;
|
||||
spi_handle.Init.Frame_Size = SPI_FRAME_SIZE_9BIT;
|
||||
spi_handle.Init.BaudRate_Prescaler = 100;
|
||||
spi_handle.Init.TxFIFOEmpty_Threshold = 0;
|
||||
spi_handle.Init.RxFIFOFull_Threshold = 0;
|
||||
spi_master_init(&spi_handle);
|
||||
#endif
|
||||
/* PARALLEL Init */
|
||||
hparallel.PARALLELx = PARALLEL0;
|
||||
hparallel.Init.DataBusSelect = DATA_BUS_16_BIT;
|
||||
hparallel.Init.ParallelMode = MODE_6800;
|
||||
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_0 = 0;
|
||||
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_1 = 1;
|
||||
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_2 = 2;
|
||||
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_3 = 3;
|
||||
hparallel.Init.ReadClock = WDCLK_DIV_4;
|
||||
hparallel.Init.WriteClock = WDCLK_DIV_2;
|
||||
parallel_init(&hparallel);
|
||||
hparallel.PARALLELx->CRM.WR_L_LEN = 2;
|
||||
hparallel.PARALLELx->CRM.WR_H_LEN = 2;
|
||||
__PARALLEL_CS_SET(hparallel.PARALLELx);
|
||||
|
||||
/* DMA Init */
|
||||
system_dmac_request_id_config(PARALLEL_INTERFACE,DMA0_REQUEST_ID_3);
|
||||
dma_handle.DMAx = DMA0;
|
||||
dma_handle.Channel = DMA_Channel2;
|
||||
dma_handle.Init.Data_Flow = DMA_M2P_DMAC;
|
||||
dma_handle.Init.Request_ID = DMA0_REQUEST_ID_3;
|
||||
dma_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3;
|
||||
dma_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_1;
|
||||
dma_handle.Init.Source_Inc = DMA_ADDR_INC_INC;
|
||||
dma_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE;
|
||||
dma_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
|
||||
dma_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
|
||||
dma_handle.Init.Source_Burst_Len = DMA_BURST_LEN_16;
|
||||
dma_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_16;
|
||||
dma_init(&dma_handle);
|
||||
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* @fn rgb_display_init
|
||||
*
|
||||
* @brief rgb_display_init
|
||||
*
|
||||
|
||||
*/
|
||||
void rgb_display_init(void* buffer)
|
||||
{
|
||||
coply = buffer;
|
||||
|
||||
/* rgb init */
|
||||
rgb_init();
|
||||
|
||||
NVIC_ClearPendingIRQ(TIMER0_IRQn);
|
||||
NVIC_EnableIRQ(TIMER0_IRQn);
|
||||
NVIC_ClearPendingIRQ(DMA0_IRQn);
|
||||
NVIC_EnableIRQ(DMA0_IRQn);
|
||||
|
||||
rgb_display_start(Timer0, &rgb_handle, 2, coply);
|
||||
|
||||
printf("%s:%d\r\n", __func__, __LINE__);
|
||||
}
|
||||
|
||||
void timer0_irq(void)
|
||||
{
|
||||
rgb_timer_IRQHandler(Timer0, &rgb_handle);
|
||||
}
|
||||
|
||||
__RAM_CODE void rgb_display_dma_irq(void)
|
||||
{
|
||||
if (dma_get_tfr_Status(&dma_handle))
|
||||
{
|
||||
rgb_dma_IRQHandler(&rgb_handle);
|
||||
dma_clear_tfr_Status(&dma_handle);
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
91
MCU/components/drivers/bsp/display/driver_nv3047_rgb.h
Normal file
91
MCU/components/drivers/bsp/display/driver_nv3047_rgb.h
Normal file
@ -0,0 +1,91 @@
|
||||
|
||||
#ifndef __DRIVER_NV3047_RGB_H__
|
||||
#define __DRIVER_NV3047_RGB_H__
|
||||
|
||||
#include "fr30xx.h"
|
||||
#include "app_config.h"
|
||||
#include "rgb565.h"
|
||||
|
||||
#define RGB_ROW 480
|
||||
#define RGB_COLUMN 272
|
||||
|
||||
#define RGB565_LCD_DCLK_PORT GPIOB
|
||||
#define RGB565_LCD_DCLK_GPIO GPIO_PIN_14
|
||||
|
||||
#define RGB565_LCD_VSYNC_PORT GPIOB
|
||||
#define RGB565_LCD_VSYNC_GPIO GPIO_PIN_13
|
||||
|
||||
#define RGB565_LCD_HSYNC_PORT GPIOB
|
||||
#define RGB565_LCD_HSYNC_GPIO GPIO_PIN_15
|
||||
|
||||
#define RGB565_LCD_DISP_PORT GPIOD
|
||||
#define RGB565_LCD_DISP_GPIO GPIO_PIN_12
|
||||
|
||||
#define RGB565_LCD_DE_EN_PORT GPIOB
|
||||
#define RGB565_LCD_DE_EN_GPIO GPIO_PIN_12
|
||||
|
||||
#define RGB565_LCD_DATA_PORT GPIOC
|
||||
#define RGB565_LCD_DATA_GPIO 0xFFFF //GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
|
||||
|
||||
#define RGB565_LCD_RESET_PORT GPIOA
|
||||
#define RGB565_LCD_RESET_GPIO GPIO_PIN_4
|
||||
|
||||
#define RGB565_LCD_BACKLIGHT_PORT GPIOA
|
||||
#define RGB565_LCD_BACKLIGHT_GPIO GPIO_PIN_4
|
||||
#define RGB565_LCD_SPI_SEL SPIM0
|
||||
|
||||
#ifdef RGB565_LCD_TE_EN
|
||||
#define RGB565_LCD_TE_PORT GPIO_B
|
||||
#define RGB565_LCD_TE_GPIO GPIO_PIN_7
|
||||
#endif
|
||||
|
||||
//#define RGB56_LCD_INIT_CONFIG
|
||||
|
||||
#ifdef RGB56_LCD_INIT_CONFIG
|
||||
#define RGB565_LCD_SPI_CS_PORT GPIOD
|
||||
#define RGB565_LCD_SPI_CS_GPIO GPIO_PIN_12
|
||||
|
||||
#define RGB565_LCD_SPI_CLK_PORT GPIOB
|
||||
#define RGB565_LCD_SPI_CLK_GPIO GPIO_PIN_0
|
||||
|
||||
#define RGB565_LCD_SPI_MOSI_PORT GPIOB
|
||||
#define RGB565_LCD_SPI_MOSI_GPIO GPIO_PIN_2
|
||||
|
||||
#define RGB565_LCD_SPI_MISO_PORT GPIOB
|
||||
#define RGB565_LCD_SPI_MISO_GPIO GPIO_PIN_3
|
||||
|
||||
#define rgb_spi_cs_set() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_spi_cs_release() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#endif
|
||||
|
||||
/* signal drive*/
|
||||
#define rgb_lcd_enable_set() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_enable_release() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_vsync_set() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_vsync_release() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_hsync_set() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_hsync_release() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_reset_set() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_reset_release() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_disp_set() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_disp_release() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_backlight_set() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_backlight_release() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
|
||||
/* rgb_demo */
|
||||
void rgb_display_init(void* buffer);
|
||||
void rgb_display_controller_init(void);
|
||||
|
||||
|
||||
__RAM_CODE void rgb_display_dma_irq(void);
|
||||
|
||||
|
||||
#endif
|
526
MCU/components/drivers/bsp/display/driver_sh8601a.c
Normal file
526
MCU/components/drivers/bsp/display/driver_sh8601a.c
Normal file
@ -0,0 +1,526 @@
|
||||
#include "driver_display.h"
|
||||
#include "driver_sh8601a.h"
|
||||
|
||||
#define SH8601A_MAX_PARA_COUNT (300)
|
||||
|
||||
#define SH8601A_QSPI_INST_CMD_WRITE (0x02)
|
||||
#define SH8601A_QSPI_INST_CMD_READ (0x03)
|
||||
#define SH8601A_QSPI_INST_1WIRE_PIXEL_WRITE (0x02)
|
||||
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE1 (0x32)
|
||||
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE2 (0x12)
|
||||
#define SH8601A_QSPI_SEQ_FINISH_CODE (0x00)
|
||||
|
||||
typedef struct _SH8601A_CMD_DESC {
|
||||
uint8_t instruction;
|
||||
uint8_t index;
|
||||
uint16_t delay;
|
||||
uint16_t wordcount;
|
||||
uint8_t payload[SH8601A_MAX_PARA_COUNT];
|
||||
} SH8601A_CMD_DESC;
|
||||
|
||||
const SH8601A_CMD_DESC SH8601A_PRE_OTP_POWERON_SEQ_CMD[] = {
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xE4, 1, 1, {0x01}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x90, 1, 6, {0x33, 0x00, 0xC6, 0x01, 0xC6, 0x01}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x91, 1, 20, {0x65, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x11}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x92, 1, 20, {0x61, 0xE3, 0x00, 0xC5, 0x01, 0x00, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x22}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x93, 1, 20, {0x69, 0x00, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xC5, 0x01, 0xE2, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x33}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x94, 1, 20, {0x6D, 0xE3, 0x00, 0xC5, 0x01, 0xE3, 0x00, 0xC5, 0x01, 0xE3, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x33}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x9D, 1, 168, {0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x06, 0x0C, 0x12, 0x18, 0x1E, 0x24, 0x2A, 0x30, 0x36, 0x3C, 0x42, 0x48, 0x4E, 0x54, 0x5A, 0x60, 0x09, 0x0D, 0x12, 0x16, 0x1B, 0x24, 0x2D, 0x36, 0x3F, 0x5A, 0x63, 0x6C, 0x75, 0x7E, 0x87, 0x90, 0x05, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x23, 0x28, 0x2D, 0x32, 0x37, 0x3C, 0x41, 0x46, 0x4B, 0x50, 0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78, 0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2, 0xE1, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x60, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x9E, 1, 12, {0x3B, 0x00, 0x71, 0x00, 0xA3, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 51, {0x00, 0xC6, 0x01, 0xC6, 0x01, 0x05, 0x00, 0x05, 0x00, 0xA7, 0x00, 0xA7, 0x00, 0x05, 0x00, 0x05, 0x00, 0xA7, 0x00, 0xA7, 0x00, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB2, 1, 68, {0x19, 0x14, 0x19, 0x14, 0x01, 0xEE, 0x02, 0x30, 0x02, 0xE4, 0x02, 0x3F, 0x02, 0x06, 0x76, 0x78, 0xE8, 0x04, 0x06, 0x00, 0x00, 0x31, 0x16, 0x15, 0x3D, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x10, 0xFF, 0xFF, 0xE0, 0xAA, 0xAA, 0xFF, 0xFF, 0x24, 0x14, 0x04, 0x14, 0x13, 0x14, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB3, 1, 44, {0x00, 0x0D, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x1F, 0x02, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x12, 0x05, 0x00, 0x06, 0x13, 0x04, 0x00, 0x08, 0x15, 0x09, 0x00, 0x07}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB4, 1, 65, {0x09, 0x02, 0x00, 0x00, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x40, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x03, 0x47, 0x8B, 0x30, 0x74, 0xB8, 0x12, 0x56, 0x9A, 0x21, 0x65, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x9A, 0x21, 0x65, 0xA9, 0x03, 0x47, 0x8B, 0x30, 0x74, 0xB8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB5, 1, 58, {0x4C, 0x09, 0x09, 0x09, 0x49, 0x40, 0x00, 0x01, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x52, 0x00, 0x21, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB6, 1, 26, {0x00, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x40, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB7, 1, 51, {0x0C, 0x00, 0x01, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x52, 0x00, 0x21, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x14, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB8, 1, 95, {0x00, 0x67, 0x31, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBB, 1, 19, {0x01, 0x02, 0x07, 0x01, 0x46, 0x46, 0x46, 0xD9, 0x00, 0xAA, 0x00, 0x7D, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBD, 1, 22, {0x01, 0x00, 0x00, 0x64, 0x00, 0x62, 0x00, 0x04, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x05, 0x00, 0x10, 0x16, 0x16, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBE, 1, 106, {0x4B, 0x00, 0x69, 0x00, 0x87, 0x00, 0xA5, 0x00, 0xC3, 0x00, 0xE1, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x64, 0x00, 0xAA, 0x00, 0x19, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x26, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0xD0, 0x01, 0x1C, 0x00, 0x64, 0x00, 0x00, 0x00, 0x89, 0x00, 0xD0, 0x01, 0xD0, 0x01, 0x4B, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBF, 1, 35, {0x03, 0xF0, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC2, 1, 136, {0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x97, 0x00, 0x83, 0x00, 0xEE, 0x00, 0xA8, 0x00, 0x94, 0x00, 0x16, 0x01, 0xCF, 0x00, 0xBC, 0x00, 0x3B, 0x01, 0xF4, 0x00, 0xE1, 0x00, 0x61, 0x01, 0x12, 0x01, 0x08, 0x01, 0x94, 0x01, 0x46, 0x01, 0x41, 0x01, 0xB7, 0x01, 0x6D, 0x01, 0x6B, 0x01, 0xDE, 0x01, 0x93, 0x01, 0x9C, 0x01, 0xF7, 0x01, 0xAF, 0x01, 0xBB, 0x01, 0x27, 0x02, 0xE1, 0x01, 0xFC, 0x01, 0x52, 0x02, 0x0F, 0x02, 0x34, 0x02, 0x77, 0x02, 0x36, 0x02, 0x65, 0x02, 0xBE, 0x02, 0x7C, 0x02, 0xB9, 0x02, 0xFA, 0x02, 0xBA, 0x02, 0x08, 0x03, 0x31, 0x03, 0xF4, 0x02, 0x4F, 0x03, 0x63, 0x03, 0x29, 0x03, 0x8C, 0x03, 0x9E, 0x03, 0x5F, 0x03, 0xD1, 0x03, 0xFD, 0x03, 0xBC, 0x03, 0x4A, 0x04, 0x6E, 0x04, 0x28, 0x04, 0xC4, 0x04, 0xD1, 0x04, 0x91, 0x04, 0x49, 0x05, 0x3D, 0x05, 0xF1, 0x04, 0xC1, 0x05}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC3, 1, 136, {0x00, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x97, 0x00, 0x83, 0x00, 0xEE, 0x00, 0xA8, 0x00, 0x94, 0x00, 0x16, 0x01, 0xCF, 0x00, 0xBC, 0x00, 0x3B, 0x01, 0xF4, 0x00, 0xE1, 0x00, 0x61, 0x01, 0x12, 0x01, 0x08, 0x01, 0x94, 0x01, 0x46, 0x01, 0x41, 0x01, 0xB7, 0x01, 0x6D, 0x01, 0x6B, 0x01, 0xDE, 0x01, 0x93, 0x01, 0x9C, 0x01, 0xF7, 0x01, 0xAF, 0x01, 0xBB, 0x01, 0x27, 0x02, 0xE1, 0x01, 0xFC, 0x01, 0x52, 0x02, 0x0F, 0x02, 0x34, 0x02, 0x77, 0x02, 0x36, 0x02, 0x65, 0x02, 0xBE, 0x02, 0x7C, 0x02, 0xB9, 0x02, 0xFA, 0x02, 0xBA, 0x02, 0x08, 0x03, 0x31, 0x03, 0xF4, 0x02, 0x4F, 0x03, 0x63, 0x03, 0x29, 0x03, 0x8C, 0x03, 0x9E, 0x03, 0x5F, 0x03, 0xD1, 0x03, 0xFD, 0x03, 0xBC, 0x03, 0x4A, 0x04, 0x6E, 0x04, 0x28, 0x04, 0xC4, 0x04, 0xD1, 0x04, 0x91, 0x04, 0x49, 0x05, 0x3D, 0x05, 0xF1, 0x04, 0xC1, 0x05}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC5, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x37, 0x00, 0x32, 0x00, 0x24, 0x01, 0xBD, 0x00, 0xAC, 0x00, 0x3D, 0x01, 0xD6, 0x00, 0xC5, 0x00, 0x50, 0x01, 0xE9, 0x00, 0xD8, 0x00, 0x66, 0x01, 0xFF, 0x00, 0xEE, 0x00, 0x95, 0x01, 0x2E, 0x01, 0x1E, 0x01, 0xB8, 0x01, 0x50, 0x01, 0x44, 0x01, 0xDB, 0x01, 0x73, 0x01, 0x68, 0x01, 0xF5, 0x01, 0x8E, 0x01, 0x84, 0x01, 0x21, 0x02, 0xBE, 0x01, 0xBA, 0x01, 0x4B, 0x02, 0xEB, 0x01, 0xEE, 0x01, 0x6B, 0x02, 0x0E, 0x02, 0x18, 0x02, 0xA9, 0x02, 0x51, 0x02, 0x6C, 0x02, 0xE2, 0x02, 0x8B, 0x02, 0xB2, 0x02, 0x0B, 0x03, 0xB7, 0x02, 0xE7, 0x02, 0x34, 0x03, 0xE5, 0x02, 0x1F, 0x03, 0x57, 0x03, 0x0A, 0x03, 0x4B, 0x03, 0xA3, 0x03, 0x52, 0x03, 0xA9, 0x03, 0xEB, 0x03, 0x9A, 0x03, 0x00, 0x04, 0x2F, 0x04, 0xDC, 0x03, 0x5A, 0x04, 0x64, 0x04, 0x14, 0x04, 0x9E, 0x04}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC6, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x4D, 0x00, 0x46, 0x00, 0x28, 0x01, 0xC1, 0x00, 0xB0, 0x00, 0x42, 0x01, 0xDB, 0x00, 0xCA, 0x00, 0x5C, 0x01, 0xF5, 0x00, 0xE4, 0x00, 0x77, 0x01, 0x10, 0x01, 0xFF, 0x00, 0xA9, 0x01, 0x42, 0x01, 0x35, 0x01, 0xCE, 0x01, 0x67, 0x01, 0x5B, 0x01, 0xF1, 0x01, 0x8A, 0x01, 0x80, 0x01, 0x0C, 0x02, 0xA7, 0x01, 0xA0, 0x01, 0x3D, 0x02, 0xDD, 0x01, 0xDD, 0x01, 0x66, 0x02, 0x08, 0x02, 0x11, 0x02, 0x8C, 0x02, 0x33, 0x02, 0x45, 0x02, 0xD0, 0x02, 0x79, 0x02, 0x9D, 0x02, 0x04, 0x03, 0xB0, 0x02, 0xDE, 0x02, 0x33, 0x03, 0xE5, 0x02, 0x1F, 0x03, 0x5D, 0x03, 0x11, 0x03, 0x53, 0x03, 0x89, 0x03, 0x3C, 0x03, 0x8A, 0x03, 0xDE, 0x03, 0x8D, 0x03, 0xF1, 0x03, 0x2F, 0x04, 0xDC, 0x03, 0x59, 0x04, 0x6F, 0x04, 0x20, 0x04, 0xAC, 0x04, 0xB3, 0x04, 0x64, 0x04, 0xFF, 0x04}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC7, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x63, 0x00, 0x5A, 0x00, 0x2C, 0x01, 0xC5, 0x00, 0xB4, 0x00, 0x48, 0x01, 0xE1, 0x00, 0xD0, 0x00, 0x65, 0x01, 0xFE, 0x00, 0xED, 0x00, 0x87, 0x01, 0x20, 0x01, 0x0F, 0x01, 0xB5, 0x01, 0x4E, 0x01, 0x41, 0x01, 0xE5, 0x01, 0x7D, 0x01, 0x72, 0x01, 0x01, 0x02, 0x9B, 0x01, 0x93, 0x01, 0x1D, 0x02, 0xBA, 0x01, 0xB6, 0x01, 0x55, 0x02, 0xF5, 0x01, 0xFB, 0x01, 0x7C, 0x02, 0x21, 0x02, 0x2F, 0x02, 0xA4, 0x02, 0x4C, 0x02, 0x65, 0x02, 0xF0, 0x02, 0x99, 0x02, 0xC1, 0x02, 0x20, 0x03, 0xCE, 0x02, 0x04, 0x03, 0x51, 0x03, 0x04, 0x03, 0x44, 0x03, 0x83, 0x03, 0x36, 0x03, 0x82, 0x03, 0xB5, 0x03, 0x62, 0x03, 0xBF, 0x03, 0x0F, 0x04, 0xBD, 0x03, 0x2F, 0x04, 0x5C, 0x04, 0x0C, 0x04, 0x94, 0x04, 0xAB, 0x04, 0x5C, 0x04, 0xF5, 0x04, 0xFA, 0x04, 0xA8, 0x04, 0x50, 0x05}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC8, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x00, 0x79, 0x00, 0x6E, 0x00, 0x2F, 0x01, 0xC8, 0x00, 0xB7, 0x00, 0x4D, 0x01, 0xE6, 0x00, 0xD5, 0x00, 0x6D, 0x01, 0x06, 0x01, 0xF5, 0x00, 0x8F, 0x01, 0x28, 0x01, 0x18, 0x01, 0xC1, 0x01, 0x5A, 0x01, 0x4E, 0x01, 0xEF, 0x01, 0x87, 0x01, 0x7D, 0x01, 0x0F, 0x02, 0xAB, 0x01, 0xA4, 0x01, 0x2F, 0x02, 0xCD, 0x01, 0xCB, 0x01, 0x63, 0x02, 0x04, 0x02, 0x0D, 0x02, 0x91, 0x02, 0x38, 0x02, 0x4A, 0x02, 0xBC, 0x02, 0x65, 0x02, 0x86, 0x02, 0x01, 0x03, 0xAC, 0x02, 0xD9, 0x02, 0x39, 0x03, 0xEA, 0x02, 0x25, 0x03, 0x6E, 0x03, 0x23, 0x03, 0x69, 0x03, 0xA4, 0x03, 0x53, 0x03, 0xAA, 0x03, 0xD7, 0x03, 0x85, 0x03, 0xE8, 0x03, 0x37, 0x04, 0xE5, 0x03, 0x64, 0x04, 0x8A, 0x04, 0x3C, 0x04, 0xCF, 0x04, 0xE0, 0x04, 0x8F, 0x04, 0x32, 0x05, 0x30, 0x05, 0xDF, 0x04, 0x92, 0x05}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC9, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x00, 0x8F, 0x00, 0x82, 0x00, 0x33, 0x01, 0xCC, 0x00, 0xBB, 0x00, 0x52, 0x01, 0xEB, 0x00, 0xDA, 0x00, 0x76, 0x01, 0x0F, 0x01, 0xFE, 0x00, 0x98, 0x01, 0x31, 0x01, 0x22, 0x01, 0xCD, 0x01, 0x65, 0x01, 0x5A, 0x01, 0xF8, 0x01, 0x92, 0x01, 0x89, 0x01, 0x1B, 0x02, 0xB8, 0x01, 0xB2, 0x01, 0x3C, 0x02, 0xDB, 0x01, 0xDC, 0x01, 0x70, 0x02, 0x14, 0x02, 0x1F, 0x02, 0xA1, 0x02, 0x49, 0x02, 0x60, 0x02, 0xCF, 0x02, 0x78, 0x02, 0x9C, 0x02, 0x11, 0x03, 0xBE, 0x02, 0xF0, 0x02, 0x4D, 0x03, 0xFF, 0x02, 0x3E, 0x03, 0x87, 0x03, 0x3A, 0x03, 0x87, 0x03, 0xC1, 0x03, 0x6E, 0x03, 0xCD, 0x03, 0xF7, 0x03, 0xA6, 0x03, 0x10, 0x04, 0x56, 0x04, 0x05, 0x04, 0x8B, 0x04, 0xB2, 0x04, 0x63, 0x04, 0xFD, 0x04, 0x10, 0x05, 0xBE, 0x04, 0x6A, 0x05, 0x64, 0x05, 0x14, 0x05, 0xD2, 0x05}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCA, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA5, 0x00, 0x96, 0x00, 0x36, 0x01, 0xCF, 0x00, 0xBE, 0x00, 0x57, 0x01, 0xF0, 0x00, 0xDF, 0x00, 0x7E, 0x01, 0x17, 0x01, 0x06, 0x01, 0xA0, 0x01, 0x39, 0x01, 0x2B, 0x01, 0xD9, 0x01, 0x71, 0x01, 0x66, 0x01, 0x02, 0x02, 0x9C, 0x01, 0x94, 0x01, 0x26, 0x02, 0xC4, 0x01, 0xC1, 0x01, 0x49, 0x02, 0xE8, 0x01, 0xEB, 0x01, 0x7E, 0x02, 0x23, 0x02, 0x32, 0x02, 0xB1, 0x02, 0x59, 0x02, 0x76, 0x02, 0xDF, 0x02, 0x88, 0x02, 0xAF, 0x02, 0x22, 0x03, 0xD1, 0x02, 0x07, 0x03, 0x60, 0x03, 0x14, 0x03, 0x57, 0x03, 0x9F, 0x03, 0x4E, 0x03, 0xA4, 0x03, 0xDA, 0x03, 0x88, 0x03, 0xEC, 0x03, 0x13, 0x04, 0xC1, 0x03, 0x34, 0x04, 0x74, 0x04, 0x25, 0x04, 0xB3, 0x04, 0xD8, 0x04, 0x87, 0x04, 0x29, 0x05, 0x37, 0x05, 0xE7, 0x04, 0x9B, 0x05, 0x95, 0x05, 0x41, 0x05, 0x0B, 0x06}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCB, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0xBB, 0x00, 0xAA, 0x00, 0x3A, 0x01, 0xD3, 0x00, 0xC2, 0x00, 0x5C, 0x01, 0xF5, 0x00, 0xE4, 0x00, 0x87, 0x01, 0x20, 0x01, 0x0F, 0x01, 0xA9, 0x01, 0x42, 0x01, 0x35, 0x01, 0xE5, 0x01, 0x7D, 0x01, 0x72, 0x01, 0x0C, 0x02, 0xA7, 0x01, 0xA0, 0x01, 0x32, 0x02, 0xD1, 0x01, 0xCF, 0x01, 0x55, 0x02, 0xF5, 0x01, 0xFB, 0x01, 0x8C, 0x02, 0x33, 0x02, 0x44, 0x02, 0xC1, 0x02, 0x6A, 0x02, 0x8C, 0x02, 0xF0, 0x02, 0x99, 0x02, 0xC2, 0x02, 0x33, 0x03, 0xE4, 0x02, 0x1E, 0x03, 0x74, 0x03, 0x29, 0x03, 0x70, 0x03, 0xB6, 0x03, 0x63, 0x03, 0xC0, 0x03, 0xF3, 0x03, 0xA2, 0x03, 0x0A, 0x04, 0x2E, 0x04, 0xDB, 0x03, 0x58, 0x04, 0x93, 0x04, 0x45, 0x04, 0xDA, 0x04, 0xFE, 0x04, 0xAC, 0x04, 0x54, 0x05, 0x5F, 0x05, 0x0F, 0x05, 0xCC, 0x05, 0xC5, 0x05, 0x6E, 0x05, 0x43, 0x06}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCC, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x49, 0x00, 0x43, 0x00, 0x27, 0x01, 0xC0, 0x00, 0xAF, 0x00, 0x42, 0x01, 0xDB, 0x00, 0xCA, 0x00, 0x5A, 0x01, 0xF3, 0x00, 0xE2, 0x00, 0x74, 0x01, 0x0D, 0x01, 0xFC, 0x00, 0xA6, 0x01, 0x3F, 0x01, 0x32, 0x01, 0xCA, 0x01, 0x63, 0x01, 0x57, 0x01, 0xEE, 0x01, 0x87, 0x01, 0x7D, 0x01, 0x08, 0x02, 0xA3, 0x01, 0x9C, 0x01, 0x39, 0x02, 0xD9, 0x01, 0xD8, 0x01, 0x62, 0x02, 0x03, 0x02, 0x0C, 0x02, 0x87, 0x02, 0x2D, 0x02, 0x3D, 0x02, 0xCB, 0x02, 0x74, 0x02, 0x97, 0x02, 0x00, 0x03, 0xAB, 0x02, 0xD8, 0x02, 0x2D, 0x03, 0xDD, 0x02, 0x16, 0x03, 0x56, 0x03, 0x09, 0x03, 0x4A, 0x03, 0x82, 0x03, 0x35, 0x03, 0x81, 0x03, 0xD5, 0x03, 0x83, 0x03, 0xE6, 0x03, 0x24, 0x04, 0xD1, 0x03, 0x4B, 0x04, 0x65, 0x04, 0x14, 0x04, 0x9E, 0x04, 0xA7, 0x04, 0x58, 0x04, 0xF1, 0x04}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCD, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x7D, 0x00, 0x71, 0x00, 0x30, 0x01, 0xC9, 0x00, 0xB8, 0x00, 0x4E, 0x01, 0xE7, 0x00, 0xD6, 0x00, 0x6F, 0x01, 0x08, 0x01, 0xF7, 0x00, 0x91, 0x01, 0x2A, 0x01, 0x1A, 0x01, 0xC3, 0x01, 0x5C, 0x01, 0x50, 0x01, 0xF0, 0x01, 0x89, 0x01, 0x7F, 0x01, 0x11, 0x02, 0xAD, 0x01, 0xA7, 0x01, 0x32, 0x02, 0xD1, 0x01, 0xCE, 0x01, 0x65, 0x02, 0x07, 0x02, 0x10, 0x02, 0x93, 0x02, 0x3B, 0x02, 0x4E, 0x02, 0xC0, 0x02, 0x69, 0x02, 0x8B, 0x02, 0x03, 0x03, 0xAF, 0x02, 0xDD, 0x02, 0x3C, 0x03, 0xEE, 0x02, 0x2A, 0x03, 0x73, 0x03, 0x28, 0x03, 0x6F, 0x03, 0xA9, 0x03, 0x58, 0x03, 0xB0, 0x03, 0xDD, 0x03, 0x8B, 0x03, 0xEF, 0x03, 0x3C, 0x04, 0xEA, 0x03, 0x6A, 0x04, 0x92, 0x04, 0x44, 0x04, 0xD9, 0x04, 0xE9, 0x04, 0x98, 0x04, 0x3C, 0x05, 0x39, 0x05, 0xE8, 0x04, 0x9D, 0x05}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xCE, 1, 136, {0x00, 0x00, 0x6A, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0xBB, 0x00, 0xAA, 0x00, 0x3A, 0x01, 0xD3, 0x00, 0xC2, 0x00, 0x5C, 0x01, 0xF5, 0x00, 0xE4, 0x00, 0x87, 0x01, 0x20, 0x01, 0x0F, 0x01, 0xA9, 0x01, 0x42, 0x01, 0x35, 0x01, 0xE5, 0x01, 0x7D, 0x01, 0x72, 0x01, 0x0C, 0x02, 0xA7, 0x01, 0xA0, 0x01, 0x32, 0x02, 0xD1, 0x01, 0xCF, 0x01, 0x55, 0x02, 0xF5, 0x01, 0xFB, 0x01, 0x8C, 0x02, 0x33, 0x02, 0x44, 0x02, 0xC1, 0x02, 0x6A, 0x02, 0x8C, 0x02, 0xF0, 0x02, 0x99, 0x02, 0xC2, 0x02, 0x33, 0x03, 0xE4, 0x02, 0x1E, 0x03, 0x74, 0x03, 0x29, 0x03, 0x70, 0x03, 0xB6, 0x03, 0x63, 0x03, 0xC0, 0x03, 0xF3, 0x03, 0xA2, 0x03, 0x0A, 0x04, 0x2E, 0x04, 0xDB, 0x03, 0x58, 0x04, 0x93, 0x04, 0x45, 0x04, 0xDA, 0x04, 0xFE, 0x04, 0xAC, 0x04, 0x54, 0x05, 0x5F, 0x05, 0x0F, 0x05, 0xCC, 0x05, 0xC5, 0x05, 0x6E, 0x05, 0x43, 0x06}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD3, 1, 11, {0x11, 0xC6, 0x01, 0xC6, 0x01, 0x08, 0x08, 0x14, 0x14, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD4, 1, 54, {0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD5, 1, 54, {0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD6, 1, 54, {0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xD7, 1, 54, {0x02, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x3b, 0x00, 0x6c, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x08, 0x00, 0x29, 0x00, 0x08, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xDF, 1, 19, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xEE, 1, 44, {0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF0, 1, 24, {0x10, 0x79, 0x77, 0x22, 0x4A, 0x25, 0x1C, 0x19, 0x00, 0x10, 0x0F, 0x11, 0x38, 0xAA, 0x20, 0x20, 0x2A, 0x22, 0x2A, 0xCA, 0x88, 0x10, 0x10, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF1, 1, 25, {0x10, 0x09, 0x03, 0x00, 0x4A, 0x25, 0x1C, 0x19, 0x00, 0x10, 0x0F, 0x00, 0x30, 0xAA, 0x20, 0x20, 0x2F, 0x23, 0x2F, 0x22, 0x2E, 0xCF, 0x88, 0x10, 0x10}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF1, 1, 25, {0x10, 0x09, 0x03, 0x00, 0x4A, 0x25, 0x1C, 0x19, 0x00, 0x10, 0x0F, 0x11, 0x30, 0xAA, 0x10, 0x10, 0x26, 0x20, 0x25, 0x12, 0x16, 0xC5, 0x88, 0x10, 0x01}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF2, 1, 34, {0xFF, 0x53, 0x00, 0x11, 0x19, 0x0A, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x00, 0x01, 0x01, 0xFF, 0x53, 0x10, 0x11, 0x19, 0x0A, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x01, 0x01, 0x01}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF3, 1, 36, {0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x02, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF4, 1, 21, {0x99, 0x99, 0x99, 0x88, 0x88, 0x77, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x44, 0x94, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF5, 1, 21, {0x66, 0x66, 0x56, 0x55, 0x45, 0x44, 0x33, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x62, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xF8, 1, 16, {0x03, 0x22, 0x22, 0x77, 0x37, 0x00, 0x10, 0x10, 0x26, 0x20, 0x25, 0x12, 0x14, 0x05, 0x66, 0x66}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xD1}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 50, 1, {0x84}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x3A, 1, 1, {0x05}}, // 16bits pixel
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x81}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
|
||||
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
const SH8601A_CMD_DESC SH8601A_POST_OTP_POWERON_SEQ_CMD[] = {
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 51, {0xC0, 0xC6, 0x01, 0xC6, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB4, 1, 65, {0x09, 0x02, 0x00, 0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x02, 0x46, 0x8A, 0x13, 0x57, 0x9B, 0x31, 0x75, 0xB9, 0x20, 0x64, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x64, 0xA8, 0x31, 0x75, 0xB9, 0x13, 0x57, 0x9B, 0x02, 0x46, 0x8A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB5, 1, 58, {0x4C, 0x09, 0x09, 0x09, 0x49, 0x40, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB6, 1, 26, {0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB7, 1, 51, {0x0C, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB8, 1, 95, {0x00, 0x67, 0x31, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
|
||||
|
||||
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xB0, 1, 1, {0x16}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 9, {0x01, 0x05, 0x00, 0xA2, 0x00, 0xA7, 0x00, 0xA7, 0x00}}, // 0x01=45Hz, 0x00=60Hz
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
|
||||
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
|
||||
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
const SH8601A_CMD_DESC SH8601A_POWEROFF_SEQ_CMD[] = {
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x28, 25, 0, {0}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x10, 50, 0, {0}},
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
const SH8601A_CMD_DESC SH8601A_OTP_WRITE[] = {
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 1000, 2, {0x01}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 10, 2, {0x00}},
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
static DMA_LLI_InitTypeDef *Link_Channel = (void *)0x1fffe000;
|
||||
|
||||
static void write_cmd(uint8_t cmd)
|
||||
{
|
||||
uint8_t spi_data[4];
|
||||
|
||||
spi_data[0] = SH8601A_QSPI_INST_CMD_WRITE;
|
||||
spi_data[1] = 0x00;
|
||||
spi_data[2] = cmd;
|
||||
spi_data[3] = 0x00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
static void write_buff(uint8_t *buffer, uint8_t len)
|
||||
{
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)buffer, len);
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
static void read_reg(uint8_t reg, uint8_t *buffer, uint16_t len)
|
||||
{
|
||||
uint8_t spi_data[4];
|
||||
|
||||
spi_data[0] = SH8601A_QSPI_INST_CMD_READ;
|
||||
spi_data[1] = 0x00;
|
||||
spi_data[2] = reg;
|
||||
spi_data[3] = 0x00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
|
||||
spi_master_receive_X1(&spi_display_handle, buffer, len);
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
static void SH8601A_Reg_Write(const SH8601A_CMD_DESC* cmd)
|
||||
{
|
||||
uint16_t idx = 0;
|
||||
|
||||
while (cmd[idx].instruction != SH8601A_QSPI_SEQ_FINISH_CODE)
|
||||
{
|
||||
uint8_t sdat[cmd[idx].wordcount + 4];
|
||||
|
||||
sdat[0] = cmd[idx].instruction;
|
||||
|
||||
sdat[1] = 0;
|
||||
sdat[2] = cmd[idx].index; // Set in the middle 8 bits ADDR[15:8] of the 24 bits ADDR[23:0]
|
||||
sdat[3] = 0;
|
||||
|
||||
for(uint16_t i=0; i<cmd[idx].wordcount; i++)
|
||||
{
|
||||
sdat[i+4] = cmd[idx].payload[i];
|
||||
}
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
if (cmd[idx].delay != 0)
|
||||
{
|
||||
__DISPLAY_DELAY_MS(cmd[idx].delay);
|
||||
}
|
||||
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
static void SH8601A_Init_Pre_OTP(void)
|
||||
{
|
||||
//pull low RESX
|
||||
//power on VBAT: VBAT = 3.7V
|
||||
//power on VDDI: VDDI = 1.8V
|
||||
//pull high VCI_EN: enable VCI = 3.3V
|
||||
//delay 10ms
|
||||
//pull high RESX: IC reset
|
||||
//delay 10ms
|
||||
SH8601A_Reg_Write(SH8601A_PRE_OTP_POWERON_SEQ_CMD);
|
||||
}
|
||||
|
||||
static void SH8601A_Init_Post_OTP(void)
|
||||
{
|
||||
//pull low RESX
|
||||
//power on VBAT: VBAT = 3.7V
|
||||
//power on VDDI: VDDI = 1.8V
|
||||
//pull high VCI_EN: enable VCI = 3.3V
|
||||
//delay 10ms
|
||||
//pull high RESX: IC reset
|
||||
//delay 10ms
|
||||
SH8601A_Reg_Write(SH8601A_POST_OTP_POWERON_SEQ_CMD);
|
||||
}
|
||||
|
||||
static void SH8601A_Power_Off(void)
|
||||
{
|
||||
SH8601A_Reg_Write(SH8601A_POWEROFF_SEQ_CMD);
|
||||
//delay 100ms
|
||||
//pull low RESX
|
||||
//delay 10ms
|
||||
//pull low VCI_EN: disable VCI
|
||||
//power off VDDI
|
||||
//power off VBAT
|
||||
}
|
||||
|
||||
static void SH8601A_OTP_Write(void)
|
||||
{
|
||||
/*********************************************
|
||||
* Register read:
|
||||
* Index: 0xCF (OTP_STATUS)
|
||||
* Para: 1 Byte read
|
||||
* Check BANK_CHECK_MCS[1:0]:
|
||||
* - 00h: No writen, 3 times writable
|
||||
* - 01h: 1 time written, 2 times writable
|
||||
* - 02h: 2 times written, 1 time writable
|
||||
* - 03h: 3 time written, no longer be written
|
||||
**********************************************/
|
||||
|
||||
//power on VOTP: VOTP = 6V external supply
|
||||
//delay 20ms
|
||||
SH8601A_Reg_Write(SH8601A_OTP_WRITE);
|
||||
//power off VOTP
|
||||
//delay 20ms
|
||||
|
||||
/*********************************************
|
||||
* OTP status verification:
|
||||
* Index: 0xCF (OTP_STATUS)
|
||||
* Para: 3 Bytes read
|
||||
* Check PRG_ERR_1:
|
||||
* - 0: OK
|
||||
* - 1: FAIL
|
||||
OTP rewrite(power off -> power on -> rewrite)
|
||||
* Check PRG_ERR_0:
|
||||
* - 0: OK
|
||||
* - 1: FAIL
|
||||
Not rewrite OTP
|
||||
**********************************************/
|
||||
|
||||
/* Go to power off sequence */
|
||||
}
|
||||
|
||||
static void sh8601a_read_regs(void)
|
||||
{
|
||||
uint8_t buffer[6];
|
||||
|
||||
read_reg(0x90, buffer, 6);
|
||||
read_reg(0x2A, buffer, 4);
|
||||
read_reg(0x2B, buffer, 4);
|
||||
}
|
||||
|
||||
void sh8601a_init(void)
|
||||
{
|
||||
__DISPLAY_VCI_CLEAR();
|
||||
__DISPLAY_RESET_CLEAR();
|
||||
__DISPLAY_DELAY_MS(20);
|
||||
__DISPLAY_VCI_SET();
|
||||
__DISPLAY_DELAY_MS(40);
|
||||
__DISPLAY_RESET_SET();
|
||||
__DISPLAY_DELAY_MS(80);
|
||||
|
||||
SH8601A_Init_Pre_OTP();
|
||||
}
|
||||
|
||||
void sh8601a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
|
||||
{
|
||||
uint8_t data[8];
|
||||
|
||||
data[0] = 0x02;
|
||||
data[1] = 0x00;
|
||||
data[2] = 0x2A;
|
||||
data[3] = 0x00;
|
||||
data[4] = x_s >> 8;
|
||||
data[5] = x_s & 0xff;
|
||||
data[6] = x_e >> 8;
|
||||
data[7] = x_e & 0xff;
|
||||
write_buff(data, 8);
|
||||
|
||||
data[0] = 0x02;
|
||||
data[1] = 0x00;
|
||||
data[2] = 0x2B;
|
||||
data[3] = 0x00;
|
||||
data[4] = y_s >> 8;
|
||||
data[5] = y_s & 0xff;
|
||||
data[6] = y_e >> 8;
|
||||
data[7] = y_e & 0xff;
|
||||
write_buff(data, 8);
|
||||
|
||||
// write_cmd(0x2c);
|
||||
}
|
||||
|
||||
void sh8601a_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
uint8_t frame_size;
|
||||
|
||||
if (pixel_width == 16) {
|
||||
frame_size = SPI_FRAME_SIZE_16BIT;
|
||||
}
|
||||
else if (pixel_width == 32) {
|
||||
frame_size = SPI_FRAME_SIZE_24BIT;
|
||||
}
|
||||
spi_display_handle.Init.Frame_Size = frame_size;
|
||||
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_display_handle.MultWireParam.Instruct = 0x32;
|
||||
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_display_handle.MultWireParam.Address = 0x002C00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X2X4X8(&spi_display_handle, data, pixel_count);
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
|
||||
}
|
||||
|
||||
void sh8601a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
//#define USE_DMA_LINK_MODE
|
||||
uint8_t spi_trans_width;
|
||||
uint32_t dma_sample_count;
|
||||
|
||||
#ifdef USE_DMA_LINK_MODE
|
||||
#define DMA_SINGLE_TRANSFER_SIZE 20000
|
||||
uint32_t link_count;
|
||||
uint32_t i;
|
||||
uint32_t link_trans_size;
|
||||
dma_LinkParameter_t LinkParameter;
|
||||
|
||||
|
||||
switch (dma_display_handle.Init.Source_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
dma_sample_count = pixel_count * pixel_width / 32;
|
||||
link_trans_size = 4 * DMA_SINGLE_TRANSFER_SIZE;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
dma_sample_count = pixel_count * pixel_width / 16;
|
||||
link_trans_size = 2 * DMA_SINGLE_TRANSFER_SIZE;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
dma_sample_count = pixel_count * pixel_width / 8;
|
||||
link_trans_size = DMA_SINGLE_TRANSFER_SIZE;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
link_count = dma_sample_count / DMA_SINGLE_TRANSFER_SIZE;
|
||||
if(dma_sample_count % DMA_SINGLE_TRANSFER_SIZE)
|
||||
{
|
||||
link_count++;
|
||||
}
|
||||
|
||||
for (i = 0; i < link_count; i++)
|
||||
{
|
||||
uint8_t all_set = (dma_sample_count <= DMA_SINGLE_TRANSFER_SIZE);
|
||||
|
||||
LinkParameter.SrcAddr = (uint32_t)data + i * link_trans_size;
|
||||
LinkParameter.DstAddr = (uint32_t)&spi_display_handle.SPIx->DR;
|
||||
if(all_set)
|
||||
{
|
||||
LinkParameter.NextLink = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
LinkParameter.NextLink = (uint32_t)&Link_Channel[i + 1];
|
||||
}
|
||||
LinkParameter.Data_Flow = dma_display_handle.Init.Data_Flow;
|
||||
LinkParameter.Request_ID = dma_display_handle.Init.Request_ID;
|
||||
LinkParameter.Source_Master_Sel = dma_display_handle.Init.Source_Master_Sel;
|
||||
LinkParameter.Desination_Master_Sel = dma_display_handle.Init.Desination_Master_Sel;
|
||||
LinkParameter.Source_Inc = dma_display_handle.Init.Source_Inc;
|
||||
LinkParameter.Desination_Inc = dma_display_handle.Init.Desination_Inc;
|
||||
LinkParameter.Source_Width = dma_display_handle.Init.Source_Width;
|
||||
LinkParameter.Desination_Width = dma_display_handle.Init.Desination_Width;
|
||||
LinkParameter.Source_Burst_Len = dma_display_handle.Init.Source_Burst_Len;
|
||||
LinkParameter.Desination_Burst_Len = dma_display_handle.Init.Desination_Burst_Len;
|
||||
LinkParameter.Size = all_set ? dma_sample_count : DMA_SINGLE_TRANSFER_SIZE;
|
||||
LinkParameter.gather_enable = 0;
|
||||
LinkParameter.scatter_enable = 0;
|
||||
dma_sample_count -= DMA_SINGLE_TRANSFER_SIZE;
|
||||
|
||||
dma_linked_list_init(&Link_Channel[i], &LinkParameter);
|
||||
}
|
||||
#else
|
||||
switch (dma_display_handle.Init.Source_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
dma_sample_count = pixel_count * pixel_width / 32;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
dma_sample_count = pixel_count * pixel_width / 16;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
dma_sample_count = pixel_count * pixel_width / 8;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (dma_display_handle.Init.Desination_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
spi_trans_width = SPI_FRAME_SIZE_32BIT;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
spi_trans_width = SPI_FRAME_SIZE_16BIT;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
spi_trans_width = SPI_FRAME_SIZE_8BIT;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
spi_display_handle.Init.Frame_Size = spi_trans_width;
|
||||
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_display_handle.MultWireParam.Instruct = 0x32;
|
||||
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_display_handle.MultWireParam.Address = 0x002C00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
__SPI_ENABLE(spi_display_handle.SPIx);
|
||||
spi_master_transmit_X2X4X8_DMA(&spi_display_handle);
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
if (spi_trans_width == SPI_FRAME_SIZE_32BIT) {
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_2143);
|
||||
}
|
||||
else {
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
}
|
||||
__SPI_ENABLE(spi_display_handle.SPIx);
|
||||
#ifndef USE_DMA_LINK_MODE
|
||||
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&spi_display_handle.SPIx->DR, dma_sample_count);
|
||||
#else
|
||||
dma_linked_list_start_IT(Link_Channel, &LinkParameter, &dma_display_handle);
|
||||
#endif
|
||||
}
|
||||
|
||||
void sh8601a_display_dma_isr(void)
|
||||
{
|
||||
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
|
||||
|
||||
// CS Release
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
/* Clear Transfer complete status */
|
||||
dma_clear_tfr_Status(&dma_display_handle);
|
||||
/* channel Transfer complete interrupt disable */
|
||||
dma_tfr_interrupt_disable(&dma_display_handle);
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
|
||||
}
|
16
MCU/components/drivers/bsp/display/driver_sh8601a.h
Normal file
16
MCU/components/drivers/bsp/display/driver_sh8601a.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef __DRIVER_SH8601A_H
|
||||
#define __DRIVER_SH8601A_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void sh8601a_init(void);
|
||||
|
||||
void sh8601a_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
|
||||
|
||||
void sh8601a_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
void sh8601a_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
void sh8601a_display_dma_isr(void);
|
||||
|
||||
#endif // __DRIVER_SH8601A_H
|
501
MCU/components/drivers/bsp/display/driver_sh8601z.c
Normal file
501
MCU/components/drivers/bsp/display/driver_sh8601z.c
Normal file
@ -0,0 +1,501 @@
|
||||
#include "driver_display.h"
|
||||
#include "driver_sh8601z.h"
|
||||
|
||||
#define SH8601A_MAX_PARA_COUNT (300)
|
||||
|
||||
#define SH8601A_QSPI_INST_CMD_WRITE (0x02)
|
||||
#define SH8601A_QSPI_INST_CMD_READ (0x03)
|
||||
#define SH8601A_QSPI_INST_1WIRE_PIXEL_WRITE (0x02)
|
||||
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE1 (0x32)
|
||||
#define SH8601A_QSPI_INST_4WIRE_PIXEL_WRITE_TYPE2 (0x12)
|
||||
#define SH8601A_QSPI_SEQ_FINISH_CODE (0x00)
|
||||
|
||||
typedef struct _SH8601A_CMD_DESC {
|
||||
uint8_t instruction;
|
||||
uint8_t index;
|
||||
uint16_t delay;
|
||||
uint16_t wordcount;
|
||||
uint8_t payload[SH8601A_MAX_PARA_COUNT];
|
||||
} SH8601A_CMD_DESC;
|
||||
|
||||
static const SH8601A_CMD_DESC SH8601A_PRE_OTP_POWERON_SEQ_CMD[] = {
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0x6F}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xBF}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xBF}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x3A, 1, 1, {0x05}}, // 16bits pixel
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 25, 1, {0x20}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
static const SH8601A_CMD_DESC SH8601A_POST_OTP_POWERON_SEQ_CMD[] = {
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 51, {0xC0, 0xC6, 0x01, 0xC6, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x05, 0x00, 0x05, 0x00, 0x2B, 0x01, 0x2B, 0x01, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x52, 0x00, 0x64, 0x00, 0x8A, 0x00, 0xB0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0xDF, 0x01, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB4, 1, 65, {0x09, 0x02, 0x00, 0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x02, 0x46, 0x8A, 0x13, 0x57, 0x9B, 0x31, 0x75, 0xB9, 0x20, 0x64, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x64, 0xA8, 0x31, 0x75, 0xB9, 0x13, 0x57, 0x9B, 0x02, 0x46, 0x8A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB5, 1, 58, {0x4C, 0x09, 0x09, 0x09, 0x49, 0x40, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB6, 1, 26, {0x00, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x2C, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB7, 1, 51, {0x0C, 0x00, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x6E, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB8, 1, 95, {0x00, 0x67, 0x31, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
|
||||
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
|
||||
// {SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
|
||||
|
||||
// {SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0x5A, 0x5A}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0x5A, 0x5A}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x11, 10, 0, {0}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2A, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x2B, 1, 4, {0x00, 0x00, 0x01, 0xC5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x44, 1, 2, {0x01, 0xC2}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x35, 1, 1, {0x00}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xB0, 1, 1, {0x16}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 9, {0x01, 0x05, 0x00, 0xA2, 0x00, 0xA7, 0x00, 0xA7, 0x00}}, // 0x01=45Hz, 0x00=60Hz
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0x51, 1, 1, {0xFF}},
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0x4A, 1, 1, {0xFF}},
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0x63, 1, 1, {0xFF}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x53, 1, 1, {0x28}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC4, 25, 1, {0x84}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x29, 1, 0, {0}},
|
||||
//{SH8601A_QSPI_INST_CMD_WRITE, 0xBA, 1, 1, {0x80}}, // bist: 0x81, exit bist: 0x80
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xB1, 1, 1, {0xC0}},
|
||||
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC0, 1, 2, {0xA5, 0xA5}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xC1, 1, 2, {0xA5, 0xA5}},
|
||||
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
static const SH8601A_CMD_DESC SH8601A_POWEROFF_SEQ_CMD[] = {
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x28, 15, 0, {0}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0x10, 0, 0, {0}},
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
static const SH8601A_CMD_DESC SH8601A_OTP_WRITE[] = {
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 1000, 2, {0x01}},
|
||||
{SH8601A_QSPI_INST_CMD_WRITE, 0xD0, 10, 2, {0x00}},
|
||||
{SH8601A_QSPI_SEQ_FINISH_CODE, 0, 0, 0, {0}},
|
||||
};
|
||||
|
||||
#ifdef USE_DMA_LINK_MODE
|
||||
static DMA_LLI_InitTypeDef *Link_Channel = (void *)0x1fffe000;
|
||||
#endif
|
||||
|
||||
static void write_cmd(uint8_t cmd)
|
||||
{
|
||||
uint8_t spi_data[4];
|
||||
|
||||
spi_data[0] = SH8601A_QSPI_INST_CMD_WRITE;
|
||||
spi_data[1] = 0x00;
|
||||
spi_data[2] = cmd;
|
||||
spi_data[3] = 0x00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
static void write_buff(uint8_t *buffer, uint8_t len)
|
||||
{
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)buffer, len);
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
static void read_reg(uint8_t reg, uint8_t *buffer, uint16_t len)
|
||||
{
|
||||
uint8_t spi_data[4];
|
||||
|
||||
spi_data[0] = SH8601A_QSPI_INST_CMD_READ;
|
||||
spi_data[1] = 0x00;
|
||||
spi_data[2] = reg;
|
||||
spi_data[3] = 0x00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, (uint16_t *)spi_data, 4);
|
||||
spi_master_receive_X1(&spi_display_handle, buffer, len);
|
||||
__DISPLAY_CS_SET();
|
||||
}
|
||||
|
||||
static void SH8601A_Reg_Write(const SH8601A_CMD_DESC* cmd)
|
||||
{
|
||||
uint16_t idx = 0;
|
||||
|
||||
while (cmd[idx].instruction != SH8601A_QSPI_SEQ_FINISH_CODE)
|
||||
{
|
||||
uint8_t sdat[cmd[idx].wordcount + 4];
|
||||
|
||||
sdat[0] = cmd[idx].instruction;
|
||||
|
||||
sdat[1] = 0;
|
||||
sdat[2] = cmd[idx].index; // Set in the middle 8 bits ADDR[15:8] of the 24 bits ADDR[23:0]
|
||||
sdat[3] = 0;
|
||||
|
||||
for(uint16_t i=0; i<cmd[idx].wordcount; i++)
|
||||
{
|
||||
sdat[i+4] = cmd[idx].payload[i];
|
||||
}
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X1(&spi_display_handle, sdat, sizeof(sdat));
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
if (cmd[idx].delay != 0)
|
||||
{
|
||||
__DISPLAY_DELAY_MS(cmd[idx].delay);
|
||||
}
|
||||
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
static void SH8601A_Init_Pre_OTP(void)
|
||||
{
|
||||
//pull low RESX
|
||||
//power on VBAT: VBAT = 3.7V
|
||||
//power on VDDI: VDDI = 1.8V
|
||||
//pull high VCI_EN: enable VCI = 3.3V
|
||||
//delay 10ms
|
||||
//pull high RESX: IC reset
|
||||
//delay 10ms
|
||||
SH8601A_Reg_Write(SH8601A_PRE_OTP_POWERON_SEQ_CMD);
|
||||
}
|
||||
|
||||
static void SH8601A_Init_Post_OTP(void)
|
||||
{
|
||||
//pull low RESX
|
||||
//power on VBAT: VBAT = 3.7V
|
||||
//power on VDDI: VDDI = 1.8V
|
||||
//pull high VCI_EN: enable VCI = 3.3V
|
||||
//delay 10ms
|
||||
//pull high RESX: IC reset
|
||||
//delay 10ms
|
||||
SH8601A_Reg_Write(SH8601A_POST_OTP_POWERON_SEQ_CMD);
|
||||
}
|
||||
|
||||
static void SH8601A_Power_Off(void)
|
||||
{
|
||||
SH8601A_Reg_Write(SH8601A_POWEROFF_SEQ_CMD);
|
||||
//delay 100ms
|
||||
//pull low RESX
|
||||
//delay 10ms
|
||||
//pull low VCI_EN: disable VCI
|
||||
//power off VDDI
|
||||
//power off VBAT
|
||||
}
|
||||
|
||||
static void SH8601A_OTP_Write(void)
|
||||
{
|
||||
/*********************************************
|
||||
* Register read:
|
||||
* Index: 0xCF (OTP_STATUS)
|
||||
* Para: 1 Byte read
|
||||
* Check BANK_CHECK_MCS[1:0]:
|
||||
* - 00h: No writen, 3 times writable
|
||||
* - 01h: 1 time written, 2 times writable
|
||||
* - 02h: 2 times written, 1 time writable
|
||||
* - 03h: 3 time written, no longer be written
|
||||
**********************************************/
|
||||
|
||||
//power on VOTP: VOTP = 6V external supply
|
||||
//delay 20ms
|
||||
SH8601A_Reg_Write(SH8601A_OTP_WRITE);
|
||||
//power off VOTP
|
||||
//delay 20ms
|
||||
|
||||
/*********************************************
|
||||
* OTP status verification:
|
||||
* Index: 0xCF (OTP_STATUS)
|
||||
* Para: 3 Bytes read
|
||||
* Check PRG_ERR_1:
|
||||
* - 0: OK
|
||||
* - 1: FAIL
|
||||
OTP rewrite(power off -> power on -> rewrite)
|
||||
* Check PRG_ERR_0:
|
||||
* - 0: OK
|
||||
* - 1: FAIL
|
||||
Not rewrite OTP
|
||||
**********************************************/
|
||||
|
||||
/* Go to power off sequence */
|
||||
}
|
||||
|
||||
static void sh8601a_read_regs(void)
|
||||
{
|
||||
uint8_t buffer[6];
|
||||
|
||||
read_reg(0x90, buffer, 6);
|
||||
read_reg(0x2A, buffer, 4);
|
||||
read_reg(0x2B, buffer, 4);
|
||||
}
|
||||
|
||||
void sh8601z_init(void)
|
||||
{
|
||||
__DISPLAY_VCI_CLEAR();
|
||||
__DISPLAY_RESET_CLEAR();
|
||||
__DISPLAY_DELAY_MS(10);
|
||||
__DISPLAY_VCI_SET();
|
||||
__DISPLAY_DELAY_MS(10);
|
||||
__DISPLAY_RESET_SET();
|
||||
__DISPLAY_DELAY_MS(10);
|
||||
|
||||
SH8601A_Init_Pre_OTP();
|
||||
}
|
||||
|
||||
void sh8601z_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e)
|
||||
{
|
||||
uint8_t data[8];
|
||||
|
||||
x_s += 16;
|
||||
x_e += 16;
|
||||
|
||||
data[0] = 0x02;
|
||||
data[1] = 0x00;
|
||||
data[2] = 0x2A;
|
||||
data[3] = 0x00;
|
||||
data[4] = x_s >> 8;
|
||||
data[5] = x_s & 0xff;
|
||||
data[6] = x_e >> 8;
|
||||
data[7] = x_e & 0xff;
|
||||
write_buff(data, 8);
|
||||
|
||||
data[0] = 0x02;
|
||||
data[1] = 0x00;
|
||||
data[2] = 0x2B;
|
||||
data[3] = 0x00;
|
||||
data[4] = y_s >> 8;
|
||||
data[5] = y_s & 0xff;
|
||||
data[6] = y_e >> 8;
|
||||
data[7] = y_e & 0xff;
|
||||
write_buff(data, 8);
|
||||
|
||||
// write_cmd(0x2c);
|
||||
}
|
||||
|
||||
void sh8601z_display(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
uint8_t frame_size;
|
||||
|
||||
if (pixel_width == 16) {
|
||||
frame_size = SPI_FRAME_SIZE_16BIT;
|
||||
}
|
||||
else if (pixel_width == 32) {
|
||||
frame_size = SPI_FRAME_SIZE_24BIT;
|
||||
}
|
||||
spi_display_handle.Init.Frame_Size = frame_size;
|
||||
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_display_handle.MultWireParam.Instruct = 0x32;
|
||||
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_display_handle.MultWireParam.Address = 0x002C00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
spi_master_transmit_X2X4X8(&spi_display_handle, data, pixel_count);
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
|
||||
}
|
||||
|
||||
void sh8601z_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data)
|
||||
{
|
||||
//#define USE_DMA_LINK_MODE
|
||||
uint8_t spi_trans_width;
|
||||
uint32_t dma_sample_count;
|
||||
|
||||
#ifdef USE_DMA_LINK_MODE
|
||||
#define DMA_SINGLE_TRANSFER_SIZE 20000
|
||||
uint32_t link_count;
|
||||
uint32_t i;
|
||||
uint32_t link_trans_size;
|
||||
dma_LinkParameter_t LinkParameter;
|
||||
|
||||
|
||||
switch (dma_display_handle.Init.Source_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
dma_sample_count = pixel_count * pixel_width / 32;
|
||||
link_trans_size = 4 * DMA_SINGLE_TRANSFER_SIZE;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
dma_sample_count = pixel_count * pixel_width / 16;
|
||||
link_trans_size = 2 * DMA_SINGLE_TRANSFER_SIZE;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
dma_sample_count = pixel_count * pixel_width / 8;
|
||||
link_trans_size = DMA_SINGLE_TRANSFER_SIZE;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
link_count = dma_sample_count / DMA_SINGLE_TRANSFER_SIZE;
|
||||
if(dma_sample_count % DMA_SINGLE_TRANSFER_SIZE)
|
||||
{
|
||||
link_count++;
|
||||
}
|
||||
|
||||
for (i = 0; i < link_count; i++)
|
||||
{
|
||||
uint8_t all_set = (dma_sample_count <= DMA_SINGLE_TRANSFER_SIZE);
|
||||
|
||||
LinkParameter.SrcAddr = (uint32_t)data + i * link_trans_size;
|
||||
LinkParameter.DstAddr = (uint32_t)&spi_display_handle.SPIx->DR;
|
||||
if(all_set)
|
||||
{
|
||||
LinkParameter.NextLink = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
LinkParameter.NextLink = (uint32_t)&Link_Channel[i + 1];
|
||||
}
|
||||
LinkParameter.Data_Flow = dma_display_handle.Init.Data_Flow;
|
||||
LinkParameter.Request_ID = dma_display_handle.Init.Request_ID;
|
||||
LinkParameter.Source_Master_Sel = dma_display_handle.Init.Source_Master_Sel;
|
||||
LinkParameter.Desination_Master_Sel = dma_display_handle.Init.Desination_Master_Sel;
|
||||
LinkParameter.Source_Inc = dma_display_handle.Init.Source_Inc;
|
||||
LinkParameter.Desination_Inc = dma_display_handle.Init.Desination_Inc;
|
||||
LinkParameter.Source_Width = dma_display_handle.Init.Source_Width;
|
||||
LinkParameter.Desination_Width = dma_display_handle.Init.Desination_Width;
|
||||
LinkParameter.Source_Burst_Len = dma_display_handle.Init.Source_Burst_Len;
|
||||
LinkParameter.Desination_Burst_Len = dma_display_handle.Init.Desination_Burst_Len;
|
||||
LinkParameter.Size = all_set ? dma_sample_count : DMA_SINGLE_TRANSFER_SIZE;
|
||||
LinkParameter.gather_enable = 0;
|
||||
LinkParameter.scatter_enable = 0;
|
||||
dma_sample_count -= DMA_SINGLE_TRANSFER_SIZE;
|
||||
|
||||
dma_linked_list_init(&Link_Channel[i], &LinkParameter);
|
||||
}
|
||||
#else
|
||||
switch (dma_display_handle.Init.Source_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
dma_sample_count = pixel_count * pixel_width / 32;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
dma_sample_count = pixel_count * pixel_width / 16;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
dma_sample_count = pixel_count * pixel_width / 8;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (dma_display_handle.Init.Desination_Width) {
|
||||
case DMA_TRANSFER_WIDTH_32:
|
||||
spi_trans_width = SPI_FRAME_SIZE_32BIT;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_16:
|
||||
spi_trans_width = SPI_FRAME_SIZE_16BIT;
|
||||
break;
|
||||
case DMA_TRANSFER_WIDTH_8:
|
||||
spi_trans_width = SPI_FRAME_SIZE_8BIT;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
spi_display_handle.Init.Frame_Size = spi_trans_width;
|
||||
spi_display_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_display_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_display_handle.MultWireParam.Instruct = 0x32;
|
||||
spi_display_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_display_handle.MultWireParam.Address = 0x002C00;
|
||||
|
||||
__DISPLAY_CS_CLEAR();
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
__SPI_ENABLE(spi_display_handle.SPIx);
|
||||
spi_master_transmit_X2X4X8_DMA(&spi_display_handle);
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
if (spi_trans_width == SPI_FRAME_SIZE_32BIT) {
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_2143);
|
||||
}
|
||||
else {
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
}
|
||||
__SPI_ENABLE(spi_display_handle.SPIx);
|
||||
#ifndef USE_DMA_LINK_MODE
|
||||
dma_start_IT(&dma_display_handle, (uint32_t)data, (uint32_t)&spi_display_handle.SPIx->DR, dma_sample_count);
|
||||
#else
|
||||
dma_linked_list_start_IT(Link_Channel, &LinkParameter, &dma_display_handle);
|
||||
#endif
|
||||
}
|
||||
|
||||
void sh8601z_power_off(void)
|
||||
{
|
||||
SH8601A_Power_Off();
|
||||
|
||||
__DISPLAY_DELAY_MS(100);
|
||||
__DISPLAY_RESET_CLEAR();
|
||||
__DISPLAY_DELAY_MS(10);
|
||||
__DISPLAY_VCI_CLEAR();
|
||||
}
|
||||
|
||||
void sh8601z_power_on(void)
|
||||
{
|
||||
__DISPLAY_VCI_CLEAR();
|
||||
__DISPLAY_RESET_CLEAR();
|
||||
__DISPLAY_DELAY_MS(10);
|
||||
__DISPLAY_VCI_SET();
|
||||
__DISPLAY_DELAY_MS(10);
|
||||
__DISPLAY_RESET_SET();
|
||||
__DISPLAY_DELAY_MS(10);
|
||||
|
||||
SH8601A_Init_Pre_OTP();
|
||||
}
|
||||
|
||||
void sh8601z_display_dma_isr(void)
|
||||
{
|
||||
while(__SPI_IS_BUSY(spi_display_handle.SPIx));
|
||||
|
||||
// CS Release
|
||||
__DISPLAY_CS_SET();
|
||||
|
||||
/* Clear Transfer complete status */
|
||||
dma_clear_tfr_Status(&dma_display_handle);
|
||||
/* channel Transfer complete interrupt disable */
|
||||
dma_tfr_interrupt_disable(&dma_display_handle);
|
||||
|
||||
__SPI_DISABLE(spi_display_handle.SPIx);
|
||||
__SPI_TX_ENDIAN_SET(spi_display_handle.SPIx, TX_RX_Endian_4321);
|
||||
__SPI_DATA_FRAME_SIZE(spi_display_handle.SPIx, SPI_FRAME_SIZE_8BIT);
|
||||
}
|
20
MCU/components/drivers/bsp/display/driver_sh8601z.h
Normal file
20
MCU/components/drivers/bsp/display/driver_sh8601z.h
Normal file
@ -0,0 +1,20 @@
|
||||
#ifndef __DRIVER_SH8601A_H
|
||||
#define __DRIVER_SH8601A_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void sh8601z_init(void);
|
||||
|
||||
void sh8601z_set_window(uint16_t x_s, uint16_t x_e, uint16_t y_s, uint16_t y_e);
|
||||
|
||||
void sh8601z_display(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
void sh8601z_display_dma(uint32_t pixel_count, uint8_t pixel_width, void *data);
|
||||
|
||||
void sh8601z_power_off(void);
|
||||
|
||||
void sh8601z_power_on(void);
|
||||
|
||||
void sh8601z_display_dma_isr(void);
|
||||
|
||||
#endif // __DRIVER_SH8601A_H
|
1032
MCU/components/drivers/bsp/display/driver_st7701_rgb.c
Normal file
1032
MCU/components/drivers/bsp/display/driver_st7701_rgb.c
Normal file
File diff suppressed because it is too large
Load Diff
139
MCU/components/drivers/bsp/display/driver_st7701_rgb.h
Normal file
139
MCU/components/drivers/bsp/display/driver_st7701_rgb.h
Normal file
@ -0,0 +1,139 @@
|
||||
|
||||
#ifndef __DRIVER_ST7701_RGB_H__
|
||||
#define __DRIVER_ST7701_RGB_H__
|
||||
|
||||
#include "fr30xx.h"
|
||||
#include "app_config.h"
|
||||
|
||||
#define RGB_ROW 480
|
||||
#define RGB_COLUMN 480
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t VerticalSignalCount;
|
||||
|
||||
unsigned char *rgb_TxData;
|
||||
|
||||
}struct_RGB_TypeDef_t;
|
||||
|
||||
#define RGB565_LCD_DCLK_PORT GPIOB
|
||||
#define RGB565_LCD_DCLK_GPIO GPIO_PIN_13
|
||||
|
||||
#define RGB565_LCD_VSYNC_PORT GPIOB
|
||||
#define RGB565_LCD_VSYNC_GPIO GPIO_PIN_14
|
||||
|
||||
#define RGB565_LCD_HSYNC_PORT GPIOB
|
||||
#define RGB565_LCD_HSYNC_GPIO GPIO_PIN_15
|
||||
|
||||
#define RGB565_LCD_DISP_PORT GPIOA
|
||||
#define RGB565_LCD_DISP_GPIO GPIO_PIN_6
|
||||
|
||||
#define RGB565_LCD_DE_EN_PORT GPIOB
|
||||
#define RGB565_LCD_DE_EN_GPIO GPIO_PIN_12
|
||||
|
||||
#define RGB565_LCD_DATA_PORT GPIOC
|
||||
#define RGB565_LCD_DATA_GPIO 0xFFFF //GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
|
||||
|
||||
#define RGB565_LCD_RESET_PORT GPIOD
|
||||
#define RGB565_LCD_RESET_GPIO GPIO_PIN_13
|
||||
|
||||
#define RGB565_LCD_BACKLIGHT_PORT GPIOA
|
||||
#define RGB565_LCD_BACKLIGHT_GPIO GPIO_PIN_6
|
||||
|
||||
|
||||
#ifdef RGB565_LCD_TE_EN
|
||||
#define RGB565_LCD_TE_PORT GPIO_B
|
||||
#define RGB565_LCD_TE_GPIO GPIO_PIN_7
|
||||
#endif
|
||||
|
||||
#define RGB56_LCD_INIT_CONFIG
|
||||
|
||||
#ifdef RGB56_LCD_INIT_CONFIG
|
||||
#define RGB565_LCD_SPI_CS_PORT GPIOD
|
||||
#define RGB565_LCD_SPI_CS_GPIO GPIO_PIN_12
|
||||
|
||||
#define RGB565_LCD_SPI_CLK_PORT GPIOB
|
||||
#define RGB565_LCD_SPI_CLK_GPIO GPIO_PIN_0
|
||||
|
||||
#define RGB565_LCD_SPI_MOSI_PORT GPIOB
|
||||
#define RGB565_LCD_SPI_MOSI_GPIO GPIO_PIN_2
|
||||
|
||||
#define RGB565_LCD_SPI_MISO_PORT GPIOB
|
||||
#define RGB565_LCD_SPI_MISO_GPIO GPIO_PIN_3
|
||||
|
||||
#define RGB565_LCD_SPI_SEL SPIM0
|
||||
|
||||
#define rgb_spi_cs_set() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_CLEAR)
|
||||
#define rgb_spi_cs_release() gpio_write_pin(RGB565_LCD_SPI_CS_PORT,RGB565_LCD_SPI_CS_GPIO,GPIO_PIN_SET)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/* signal drive*/
|
||||
#define rgb_lcd_enable_set() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_enable_release() gpio_write_pin(RGB565_LCD_DE_EN_PORT,RGB565_LCD_DE_EN_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_vsync_set() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_vsync_release() gpio_write_pin(RGB565_LCD_VSYNC_PORT,RGB565_LCD_VSYNC_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_hsync_set() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_hsync_release() gpio_write_pin(RGB565_LCD_HSYNC_PORT,RGB565_LCD_HSYNC_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_reset_set() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_reset_release() gpio_write_pin(RGB565_LCD_RESET_PORT,RGB565_LCD_RESET_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_disp_set() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_disp_release() gpio_write_pin(RGB565_LCD_DISP_PORT,RGB565_LCD_DISP_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
#define rgb_lcd_backlight_set() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_SET)
|
||||
#define rgb_lcd_backlight_release() gpio_write_pin(RGB565_LCD_BACKLIGHT_PORT,RGB565_LCD_BACKLIGHT_GPIO,GPIO_PIN_CLEAR)
|
||||
|
||||
|
||||
#define __RGB_LCD_DENABLE_SET rgb_lcd_enable_release
|
||||
#define __RGB_LCD_DENABLE_RELEASE rgb_lcd_enable_set
|
||||
|
||||
#define __RGB_LCD_VSYNC_SET rgb_lcd_vsync_set
|
||||
#define __RGB_LCD_VSYNC__RELEASE rgb_lcd_vsync_release
|
||||
|
||||
#define __RGB_LCD_HSYNC_SET rgb_lcd_hsync_set
|
||||
#define __RGB_LCD_HSYNC__RELEASE rgb_lcd_hsync_release
|
||||
|
||||
#define __RGB_LCD_RESET_SET rgb_lcd_reset_set
|
||||
#define __RGB_LCD_RESET_RELEASE rgb_lcd_reset_release
|
||||
|
||||
#define __RGB_SPI_CS_RELEASE rgb_spi_cs_release
|
||||
#define __RGB_SPI_CS_SET rgb_spi_cs_set
|
||||
|
||||
#define __8080_DATA_WR_LEN(__LEVEL__) __PARALLEL_SET_WR_LEN(hparallel.PARALLELx,__LEVEL__)
|
||||
#define __8080_TXFIFO_EMPTY() __PARALLEL_INT_STATUS(hparallel.PARALLELx)&INT_TXFIFO_EMPTY
|
||||
#define __8080_WRITE_BLANK() hparallel.PARALLELx->TX_FIFO = 0
|
||||
|
||||
#define __TIMER_CLEAR_IQR(__TIMERx__) timer_int_clear(__TIMERx__)
|
||||
#define __TIMER_INIT(__TIMERx__, __LoadCount__) timer_init(__TIMERx__, (24000 * __LoadCount__))
|
||||
#define __TIMER_INT_ENABLE(__TIMERx__) timer_int_enable(__TIMERx__)
|
||||
#define __TIMER_START(__TIMERx__) timer_start(__TIMERx__)
|
||||
|
||||
#define __DMA_GET_TFR_STATUS() dma_get_tfr_Status(&dma_handle)
|
||||
#define __DMA_CLEAR_TFR_STATUS() dma_clear_tfr_Status(&dma_handle)
|
||||
#define __DMA_TO_8080_START_IT(__BUFFER__,__SIZE__) dma_start_IT(&dma_handle, (uint32_t)__BUFFER__, (uint32_t)&hparallel.PARALLELx->TX_FIFO, __SIZE__)
|
||||
|
||||
#define __SPI_WRITE_DATA(__BUFFER__, __SIZE__) spi_master_transmit_X1(&spi_handle, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
|
||||
/* rgb_display_start */
|
||||
/* rgb_timer_IRQHandler */
|
||||
/* rgb_dma_IRQHandler */
|
||||
void rgb_display_start(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb, uint32_t fps, unsigned char *Imagedata);
|
||||
void rgb_timer_IRQHandler(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb);
|
||||
void rgb_dma_IRQHandler(struct_RGB_TypeDef_t *hrgb);
|
||||
|
||||
void st7701_init(void* buffer);
|
||||
void st7701_rgb_display_dma_irq(void);
|
||||
|
||||
__RAM_CODE void rgb_display_dma_irq(void);
|
||||
|
||||
|
||||
#endif
|
350
MCU/components/drivers/bsp/psram/driver_psram.c
Normal file
350
MCU/components/drivers/bsp/psram/driver_psram.c
Normal file
@ -0,0 +1,350 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file driver_flash.c
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2021
|
||||
* @brief Internal XIP Flash module driver.
|
||||
* This file provides firmware functions to manage the internal
|
||||
* stacked xip flash
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2022 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "fr30xx.h"
|
||||
|
||||
#include "driver_psram.h"
|
||||
|
||||
#include "co_util.h"
|
||||
|
||||
#define PSRAM_ENABLE_Q_MODE 1
|
||||
|
||||
#define PSRAM_LATENCY_CFG 3
|
||||
#define PSRAM_HIGH_SPEED 1
|
||||
#define PSRAM_OSPI_IF OSPI
|
||||
|
||||
#define PSRAM_READ_IDENTIFICATION 0x9F
|
||||
|
||||
#define PSRAM_READ_OPCODE 0x03
|
||||
#define PSRAM_FAST_READ_OPCODE 0x0B
|
||||
#define PSRAM_FAST_QUAL_READ_OPCODE 0xEB
|
||||
|
||||
#define PSRAM_PAGE_PROGRAM_OPCODE 0x02
|
||||
#define PSRAM_PAGE_QUAL_PROGRAM_OPCODE 0x38
|
||||
|
||||
#define PSRAM_ENTER_QUAD_MODE_OPCODE 0x35
|
||||
#define PSRAM_EXIT_QUAD_MODE_OPCODE 0xF5
|
||||
|
||||
#define PSRAM_RESET_ENABLE_OPCODE 0x66
|
||||
#define PSRAM_RESET_OPCODE 0x99
|
||||
|
||||
static const struct qspi_stig_reg_t psram_read_ctrl_cmd = {
|
||||
.enable_bank = 0,
|
||||
.dummy_cycles = PSRAM_LATENCY_CFG-1,
|
||||
.write_bytes = 0,
|
||||
.enable_write = 0,
|
||||
.addr_bytes = QSPI_STIG_ADDR_BYTES_4,
|
||||
.enable_mode = 0,
|
||||
.enable_cmd_addr = 1,
|
||||
.read_bytes = 2,
|
||||
.enable_read = 1,
|
||||
.opcode = 0x40,
|
||||
};
|
||||
|
||||
static const struct qspi_stig_reg_t psram_write_ctrl_cmd = {
|
||||
.enable_bank = 0,
|
||||
.dummy_cycles = 0,
|
||||
.write_bytes = 2,
|
||||
.enable_write = 1,
|
||||
.addr_bytes = QSPI_STIG_ADDR_BYTES_4,
|
||||
.enable_mode = 0,
|
||||
.enable_cmd_addr = 1,
|
||||
.read_bytes = 0,
|
||||
.enable_read = 0,
|
||||
.opcode = 0xC0,
|
||||
};
|
||||
|
||||
static const struct qspi_stig_reg_t psram_read_id_cmd = {
|
||||
.enable_bank = 0,
|
||||
.dummy_cycles = 0,
|
||||
.write_bytes = 0,
|
||||
.enable_write = 0,
|
||||
.addr_bytes = 0,
|
||||
.enable_mode = 0,
|
||||
.enable_cmd_addr = 0,
|
||||
.read_bytes = 3,
|
||||
.enable_read = 1,
|
||||
.opcode = PSRAM_READ_IDENTIFICATION,
|
||||
};
|
||||
|
||||
static const struct qspi_stig_reg_t enter_quad_mode_cmd = {
|
||||
.enable_bank = 0,
|
||||
.dummy_cycles = 0,
|
||||
.write_bytes = 0,
|
||||
.enable_write = 0,
|
||||
.addr_bytes = 0,
|
||||
.enable_mode = 0,
|
||||
.enable_cmd_addr = 0,
|
||||
.read_bytes = 0,
|
||||
.enable_read = 0,
|
||||
.opcode = PSRAM_ENTER_QUAD_MODE_OPCODE,
|
||||
};
|
||||
|
||||
static const struct qspi_stig_reg_t reset_enable_cmd = {
|
||||
.enable_bank = 0,
|
||||
.dummy_cycles = 0,
|
||||
.write_bytes = 0,
|
||||
.enable_write = 0,
|
||||
.addr_bytes = 0,
|
||||
.enable_mode = 0,
|
||||
.enable_cmd_addr = 0,
|
||||
.read_bytes = 0,
|
||||
.enable_read = 0,
|
||||
.opcode = PSRAM_RESET_ENABLE_OPCODE,
|
||||
};
|
||||
|
||||
static const struct qspi_stig_reg_t reset_cmd = {
|
||||
.enable_bank = 0,
|
||||
.dummy_cycles = 0,
|
||||
.write_bytes = 0,
|
||||
.enable_write = 0,
|
||||
.addr_bytes = 0,
|
||||
.enable_mode = 0,
|
||||
.enable_cmd_addr = 0,
|
||||
.read_bytes = 0,
|
||||
.enable_read = 0,
|
||||
.opcode = PSRAM_RESET_OPCODE,
|
||||
};
|
||||
|
||||
static uint8_t psram_read_mode(uint8_t mode)
|
||||
{
|
||||
uint8_t result[2];
|
||||
|
||||
__QSPI_CMD_ADDRESS_SET(PSRAM_OSPI_IF, mode);
|
||||
qspi_stig_cmd(PSRAM_OSPI_IF, psram_read_ctrl_cmd, QSPI_STIG_CMD_READ, 2, result);
|
||||
|
||||
return result[0];
|
||||
}
|
||||
|
||||
static void psram_write_mode(uint8_t mode, uint8_t data)
|
||||
{
|
||||
uint8_t buffer[2];
|
||||
|
||||
buffer[0] = data;
|
||||
buffer[1] = data;
|
||||
__QSPI_CMD_ADDRESS_SET(PSRAM_OSPI_IF, mode);
|
||||
qspi_stig_cmd(PSRAM_OSPI_IF, psram_write_ctrl_cmd, QSPI_STIG_CMD_WRITE, 2, buffer);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void psram_controller_init(uint16_t page_boundary)
|
||||
{
|
||||
while(__QSPI_IS_BUSY(PSRAM_OSPI_IF));
|
||||
|
||||
__QSPI_READ_OPCODE_SET(PSRAM_OSPI_IF, 0x20);
|
||||
__QSPI_READ_INSTRUCTION_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
|
||||
__QSPI_READ_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
|
||||
__QSPI_READ_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
|
||||
__QSPI_READ_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, (PSRAM_LATENCY_CFG<<1)-1);
|
||||
__QSPI_READ_MODE_ENABLE_SET(PSRAM_OSPI_IF, 0);
|
||||
__QSPI_MODE_BIT_SET(PSRAM_OSPI_IF, 0);
|
||||
|
||||
__QSPI_WRITE_OPCODE_SET(PSRAM_OSPI_IF, 0xA0);
|
||||
__QSPI_WRITE_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
|
||||
__QSPI_WRITE_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_OIO);
|
||||
__QSPI_WRITE_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, PSRAM_LATENCY_CFG-1);
|
||||
__QSPI_WRITE_WEL_DISABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_POLL_DISABLE(PSRAM_OSPI_IF);
|
||||
|
||||
//init configuration register
|
||||
__QSPI_CFG_CPOL_SET(PSRAM_OSPI_IF, 0);
|
||||
__QSPI_CFG_CPHA_SET(PSRAM_OSPI_IF, 0);
|
||||
__QSPI_CFG_DAC_ENABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CFG_LEGACY_DISABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CFG_REMAP_ENABLE(PSRAM_OSPI_IF);
|
||||
#if PSRAM_HIGH_SPEED
|
||||
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_6);
|
||||
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 0);
|
||||
#else
|
||||
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_16);
|
||||
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 0);
|
||||
#endif
|
||||
|
||||
// __QSPI_CFG_AHB_DECODER_ENABLE(PSRAM_OSPI_IF);
|
||||
|
||||
__QSPI_READ_CAPTURE_LP_CLK_EN(PSRAM_OSPI_IF);
|
||||
__QSPI_DELAY_CS_START_SET(PSRAM_OSPI_IF, 2);
|
||||
__QSPI_DELAY_CS_END_SET(PSRAM_OSPI_IF, 2);
|
||||
__QSPI_DELAY_CS_DESSERT_SET(PSRAM_OSPI_IF, 2);
|
||||
|
||||
__QSPI_DEVICE_PAGE_SIZE_SET(PSRAM_OSPI_IF, page_boundary);
|
||||
// __QSPI_DEVICE_CS0_SIZE_SET(PSRAM_OSPI_IF, 3); // 4Gb space
|
||||
|
||||
__QSPI_CS_CTRL_RD_BRK_ENABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CS_CTRL_DIS_CS_AFT_FIRST_BYTE_SET(PSRAM_OSPI_IF);
|
||||
__QSPI_CS_PAGE_BOUNDARY_SET(PSRAM_OSPI_IF, page_boundary);
|
||||
__QSPI_CS_PAGE_BOUNDARY_PROTECT_ENABLE(PSRAM_OSPI_IF);
|
||||
|
||||
// __QSPI_REMAP_ADDRESS_SET(PSRAM_OSPI_IF, PSRAM_DAC_BASE);
|
||||
|
||||
__QSPI_DEVICE_ADDR_BYTES_SET(PSRAM_OSPI_IF, QSPI_DEVICE_ADDR_BYTES_4);
|
||||
__QSPI_CFG_DTR_ENABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CFG_OCTAL_XCCELA_ENABLE(PSRAM_OSPI_IF);
|
||||
|
||||
__QSPI_ENABLE(PSRAM_OSPI_IF);
|
||||
}
|
||||
|
||||
void psram_init(void)
|
||||
{
|
||||
// uint8_t mode[7];
|
||||
uint8_t value;
|
||||
|
||||
#if PSRAM_HIGH_SPEED
|
||||
psram_controller_init(0x0040);
|
||||
#else
|
||||
psram_controller_init(0x0008);
|
||||
#endif
|
||||
|
||||
value = (1<<5) | ((PSRAM_LATENCY_CFG-3)<<2) | (0<<0);
|
||||
psram_write_mode(0x00, value);
|
||||
#if PSRAM_LATENCY_CFG == 3
|
||||
value = (0<<5);
|
||||
#elif PSRAM_LATENCY_CFG == 4
|
||||
value = (4<<5);
|
||||
#elif PSRAM_LATENCY_CFG == 5
|
||||
value = (2<<5);
|
||||
#elif PSRAM_LATENCY_CFG == 6
|
||||
value = (6<<5);
|
||||
#elif PSRAM_LATENCY_CFG == 7
|
||||
value = (1<<5);
|
||||
#else
|
||||
#error "UNACCEPTABLE configure"
|
||||
#endif
|
||||
|
||||
printf("write 0x%02x to mode reg4.\r\n", value);
|
||||
psram_write_mode(0x04, value);
|
||||
co_delay_100us(1);
|
||||
|
||||
// mode[0] = psram_read_mode(0x00);
|
||||
// printf("mode 0: 0x%02x\r\n", mode[0]);
|
||||
// mode[1] = psram_read_mode(0x01);
|
||||
// printf("mode 1: 0x%02x\r\n", mode[1]);
|
||||
// mode[2] = psram_read_mode(0x02);
|
||||
// printf("mode 2: 0x%02x\r\n", mode[2]);
|
||||
// mode[3] = psram_read_mode(0x03);
|
||||
// printf("mode 3: 0x%02x\r\n", mode[3]);
|
||||
// mode[4] = psram_read_mode(0x04);
|
||||
// printf("mode 4: 0x%02x\r\n", mode[4]);
|
||||
// mode[5] = psram_read_mode(0x06);
|
||||
// printf("mode 6: 0x%02x\r\n", mode[5]);
|
||||
// mode[6] = psram_read_mode(0x08);
|
||||
// printf("mode 8: 0x%02x\r\n", mode[6]);
|
||||
}
|
||||
#else
|
||||
static void psram_enter_quad(void)
|
||||
{
|
||||
qspi_stig_cmd(PSRAM_OSPI_IF, enter_quad_mode_cmd, QSPI_STIG_CMD_EXE, 0, NULL);
|
||||
}
|
||||
|
||||
static void psram_controller_init(uint16_t page_boundary)
|
||||
{
|
||||
while(__QSPI_IS_BUSY(PSRAM_OSPI_IF));
|
||||
|
||||
#if PSRAM_ENABLE_Q_MODE == 1
|
||||
__QSPI_READ_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_FAST_READ_OPCODE);
|
||||
__QSPI_READ_INSTRUCTION_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_READ_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_READ_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_READ_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 4);
|
||||
__QSPI_READ_MODE_ENABLE_SET(PSRAM_OSPI_IF, 0);
|
||||
__QSPI_MODE_BIT_SET(PSRAM_OSPI_IF, 0);
|
||||
|
||||
__QSPI_WRITE_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_PAGE_QUAL_PROGRAM_OPCODE);
|
||||
__QSPI_WRITE_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_WRITE_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_WRITE_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 0);
|
||||
#else
|
||||
__QSPI_READ_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_FAST_QUAL_READ_OPCODE);
|
||||
__QSPI_READ_INSTRUCTION_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_STAND);
|
||||
__QSPI_READ_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_READ_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_READ_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 6);
|
||||
__QSPI_READ_MODE_ENABLE_SET(PSRAM_OSPI_IF, 0);
|
||||
__QSPI_MODE_BIT_SET(PSRAM_OSPI_IF, 0);
|
||||
|
||||
__QSPI_WRITE_OPCODE_SET(PSRAM_OSPI_IF, PSRAM_PAGE_QUAL_PROGRAM_OPCODE);
|
||||
__QSPI_WRITE_ADDRESS_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_WRITE_DATA_TYPE_SET(PSRAM_OSPI_IF, QSPI_WIRE_TYPE_QIO);
|
||||
__QSPI_WRITE_DUMMY_CYCLES_SET(PSRAM_OSPI_IF, 0);
|
||||
#endif
|
||||
|
||||
//init configuration register
|
||||
__QSPI_CFG_CPOL_SET(PSRAM_OSPI_IF, 0);
|
||||
__QSPI_CFG_CPHA_SET(PSRAM_OSPI_IF, 0);
|
||||
__QSPI_CFG_DAC_ENABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CFG_LEGACY_DISABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CFG_REMAP_ENABLE(PSRAM_OSPI_IF);
|
||||
#if PSRAM_HIGH_SPEED
|
||||
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_2);
|
||||
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 4);
|
||||
#else
|
||||
__QSPI_CFG_BAUDRATE_SET(PSRAM_OSPI_IF, QSPI_BAUDRATE_DIV_8);
|
||||
__QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, 0);
|
||||
#endif
|
||||
|
||||
// __QSPI_CFG_AHB_DECODER_ENABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_WRITE_WEL_DISABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_POLL_DISABLE(PSRAM_OSPI_IF);
|
||||
|
||||
__QSPI_READ_CAPTURE_LP_CLK_EN(PSRAM_OSPI_IF);
|
||||
__QSPI_DELAY_CS_START_SET(PSRAM_OSPI_IF, 2);
|
||||
__QSPI_DELAY_CS_END_SET(PSRAM_OSPI_IF, 2);
|
||||
__QSPI_DELAY_CS_DESSERT_SET(PSRAM_OSPI_IF, 2);
|
||||
|
||||
__QSPI_DEVICE_PAGE_SIZE_SET(PSRAM_OSPI_IF, page_boundary);
|
||||
// __QSPI_DEVICE_CS0_SIZE_SET(PSRAM_OSPI_IF, 3); // 4Gb space
|
||||
|
||||
__QSPI_CS_CTRL_RD_BRK_ENABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CS_CTRL_DIS_CS_AFT_FIRST_BYTE_SET(PSRAM_OSPI_IF);
|
||||
__QSPI_CS_PAGE_BOUNDARY_SET(PSRAM_OSPI_IF, page_boundary);
|
||||
__QSPI_CS_PAGE_BOUNDARY_PROTECT_ENABLE(PSRAM_OSPI_IF);
|
||||
|
||||
__QSPI_REMAP_ADDRESS_SET(PSRAM_OSPI_IF, PSRAM_DAC_BASE);
|
||||
|
||||
__QSPI_CFG_OCTAL_OPI_DISABLE(PSRAM_OSPI_IF);
|
||||
__QSPI_CFG_OCTAL_XCCELA_DISABLE(PSRAM_OSPI_IF);
|
||||
|
||||
__QSPI_ENABLE(PSRAM_OSPI_IF);
|
||||
}
|
||||
|
||||
void psram_init(bool reset)
|
||||
{
|
||||
if (reset) {
|
||||
qspi_stig_cmd(PSRAM_OSPI_IF, reset_enable_cmd, QSPI_STIG_CMD_EXE, 0, NULL);
|
||||
// co_delay_10us(1000);
|
||||
qspi_stig_cmd(PSRAM_OSPI_IF, reset_cmd, QSPI_STIG_CMD_EXE, 0, NULL);
|
||||
// co_delay_10us(1000);
|
||||
#if PSRAM_ENABLE_Q_MODE == 1
|
||||
psram_enter_quad();
|
||||
// co_delay_10us(1000);
|
||||
#endif // PSRAM_ENABLE_Q_MODE == 1
|
||||
}
|
||||
|
||||
#if PSRAM_HIGH_SPEED
|
||||
psram_controller_init(0x0040);
|
||||
#else
|
||||
psram_controller_init(0x0010);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint32_t psram_read_id(void)
|
||||
{
|
||||
uint32_t psram_id;
|
||||
qspi_stig_cmd(PSRAM_OSPI_IF, psram_read_id_cmd, QSPI_STIG_CMD_READ, 3, (uint8_t *)&psram_id);
|
||||
return (psram_id&0xffffff);
|
||||
}
|
||||
#endif
|
||||
|
40
MCU/components/drivers/bsp/psram/driver_psram.h
Normal file
40
MCU/components/drivers/bsp/psram/driver_psram.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file driver_psram.h
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2022
|
||||
* @brief Header file of PSRAM module.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2022 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
#ifndef __DRIVER_PSRAM_H__
|
||||
#define __DRIVER_PSRAM_H__
|
||||
|
||||
#include "fr30xx.h"
|
||||
|
||||
/*
|
||||
* @brief PSRAM Init structure definition
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32_t Reserve; /*!< reserve */
|
||||
} PSRAM_InitTypeDef;
|
||||
|
||||
/* ################################ Initialization、Config Section END ################################## */
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
|
||||
void psram_init(bool reset);
|
||||
|
||||
uint32_t psram_read_id(void);
|
||||
|
||||
#endif // __DRIVER_PSRAM_H__
|
463
MCU/components/drivers/bsp/rgb_565/rgb565.c
Normal file
463
MCU/components/drivers/bsp/rgb_565/rgb565.c
Normal file
@ -0,0 +1,463 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file rgb565.c
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2023
|
||||
* @brief rgb565 IC driver.
|
||||
* This file provides firmware functions to manage the following
|
||||
* functionalities of the 8080 SPI Timer and DMA norflash driver for rgb565.
|
||||
* @ Initialization and de-initialization functions
|
||||
* @ IO operation functions
|
||||
* @ Peripheral Control functions
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rgb565.h"
|
||||
#include "app_config.h"
|
||||
|
||||
#if BOARD_SEL == BOARD_EVB_FR3092E_RGB
|
||||
|
||||
#ifdef RGB56_LCD_INIT_CONFIG
|
||||
static void rgb_reg_writer(uint16_t *fp_data, uint32_t size)
|
||||
{
|
||||
__RGB_SPI_CS_SET();
|
||||
/* fp_Data[0] stores command, while others store data
|
||||
Bit8 set to 1 as data, otherwise it is a command
|
||||
*/
|
||||
for(int i = 1; i < size; i++)
|
||||
{
|
||||
fp_data[i] = fp_data[i] + 0x100;
|
||||
}
|
||||
|
||||
__SPI_WRITE_DATA(fp_data,size);
|
||||
|
||||
__RGB_SPI_CS_RELEASE();
|
||||
}
|
||||
#endif
|
||||
static void rgb_idle_clock(uint32_t count)
|
||||
{
|
||||
/* 8080 hits idle Clocks */
|
||||
__8080_DATA_WR_LEN(count);
|
||||
for(int i = 0; i < count/2; i++)
|
||||
__8080_WRITE_BLANK();
|
||||
}
|
||||
|
||||
static void Line_porch_set(uint32_t count)
|
||||
{
|
||||
for(int i = 0; i < count; i++)
|
||||
{
|
||||
__RGB_LCD_HSYNC__RELEASE();
|
||||
//__RGB_LCD_DENABLE_RELEASE();
|
||||
__RGB_LCD_DENABLE_SET();
|
||||
rgb_idle_clock(4);
|
||||
|
||||
__RGB_LCD_HSYNC_SET();
|
||||
rgb_idle_clock(RGB_ROW);
|
||||
}
|
||||
}
|
||||
|
||||
static void Vertical_back_porch_set(void)
|
||||
{
|
||||
__RGB_LCD_HSYNC__RELEASE();
|
||||
__RGB_LCD_DENABLE_SET();
|
||||
rgb_idle_clock(4);
|
||||
|
||||
__RGB_LCD_HSYNC_SET();
|
||||
|
||||
rgb_idle_clock(4);
|
||||
|
||||
while(!(__8080_TXFIFO_EMPTY()));
|
||||
}
|
||||
|
||||
static void Vertical_front_porch_set(void)
|
||||
{
|
||||
__RGB_LCD_HSYNC_SET();
|
||||
__RGB_LCD_DENABLE_SET();
|
||||
|
||||
rgb_idle_clock(4);
|
||||
|
||||
while(!(__8080_TXFIFO_EMPTY()));
|
||||
}
|
||||
|
||||
void rgb_init(void)
|
||||
{
|
||||
uint16_t WBuffer[20];
|
||||
|
||||
__RGB_LCD_RESET_RELEASE();
|
||||
system_delay_us(50 * 1000);
|
||||
__RGB_LCD_RESET_SET();
|
||||
system_delay_us(1000 * 120);
|
||||
|
||||
#ifdef RGB56_LCD_INIT_CONFIG
|
||||
WBuffer[0] = 0xFF;
|
||||
WBuffer[1] = 0x77;
|
||||
WBuffer[2] = 0x01;
|
||||
WBuffer[3] = 0x00;
|
||||
WBuffer[4] = 0x00;
|
||||
WBuffer[5] = 0x10;
|
||||
rgb_reg_writer(WBuffer, 6);
|
||||
|
||||
WBuffer[0] = 0xC0;
|
||||
WBuffer[1] = 0x3B;
|
||||
WBuffer[2] = 0x00;
|
||||
rgb_reg_writer(WBuffer, 3);
|
||||
|
||||
WBuffer[0] = 0xC1;
|
||||
WBuffer[1] = 0x10;
|
||||
WBuffer[2] = 0x0C;
|
||||
rgb_reg_writer(WBuffer, 3);
|
||||
|
||||
WBuffer[0] = 0xC2;
|
||||
WBuffer[1] = 0x21;
|
||||
WBuffer[2] = 0x0A;
|
||||
rgb_reg_writer(WBuffer, 3);
|
||||
|
||||
WBuffer[0] = 0xB0;
|
||||
WBuffer[1] = 0x40;
|
||||
WBuffer[2] = 0x09;
|
||||
WBuffer[3] = 0x4F;
|
||||
WBuffer[4] = 0x0B;
|
||||
WBuffer[5] = 0x10;
|
||||
WBuffer[6] = 0x07;
|
||||
WBuffer[7] = 0x00;
|
||||
WBuffer[8] = 0x08;
|
||||
WBuffer[9] = 0x06;
|
||||
WBuffer[10] = 0x20;
|
||||
WBuffer[11] = 0x02;
|
||||
WBuffer[12] = 0x12;
|
||||
WBuffer[13] = 0x0F;
|
||||
WBuffer[14] = 0x67;
|
||||
WBuffer[15] = 0x2E;
|
||||
WBuffer[16] = 0xDF;
|
||||
rgb_reg_writer(WBuffer, 17);
|
||||
|
||||
WBuffer[0] = 0xB1;
|
||||
WBuffer[1] = 0x4F;
|
||||
WBuffer[2] = 0x18;
|
||||
WBuffer[3] = 0x60;
|
||||
WBuffer[4] = 0x0E;
|
||||
WBuffer[5] = 0x10;
|
||||
WBuffer[6] = 0x04;
|
||||
WBuffer[7] = 0x0C;
|
||||
WBuffer[8] = 0x08;
|
||||
WBuffer[9] = 0x09;
|
||||
WBuffer[10] = 0x26;
|
||||
WBuffer[11] = 0x07;
|
||||
WBuffer[12] = 0x13;
|
||||
WBuffer[13] = 0x11;
|
||||
WBuffer[14] = 0x71;
|
||||
WBuffer[15] = 0x39;
|
||||
WBuffer[16] = 0xDF;
|
||||
rgb_reg_writer(WBuffer, 17);
|
||||
|
||||
WBuffer[0] = 0xFF;
|
||||
WBuffer[1] = 0x77;
|
||||
WBuffer[2] = 0x01;
|
||||
WBuffer[3] = 0x00;
|
||||
WBuffer[4] = 0x00;
|
||||
WBuffer[5] = 0x11;
|
||||
rgb_reg_writer(WBuffer, 6);
|
||||
|
||||
WBuffer[0] = 0xB0;
|
||||
WBuffer[1] = 0x4D;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xB1;
|
||||
WBuffer[1] = 0x41;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xB2;
|
||||
WBuffer[1] = 0x87;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xB3;
|
||||
WBuffer[1] = 0x80;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xB5;
|
||||
WBuffer[1] = 0x49;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xB7;
|
||||
WBuffer[1] = 0x87;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xB8;
|
||||
WBuffer[1] = 0x23;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xC0;
|
||||
WBuffer[1] = 0x07;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xC1;
|
||||
WBuffer[1] = 0x78;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xC2;
|
||||
WBuffer[1] = 0x78;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0xD0;
|
||||
WBuffer[1] = 0x88;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
system_delay_us(100 * 1000);
|
||||
|
||||
WBuffer[0] = 0xE0;
|
||||
WBuffer[1] = 0x00;
|
||||
WBuffer[2] = 0x00;
|
||||
WBuffer[3] = 0x00;
|
||||
WBuffer[4] = 0x00;
|
||||
rgb_reg_writer(WBuffer, 5);
|
||||
|
||||
WBuffer[0] = 0xE1;
|
||||
WBuffer[1] = 0x04;
|
||||
WBuffer[2] = 0xA0;
|
||||
WBuffer[3] = 0x06;
|
||||
WBuffer[4] = 0xA0;
|
||||
WBuffer[5] = 0x05;
|
||||
WBuffer[6] = 0xA0;
|
||||
WBuffer[7] = 0x07;
|
||||
WBuffer[8] = 0xA0;
|
||||
WBuffer[9] = 0x00;
|
||||
WBuffer[10] = 0x44;
|
||||
WBuffer[11] = 0x44;
|
||||
rgb_reg_writer(WBuffer, 12);
|
||||
|
||||
WBuffer[0] = 0xE2;
|
||||
WBuffer[1] = 0x11;
|
||||
WBuffer[2] = 0x11;
|
||||
WBuffer[3] = 0x44;
|
||||
WBuffer[4] = 0x44;
|
||||
WBuffer[5] = 0xE9;
|
||||
WBuffer[6] = 0xA0;
|
||||
WBuffer[7] = 0xEB;
|
||||
WBuffer[8] = 0xA0;
|
||||
WBuffer[9] = 0xEA;
|
||||
WBuffer[10] = 0xA0;
|
||||
WBuffer[11] = 0xEC;
|
||||
WBuffer[12] = 0xA0;
|
||||
WBuffer[13] = 0x00;
|
||||
rgb_reg_writer(WBuffer, 14);
|
||||
|
||||
WBuffer[0] = 0xE3;
|
||||
WBuffer[1] = 0x00;
|
||||
WBuffer[2] = 0x00;
|
||||
WBuffer[3] = 0x11;
|
||||
WBuffer[4] = 0x11;
|
||||
rgb_reg_writer(WBuffer, 5);
|
||||
|
||||
WBuffer[0] = 0xE4;
|
||||
WBuffer[1] = 0x44;
|
||||
WBuffer[2] = 0x44;
|
||||
rgb_reg_writer(WBuffer, 3);
|
||||
|
||||
WBuffer[0] = 0xE5;
|
||||
WBuffer[1] = 0x06;
|
||||
WBuffer[2] = 0xEA;
|
||||
WBuffer[3] = 0xA0;
|
||||
WBuffer[4] = 0xA0;
|
||||
WBuffer[5] = 0x08;
|
||||
WBuffer[6] = 0xEC;
|
||||
WBuffer[7] = 0xA0;
|
||||
WBuffer[8] = 0xA0;
|
||||
WBuffer[9] = 0x0A;
|
||||
WBuffer[10] = 0xEE;
|
||||
WBuffer[11] = 0xA0;
|
||||
WBuffer[12] = 0xA0;
|
||||
WBuffer[13] = 0x0C;
|
||||
WBuffer[14] = 0xF0;
|
||||
WBuffer[15] = 0xA0;
|
||||
WBuffer[16] = 0xA0;
|
||||
rgb_reg_writer(WBuffer, 17);
|
||||
|
||||
WBuffer[0] = 0xE6;
|
||||
WBuffer[1] = 0x00;
|
||||
WBuffer[2] = 0x00;
|
||||
WBuffer[3] = 0x11;
|
||||
WBuffer[4] = 0x11;
|
||||
rgb_reg_writer(WBuffer, 5);
|
||||
|
||||
WBuffer[0] = 0xE7;
|
||||
WBuffer[1] = 0x44;
|
||||
WBuffer[2] = 0x44;
|
||||
rgb_reg_writer(WBuffer, 3);
|
||||
|
||||
WBuffer[0] = 0xE8;
|
||||
WBuffer[1] = 0x07;
|
||||
WBuffer[2] = 0xEB;
|
||||
WBuffer[3] = 0xA0;
|
||||
WBuffer[4] = 0xA0;
|
||||
WBuffer[5] = 0x09;
|
||||
WBuffer[6] = 0xED;
|
||||
WBuffer[7] = 0xA0;
|
||||
WBuffer[8] = 0xA0;
|
||||
WBuffer[9] = 0x0B;
|
||||
WBuffer[10] = 0xEF;
|
||||
WBuffer[11] = 0xA0;
|
||||
WBuffer[12] = 0xA0;
|
||||
WBuffer[13] = 0x0D;
|
||||
WBuffer[14] = 0xF1;
|
||||
WBuffer[15] = 0xA0;
|
||||
WBuffer[16] = 0xA0;
|
||||
rgb_reg_writer(WBuffer, 17);
|
||||
|
||||
WBuffer[0] = 0xE9;
|
||||
WBuffer[1] = 0x36;
|
||||
WBuffer[2] = 0x00;
|
||||
rgb_reg_writer(WBuffer, 3);
|
||||
|
||||
WBuffer[0] = 0xEB;
|
||||
WBuffer[1] = 0x00;
|
||||
WBuffer[2] = 0x00;
|
||||
WBuffer[3] = 0x4E;
|
||||
WBuffer[4] = 0x4E;
|
||||
WBuffer[5] = 0xEE;
|
||||
WBuffer[6] = 0x44;
|
||||
WBuffer[7] = 0x40;
|
||||
rgb_reg_writer(WBuffer, 8);
|
||||
|
||||
WBuffer[0] = 0xED;
|
||||
WBuffer[1] = 0xFF;
|
||||
WBuffer[2] = 0xFF;
|
||||
WBuffer[3] = 0x76;
|
||||
WBuffer[4] = 0x54;
|
||||
WBuffer[5] = 0xC1;
|
||||
WBuffer[6] = 0x0F;
|
||||
WBuffer[7] = 0xB2;
|
||||
WBuffer[8] = 0x3F;
|
||||
WBuffer[9] = 0x32;
|
||||
WBuffer[10] = 0xBF;
|
||||
WBuffer[11] = 0x01;
|
||||
WBuffer[12] = 0xC4;
|
||||
WBuffer[13] = 0x56;
|
||||
WBuffer[14] = 0x7F;
|
||||
WBuffer[15] = 0xFF;
|
||||
WBuffer[16] = 0xFF;
|
||||
rgb_reg_writer(WBuffer, 17);
|
||||
|
||||
WBuffer[0] = 0xFF;
|
||||
WBuffer[1] = 0x77;
|
||||
WBuffer[2] = 0x01;
|
||||
WBuffer[3] = 0x00;
|
||||
WBuffer[4] = 0x00;
|
||||
WBuffer[5] = 0x00;
|
||||
rgb_reg_writer(WBuffer, 6);
|
||||
|
||||
WBuffer[0] = 0x35;
|
||||
WBuffer[1] = 0x00;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0x36;
|
||||
WBuffer[1] = 0x00;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0x3A;
|
||||
WBuffer[1] = 0x66;
|
||||
rgb_reg_writer(WBuffer, 2);
|
||||
|
||||
WBuffer[0] = 0x11;
|
||||
rgb_reg_writer(WBuffer,1);
|
||||
|
||||
system_delay_us(200 * 1000);
|
||||
|
||||
WBuffer[0] = 0x29;
|
||||
rgb_reg_writer(WBuffer,1);
|
||||
#endif
|
||||
|
||||
system_delay_us(50 * 1000);
|
||||
}
|
||||
|
||||
void rgb_display_start(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb, uint32_t fps, unsigned char *Imagedata)
|
||||
{
|
||||
__TIMER_INIT(TIMERx, fps);
|
||||
__TIMER_INT_ENABLE(TIMERx);
|
||||
|
||||
hrgb->rgb_TxData = Imagedata;
|
||||
hrgb->VerticalSignalCount = 0;
|
||||
|
||||
__TIMER_START(TIMERx);
|
||||
}
|
||||
|
||||
volatile uint32_t time_cnt1=0;
|
||||
volatile uint32_t time_cnt2=0;
|
||||
extern uint32_t get_system_dwt_value();
|
||||
|
||||
void rgb_timer_IRQHandler(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb)
|
||||
{
|
||||
__TIMER_CLEAR_IQR(TIMERx);
|
||||
|
||||
/* If the previous frame is not completed ,return */
|
||||
if(hrgb->VerticalSignalCount != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//printf("t:%d\r\n",(get_system_dwt_value()-time_cnt1)/192);
|
||||
/* Vertical signal Start*/
|
||||
__RGB_LCD_VSYNC__RELEASE();
|
||||
Line_porch_set(4);
|
||||
__RGB_LCD_VSYNC_SET();
|
||||
Line_porch_set(8);
|
||||
|
||||
/* set Vertical back porch signal */
|
||||
Vertical_back_porch_set();
|
||||
|
||||
/* send First Row */
|
||||
__RGB_LCD_DENABLE_RELEASE();
|
||||
__8080_DATA_WR_LEN(RGB_ROW);
|
||||
|
||||
__DMA_TO_8080_START_IT(&hrgb->rgb_TxData[0], RGB_ROW / 2);
|
||||
time_cnt1 = get_system_dwt_value();
|
||||
|
||||
}
|
||||
|
||||
volatile uint8_t te_sign;
|
||||
|
||||
|
||||
void rgb_dma_IRQHandler(struct_RGB_TypeDef_t *hrgb)
|
||||
{
|
||||
if (__DMA_GET_TFR_STATUS())
|
||||
{
|
||||
__DMA_CLEAR_TFR_STATUS();
|
||||
|
||||
hrgb->VerticalSignalCount++;
|
||||
}
|
||||
|
||||
while(!(__8080_TXFIFO_EMPTY()));
|
||||
|
||||
/* Row *Column End of one frame transmission */
|
||||
if(hrgb->VerticalSignalCount == RGB_COLUMN) //12ms
|
||||
{
|
||||
te_sign = 0;
|
||||
hrgb->VerticalSignalCount = 0;
|
||||
|
||||
__RGB_LCD_VSYNC_SET();
|
||||
|
||||
Line_porch_set(8);
|
||||
|
||||
return;
|
||||
}
|
||||
// else if(hrgb->VerticalSignalCount == 360)
|
||||
else if(hrgb->VerticalSignalCount == 180)
|
||||
{
|
||||
te_sign = 1;
|
||||
}
|
||||
|
||||
/* set Vertical back porch signal and back porch signal */
|
||||
Vertical_front_porch_set();
|
||||
Vertical_back_porch_set();
|
||||
|
||||
/* send next Row */
|
||||
__RGB_LCD_DENABLE_RELEASE();
|
||||
__8080_DATA_WR_LEN(RGB_ROW);
|
||||
__DMA_TO_8080_START_IT(&hrgb->rgb_TxData[RGB_ROW * hrgb->VerticalSignalCount * 2], RGB_ROW / 2);
|
||||
}
|
||||
|
||||
#endif
|
76
MCU/components/drivers/bsp/rgb_565/rgb565.h
Normal file
76
MCU/components/drivers/bsp/rgb_565/rgb565.h
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file rgb565.h
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2023
|
||||
* @brief rgb565 Config header file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
#ifndef __RGB565_H__
|
||||
#define __RGB565_H__
|
||||
|
||||
#include "fr30xx.h"
|
||||
#include "driver_nv3047_rgb.h"
|
||||
|
||||
extern SPI_HandleTypeDef spi_handle;
|
||||
extern DMA_HandleTypeDef dma_handle;
|
||||
extern PARALLEL_HandTypeDef hparallel;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t VerticalSignalCount;
|
||||
|
||||
unsigned char *rgb_TxData;
|
||||
|
||||
}struct_RGB_TypeDef_t;
|
||||
|
||||
|
||||
|
||||
#define __RGB_LCD_DENABLE_SET rgb_lcd_enable_release
|
||||
#define __RGB_LCD_DENABLE_RELEASE rgb_lcd_enable_set
|
||||
|
||||
#define __RGB_LCD_VSYNC_SET rgb_lcd_vsync_set
|
||||
#define __RGB_LCD_VSYNC__RELEASE rgb_lcd_vsync_release
|
||||
|
||||
#define __RGB_LCD_HSYNC_SET rgb_lcd_hsync_set
|
||||
#define __RGB_LCD_HSYNC__RELEASE rgb_lcd_hsync_release
|
||||
|
||||
#define __RGB_LCD_RESET_SET rgb_lcd_reset_set
|
||||
#define __RGB_LCD_RESET_RELEASE rgb_lcd_reset_release
|
||||
|
||||
#define __RGB_SPI_CS_RELEASE rgb_spi_cs_release
|
||||
#define __RGB_SPI_CS_SET rgb_spi_cs_set
|
||||
|
||||
#define __8080_DATA_WR_LEN(__LEVEL__) __PARALLEL_SET_WR_LEN(hparallel.PARALLELx,__LEVEL__)
|
||||
#define __8080_TXFIFO_EMPTY() __PARALLEL_INT_STATUS(hparallel.PARALLELx)&INT_TXFIFO_EMPTY
|
||||
#define __8080_WRITE_BLANK() hparallel.PARALLELx->TX_FIFO = 0
|
||||
|
||||
#define __TIMER_CLEAR_IQR(__TIMERx__) timer_int_clear(__TIMERx__)
|
||||
#define __TIMER_INIT(__TIMERx__, __LoadCount__) timer_init(__TIMERx__, (24000 * __LoadCount__))
|
||||
#define __TIMER_INT_ENABLE(__TIMERx__) timer_int_enable(__TIMERx__)
|
||||
#define __TIMER_START(__TIMERx__) timer_start(__TIMERx__)
|
||||
|
||||
#define __DMA_GET_TFR_STATUS() dma_get_tfr_Status(&dma_handle)
|
||||
#define __DMA_CLEAR_TFR_STATUS() dma_clear_tfr_Status(&dma_handle)
|
||||
#define __DMA_TO_8080_START_IT(__BUFFER__,__SIZE__) dma_start_IT(&dma_handle, (uint32_t)__BUFFER__, (uint32_t)&hparallel.PARALLELx->TX_FIFO, __SIZE__)
|
||||
|
||||
#define __SPI_WRITE_DATA(__BUFFER__, __SIZE__) spi_master_transmit_X1(&spi_handle, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
|
||||
/* rgb_display_start */
|
||||
/* rgb_timer_IRQHandler */
|
||||
/* rgb_dma_IRQHandler */
|
||||
void rgb_init(void);
|
||||
void rgb_display_start(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb, uint32_t fps, unsigned char *Imagedata);
|
||||
void rgb_timer_IRQHandler(struct_Timer_t *TIMERx, struct_RGB_TypeDef_t *hrgb);
|
||||
void rgb_dma_IRQHandler(struct_RGB_TypeDef_t *hrgb);
|
||||
|
||||
#endif
|
746
MCU/components/drivers/bsp/spi_flash/IC_W25Qxx.c
Normal file
746
MCU/components/drivers/bsp/spi_flash/IC_W25Qxx.c
Normal file
@ -0,0 +1,746 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file IC_W25Qxx.c
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2020
|
||||
* @brief W25Qxx IC driver.
|
||||
* This file provides firmware functions to manage the following
|
||||
* functionalities of the spi norflash driver for W25Qxx.
|
||||
* @ Initialization and de-initialization functions
|
||||
* @ IO operation functions
|
||||
* @ Peripheral Control functions
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2020 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "IC_W25Qxx.h"
|
||||
|
||||
static void (*read_callback)(void) = NULL;
|
||||
|
||||
/*********************************************************************************
|
||||
* function : Read_IT_callback
|
||||
* Description : callback function used in read data with interrupt mode
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Owen Data : 2022
|
||||
**********************************************************************************/
|
||||
static void Read_IT_callback(SPI_HandleTypeDef *hspi)
|
||||
{
|
||||
__SPI_CS_Release();
|
||||
|
||||
if (read_callback)
|
||||
{
|
||||
read_callback();
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_WriteEnable
|
||||
* Description : Write Enable
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_WriteEnable(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = WRITE_ENABLE;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_WriteDisable
|
||||
* Description : Write Disable
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_WriteDisable(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = WRITE_DISABLE;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_WriteRegister
|
||||
* Description : Write status register
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_WriteRegister(uint8_t fu8_Register_S7_S0, uint8_t fu8_Register_S15_S08)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[3];
|
||||
|
||||
lu8_DataBuffer[0] = WRITE_STATUS_REGISTER;
|
||||
lu8_DataBuffer[1] = fu8_Register_S7_S0;
|
||||
lu8_DataBuffer[2] = fu8_Register_S15_S08;
|
||||
|
||||
/* Write Enable */
|
||||
IC_W25Qxx_WriteEnable();
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 3);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
/* Wait Write register End */
|
||||
IC_W25Qxx_WaitBusy();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_WriteHRegister
|
||||
* Description : Write high status register separately
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_WriteHRegister(uint8_t fu8_Register_S15_S08)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[2];
|
||||
|
||||
lu8_DataBuffer[0] = WRITE_STATUS_H_REGISTER;
|
||||
lu8_DataBuffer[1] = fu8_Register_S15_S08;
|
||||
|
||||
/* Write Enable */
|
||||
IC_W25Qxx_WriteEnable();
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 2);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
/* Wait Write register End */
|
||||
IC_W25Qxx_WaitBusy();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_ID
|
||||
* Description : Read Manufacture ID and Device ID
|
||||
* Input :
|
||||
* Output : Manufacture ID and Device ID
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
uint32_t IC_W25Qxx_Read_ID(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[4];
|
||||
|
||||
lu8_DataBuffer[0] = READ_ID;
|
||||
lu8_DataBuffer[1] = 0;
|
||||
lu8_DataBuffer[2] = 0;
|
||||
lu8_DataBuffer[3] = 0;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* Recieve Manufacture ID and Device ID */
|
||||
__SPI_Read_Data(lu8_DataBuffer, 3);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
return ((uint32_t)lu8_DataBuffer[0] << 16
|
||||
| (uint32_t)lu8_DataBuffer[1] << 8
|
||||
| (uint32_t)lu8_DataBuffer[2]);
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_RegisterS07_S00
|
||||
* Description : Read Status Register S07 ~ S00
|
||||
* Input :
|
||||
* Output : Status Register S07 ~ S00
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
uint8_t IC_W25Qxx_Read_RegisterS07_S00(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = READ_STATUS_REGISTER_S07_S00;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* Recieve Status Register S07 ~ S00 */
|
||||
__SPI_Read_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
return lu8_DataBuffer[0];
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_RegisterS15_S08
|
||||
* Description : Read Status Register S15 ~ S08
|
||||
* Input :
|
||||
* Output : Status Register S15 ~ S08
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
uint8_t IC_W25Qxx_Read_RegisterS15_S08(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = READ_STATUS_REGISTER_S15_S08;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* Recieve Status Register S15 ~ S08 */
|
||||
__SPI_Read_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
return lu8_DataBuffer[0];
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Data
|
||||
* Description : Read Data
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Data(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[4];
|
||||
|
||||
lu8_DataBuffer[0] = READ_DATA;
|
||||
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
|
||||
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
|
||||
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command and Recieve Data */
|
||||
__SPI_Read_flash_X1(lu8_DataBuffer, 4, pu8_Buffer, fu32_Length);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Data_IT
|
||||
* Description : Read Data
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Data_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[4];
|
||||
|
||||
lu8_DataBuffer[0] = READ_DATA;
|
||||
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
|
||||
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
|
||||
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
|
||||
|
||||
spi_flash_handle.RxCpltCallback = Read_IT_callback;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command and Recieve Data */
|
||||
__SPI_Read_flash_X1_IT(lu8_DataBuffer, 4, pu8_Buffer, fu32_Length);
|
||||
// /* CS Realse */
|
||||
// __SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Data_DMA
|
||||
* Description : Read Data
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Data_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[4];
|
||||
|
||||
lu8_DataBuffer[0] = READ_DATA;
|
||||
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
|
||||
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
|
||||
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command and Recieve Data */
|
||||
__SPI_Read_flash_X1_DMA(lu8_DataBuffer, 4, fu32_Length);
|
||||
dma_start_IT(&dma_flash_handle, (uint32_t)&spi_flash_handle.SPIx->DR, (uint32_t)pu8_Buffer, fu32_Length);
|
||||
// /* CS Realse */
|
||||
// __SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Dual_Output
|
||||
* Description : Dual Output Fast Read
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Dual_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
|
||||
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = DUAL_OUTPUT_FAST_READ;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send Data */
|
||||
__SPI_Read_Data_X2X4X8(pu8_Buffer, fu32_Length);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Dual_Output_IT
|
||||
* Description : Dual Output Fast Read with interrupt mode
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Dual_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
|
||||
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = DUAL_OUTPUT_FAST_READ;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
spi_flash_handle.RxCpltCallback = Read_IT_callback;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send Data */
|
||||
__SPI_Read_Data_X2X4X8_IT(pu8_Buffer, fu32_Length);
|
||||
// /* CS Realse */
|
||||
// __SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Dual_Output_DMA
|
||||
* Description : Dual Output Fast Read with DMA mode
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Dual_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
|
||||
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = DUAL_OUTPUT_FAST_READ;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send Data */
|
||||
__SPI_Read_Data_X2X4X8_DMA(fu32_Length);
|
||||
dma_start_IT(&dma_flash_handle, (uint32_t)&spi_flash_handle.SPIx->DR, (uint32_t)pu8_Buffer, fu32_Length);
|
||||
// /* CS Realse */
|
||||
// __SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Quad_Output
|
||||
* Description : Quad Output Fast Read
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Quad_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = QUAD_OUTPUT_FAST_READ;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send Data */
|
||||
__SPI_Read_Data_X2X4X8(pu8_Buffer, fu32_Length);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Quad_Output_IT
|
||||
* Description : Quad Output Fast Read
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Quad_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = QUAD_OUTPUT_FAST_READ;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
spi_flash_handle.RxCpltCallback = Read_IT_callback;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send Data */
|
||||
__SPI_Read_Data_X2X4X8_IT(pu8_Buffer, fu32_Length);
|
||||
// /* CS Realse */
|
||||
// __SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Read_Quad_Output_DMA
|
||||
* Description : Quad Output Fast Read
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Read_Quad_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_flash_handle.MultWireParam.ReceiveWaitCycles = 8;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = QUAD_OUTPUT_FAST_READ;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send Data */
|
||||
__SPI_Read_Data_X2X4X8_DMA(fu32_Length);
|
||||
dma_start_IT(&dma_flash_handle, (uint32_t)&spi_flash_handle.SPIx->DR, (uint32_t)pu8_Buffer, fu32_Length);
|
||||
// /* CS Realse */
|
||||
// __SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_PageProgram
|
||||
* Description : Page Program
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_PageProgram(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[4];
|
||||
|
||||
lu8_DataBuffer[0] = PAGE_PROGARM;
|
||||
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
|
||||
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
|
||||
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
|
||||
|
||||
/* Write Enable */
|
||||
IC_W25Qxx_WriteEnable();
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 4);
|
||||
/* Send Data */
|
||||
__SPI_Write_Data(pu8_Buffer, fu32_Length);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
/* Wait Erase End */
|
||||
IC_W25Qxx_WaitBusy();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_PageProgram_Quad
|
||||
* Description : Quad Page Program
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_PageProgram_Quad(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X4;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = QUAD_PAGE_PROGRAM;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
/* Write Enable */
|
||||
IC_W25Qxx_WriteEnable();
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send Data */
|
||||
__SPI_Write_Data_X2X4X8(pu8_Buffer, fu32_Length);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
/* Wait Erase End */
|
||||
IC_W25Qxx_WaitBusy();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_EraseSector
|
||||
* Description : Erease The specific Sector
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_EraseSector(uint32_t fu32_DataAddress)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[4];
|
||||
|
||||
lu8_DataBuffer[0] = SECTOR_ERASE;
|
||||
lu8_DataBuffer[1] = (uint8_t)(fu32_DataAddress >> 16 & 0xFF);
|
||||
lu8_DataBuffer[2] = (uint8_t)(fu32_DataAddress >> 8 & 0xFF);
|
||||
lu8_DataBuffer[3] = (uint8_t)(fu32_DataAddress >> 0 & 0xFF);
|
||||
|
||||
/* Write Enable */
|
||||
IC_W25Qxx_WriteEnable();
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 4);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
/* Wait Erase End */
|
||||
IC_W25Qxx_WaitBusy();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_EraseChip
|
||||
* Description : Erease The Whole Chip
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_EraseChip(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = CHIP_ERASE;
|
||||
|
||||
/* Write Enable */
|
||||
IC_W25Qxx_WriteEnable();
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
/* Wait Erase End */
|
||||
IC_W25Qxx_WaitBusy();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_QuadConfig
|
||||
* Description : Quad Function Config
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_QuadConfig(bool fb_Config)
|
||||
{
|
||||
uint8_t lu8_CurrentState;
|
||||
|
||||
lu8_CurrentState = IC_W25Qxx_Read_RegisterS15_S08();
|
||||
|
||||
if (fb_Config == true)
|
||||
{
|
||||
/* Set W25Qxx Quad Enable */
|
||||
if ((lu8_CurrentState & REGISTER_S15_S08_QE) == 0)
|
||||
{
|
||||
// IC_W25Qxx_WriteRegister(REGISTER_NULL, REGISTER_S15_S08_QE);
|
||||
IC_W25Qxx_WriteHRegister(REGISTER_S15_S08_QE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set W25Qxx Quad Disable */
|
||||
if (lu8_CurrentState & REGISTER_S15_S08_QE)
|
||||
{
|
||||
IC_W25Qxx_WriteRegister(REGISTER_NULL, REGISTER_NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_WaitBusy
|
||||
* Description : Wait IC Not Busy
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_WaitBusy(void)
|
||||
{
|
||||
/* Wait IC Not Busy */
|
||||
while(IC_W25Qxx_Read_RegisterS07_S00() & REGISTER_S07_S00_WIP);
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_PowerDown
|
||||
* Description :
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_PowerDown(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = DEEP_POWER_DOWN;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Wakeup
|
||||
* Description :
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Wakeup(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = RELEASE_FORM_DEEP_POWER_DOWN;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Reset
|
||||
* Description : W25Qxx Reset
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Reset(void)
|
||||
{
|
||||
uint8_t lu8_DataBuffer[1];
|
||||
|
||||
lu8_DataBuffer[0] = ENABLE_RESET;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
lu8_DataBuffer[0] = RESET;
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
/* Send command */
|
||||
__SPI_Write_Data(lu8_DataBuffer, 1);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Set_Read_Callback
|
||||
* Description : used to set read callback when unblock mode (IT, DMA) is used
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : owen Data : 2022
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Set_Read_Callback(void (*cb)(void))
|
||||
{
|
||||
read_callback = cb;
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_Spi_Interrupt
|
||||
* Description : SPI interrupt handler
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_Spi_Interrupt(void)
|
||||
{
|
||||
spi_master_IRQHandler(&spi_flash_handle);
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
* function : IC_W25Qxx_DMA_Interrupt
|
||||
* Description : DMA interrupt handler
|
||||
* Input :
|
||||
* Output :
|
||||
* Author : Chris_Kyle Data : 2020
|
||||
**********************************************************************************/
|
||||
void IC_W25Qxx_DMA_Interrupt(void)
|
||||
{
|
||||
if (dma_get_tfr_Status(&dma_flash_handle)) {
|
||||
dma_clear_tfr_Status(&dma_flash_handle);
|
||||
|
||||
Read_IT_callback(NULL);
|
||||
}
|
||||
|
||||
if (dma_get_error_Status(&dma_flash_handle)) {
|
||||
dma_clear_error_Status(&dma_flash_handle);
|
||||
}
|
||||
}
|
||||
|
||||
void IC_W25Qxx_PageProgram_Dual(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length)
|
||||
{
|
||||
spi_flash_handle.MultWireParam.Wire_X2X4X8 = Wire_X2;
|
||||
spi_flash_handle.MultWireParam.InstructLength = INST_8BIT;
|
||||
spi_flash_handle.MultWireParam.Instruct = 0xA2;
|
||||
spi_flash_handle.MultWireParam.AddressLength = ADDR_24BIT;
|
||||
spi_flash_handle.MultWireParam.Address = fu32_DataAddress;
|
||||
|
||||
/* Write Enable */
|
||||
IC_W25Qxx_WriteEnable();
|
||||
|
||||
/* CS Select */
|
||||
__SPI_CS_Select();
|
||||
|
||||
/* Send Data */
|
||||
__SPI_Write_Data_X2X4X8(pu8_Buffer, fu32_Length);
|
||||
/* CS Realse */
|
||||
__SPI_CS_Release();
|
||||
|
||||
/* Wait Erase End */
|
||||
IC_W25Qxx_WaitBusy();
|
||||
}
|
224
MCU/components/drivers/bsp/spi_flash/IC_W25Qxx.h
Normal file
224
MCU/components/drivers/bsp/spi_flash/IC_W25Qxx.h
Normal file
@ -0,0 +1,224 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @file IC_W25Qxx.h
|
||||
* @author FreqChip Firmware Team
|
||||
* @version V1.0.0
|
||||
* @date 2020
|
||||
* @brief IC_W25Qxx Config header file.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2020 FreqChip.
|
||||
* All rights reserved.
|
||||
******************************************************************************
|
||||
*/
|
||||
#ifndef __IC_W25QXX_H__
|
||||
#define __IC_W25QXX_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "driver_spi.h"
|
||||
#include "driver_dma.h"
|
||||
|
||||
extern SPI_HandleTypeDef spi_flash_handle;
|
||||
extern DMA_HandleTypeDef dma_flash_handle;
|
||||
extern void spi_flash_cs_set(void);
|
||||
extern void spi_flash_cs_clear(void);
|
||||
|
||||
#define __SPI_CS_Release() spi_flash_cs_set()
|
||||
|
||||
#define __SPI_CS_Select() spi_flash_cs_clear()
|
||||
|
||||
#define __SPI_Read_Data(__BUFFER__, __SIZE__) spi_master_receive_X1(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
#define __SPI_Write_Data(__BUFFER__, __SIZE__) spi_master_transmit_X1(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
#define __SPI_Read_flash_X1(__CMD__, __CSIZE__, __BUFFER__, __SIZE__) spi_master_readflash_X1(&spi_flash_handle, (uint16_t *)__CMD__, __CSIZE__, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
#define __SPI_Read_flash_X1_IT(__CMD__, __CSIZE__, __BUFFER__, __SIZE__) spi_master_readflash_X1_IT(&spi_flash_handle, (uint8_t *)__CMD__, __CSIZE__, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
#define __SPI_Read_flash_X1_DMA(__CMD__, __CSIZE__, __SIZE__) spi_master_readflash_X1_DMA(&spi_flash_handle, (uint8_t *)__CMD__, __CSIZE__, __SIZE__)
|
||||
|
||||
#define __SPI_Write_Data_X2X4X8(__BUFFER__, __SIZE__) spi_master_transmit_X2X4X8(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
#define __SPI_Read_Data_X2X4X8(__BUFFER__, __SIZE__) spi_master_receive_X2X4X8(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
#define __SPI_Read_Data_X2X4X8_IT(__BUFFER__, __SIZE__) spi_master_receive_X2X4X8_IT(&spi_flash_handle, (void *)__BUFFER__, __SIZE__)
|
||||
|
||||
#define __SPI_Read_Data_X2X4X8_DMA(__SIZE__) spi_master_receive_X2X4X8_DMA(&spi_flash_handle, __SIZE__)
|
||||
|
||||
/*********************************************************************************
|
||||
One Block have 32K
|
||||
|
||||
Block Setor Address Range
|
||||
|
||||
17 0x011000 ~ 0x011FFF
|
||||
16 0x010000 ~ 0x010FFF
|
||||
15 0x00F000 ~ 0x00FFFF
|
||||
14 0x00E000 ~ 0x00EFFF
|
||||
1 13 0x00D000 ~ 0x00DFFF
|
||||
12 0x00C000 ~ 0x00CFFF
|
||||
11 0x00B000 ~ 0x00BFFF
|
||||
10 0x00A000 ~ 0x00AFFF
|
||||
9 0x009000 ~ 0x009FFF
|
||||
|
||||
8 0x008000 ~ 0x008FFF
|
||||
7 0x007000 ~ 0x007FFF
|
||||
6 0x006000 ~ 0x006FFF
|
||||
5 0x005000 ~ 0x005FFF
|
||||
0 4 0x004000 ~ 0x004FFF
|
||||
3 0x003000 ~ 0x003FFF
|
||||
2 0x002000 ~ 0x002FFF
|
||||
1 0x001000 ~ 0x001FFF
|
||||
0 0x000000 ~ 0x000FFF
|
||||
**********************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief W25Qxx Size
|
||||
*/
|
||||
#define W25QXX_PAGE_SIZE (256U) // Each Page has 256 Bytes
|
||||
#define W25QXX_SECTOR_SIZE (4096U) // Each Sector has 4k
|
||||
|
||||
/**
|
||||
* @brief W25Qxx Command Descriptions
|
||||
*/
|
||||
#define WRITE_ENABLE (0x06)
|
||||
#define WRITE_DISABLE (0x04)
|
||||
#define READ_STATUS_REGISTER_S07_S00 (0x05)
|
||||
#define READ_STATUS_REGISTER_S15_S08 (0x35)
|
||||
#define WRITE_STATUS_REGISTER (0x01)
|
||||
#define WRITE_STATUS_H_REGISTER (0x31)
|
||||
#define WRITE_ENABLE_VOLATILE_STATUS_REGISTER (0x50)
|
||||
#define READ_DATA (0x03)
|
||||
#define READ_DATA_FAST (0x0B)
|
||||
#define DUAL_OUTPUT_FAST_READ (0x3B)
|
||||
#define QUAD_OUTPUT_FAST_READ (0x6B)
|
||||
#define DUAL_IO_FAST_READ (0xBB)
|
||||
#define QUAD_IO_FAST_READ (0xEB)
|
||||
#define SET_BURST_WITH_WRAP (0x77)
|
||||
#define PAGE_PROGARM (0x02)
|
||||
#define QUAD_PAGE_PROGRAM (0x32)
|
||||
#define SECTOR_ERASE (0x20)
|
||||
#define BLOCK_ERASE_32K (0x52)
|
||||
#define BLOCK_ERASE_64K (0x52)
|
||||
#define CHIP_ERASE (0xC7)
|
||||
#define READ_DEVICE_ID (0x90)
|
||||
#define READ_ID (0x9F)
|
||||
#define READ_UNIQUE_ID (0x4B)
|
||||
#define ERASE_SECURITY_REGISTER (0x44)
|
||||
#define PROGRAM_SECURITY_REGISTER (0x42)
|
||||
#define READ_SECURITY_REGISTER (0x48)
|
||||
#define ENABLE_RESET (0x66)
|
||||
#define RESET (0x99)
|
||||
#define PROGRAM_ERASE_SUSPEND (0x75)
|
||||
#define PROGRAM_ERASE_RESUME (0x7A)
|
||||
#define DEEP_POWER_DOWN (0xB9)
|
||||
#define RELEASE_FORM_DEEP_POWER_DOWN (0xAB)
|
||||
#define READ_DATA_COMPATIBILITY (0x5A)
|
||||
|
||||
/**
|
||||
* @brief W25Qxx Stauts Register
|
||||
*/
|
||||
#define REGISTER_NULL (0)
|
||||
|
||||
#define REGISTER_S07_S00_SRP0 (1 << 7)
|
||||
#define REGISTER_S07_S00_BP4 (1 << 6)
|
||||
#define REGISTER_S07_S00_BP3 (1 << 5)
|
||||
#define REGISTER_S07_S00_BP2 (1 << 4)
|
||||
#define REGISTER_S07_S00_BP1 (1 << 3)
|
||||
#define REGISTER_S07_S00_BP0 (1 << 2)
|
||||
#define REGISTER_S07_S00_WEL (1 << 1)
|
||||
#define REGISTER_S07_S00_WIP (1 << 0)
|
||||
|
||||
#define REGISTER_S15_S08_SUS (1 << 7)
|
||||
#define REGISTER_S15_S08_CMP (1 << 6)
|
||||
#define REGISTER_S15_S08_NULL (1 << 5)
|
||||
#define REGISTER_S15_S08_DC (1 << 4)
|
||||
#define REGISTER_S15_S08_LB1 (1 << 3)
|
||||
#define REGISTER_S15_S08_LB0 (1 << 2)
|
||||
#define REGISTER_S15_S08_QE (1 << 1) // Quad Enable
|
||||
#define REGISTER_S15_S08_SRP1 (1 << 0)
|
||||
|
||||
/* Function : IC_W25Qxx_WriteEnable */
|
||||
void IC_W25Qxx_WriteEnable(void);
|
||||
|
||||
/* Function : IC_W25Qxx_WriteDisable */
|
||||
void IC_W25Qxx_WriteDisable(void);
|
||||
|
||||
/* Function : IC_W25Qxx_WriteRegister */
|
||||
void IC_W25Qxx_WriteRegister(uint8_t fu8_Register_S7_S0, uint8_t fu8_Register_S15_S08);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_ID */
|
||||
uint32_t IC_W25Qxx_Read_ID(void);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_RegisterS07_S00 */
|
||||
uint8_t IC_W25Qxx_Read_RegisterS07_S00(void);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_RegisterS15_S08 */
|
||||
uint8_t IC_W25Qxx_Read_RegisterS15_S08(void);
|
||||
|
||||
/* Function : IC_W25Qxx_Read */
|
||||
void IC_W25Qxx_Read_Data(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read with interrupt mode */
|
||||
void IC_W25Qxx_Read_Data_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read with DMA mode */
|
||||
void IC_W25Qxx_Read_Data_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_Dual_Output */
|
||||
void IC_W25Qxx_Read_Dual_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_Dual_Output_IT with interrupt mode */
|
||||
void IC_W25Qxx_Read_Dual_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_Dual_Output_DMA with DMA mode */
|
||||
void IC_W25Qxx_Read_Dual_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_Quad_Output */
|
||||
void IC_W25Qxx_Read_Quad_Output(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_Quad_Output with interrupt mode */
|
||||
void IC_W25Qxx_Read_Quad_Output_IT(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_Quad_Output with DMA mode */
|
||||
void IC_W25Qxx_Read_Quad_Output_DMA(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_PageProgram */
|
||||
void IC_W25Qxx_PageProgram(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_PageProgram_Quad */
|
||||
void IC_W25Qxx_PageProgram_Quad(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
|
||||
/* Function : IC_W25Qxx_EraseSector */
|
||||
void IC_W25Qxx_EraseSector(uint32_t fu32_DataAddress);
|
||||
|
||||
/* Function : IC_W25Qxx_EraseChip */
|
||||
void IC_W25Qxx_EraseChip(void);
|
||||
|
||||
/* Function : IC_W25Qxx_QuadConfig */
|
||||
void IC_W25Qxx_QuadConfig(bool fb_Config);
|
||||
|
||||
/* Function : IC_W25Qxx_WaitBusy */
|
||||
void IC_W25Qxx_WaitBusy(void);
|
||||
|
||||
/* Function : IC_W25Qxx_Reset */
|
||||
void IC_W25Qxx_Reset(void);
|
||||
|
||||
/* Function : IC_W25Qxx_PowerDown */
|
||||
void IC_W25Qxx_PowerDown(void);
|
||||
|
||||
/* Function : IC_W25Qxx_Wakeup */
|
||||
void IC_W25Qxx_Wakeup(void);
|
||||
|
||||
/* Function : IC_W25Qxx_Read_Set_Callback */
|
||||
void IC_W25Qxx_Set_Read_Callback(void (*cb)(void));
|
||||
|
||||
/* Function : IC_W25Qxx_Spi_Interrupt */
|
||||
void IC_W25Qxx_Spi_Interrupt(void);
|
||||
|
||||
/* Function : IC_W25Qxx_DMA_Interrupt */
|
||||
void IC_W25Qxx_DMA_Interrupt(void);
|
||||
void IC_W25Qxx_PageProgram_Dual(uint8_t *pu8_Buffer, uint32_t fu32_DataAddress, uint32_t fu32_Length);
|
||||
#endif
|
132
MCU/components/drivers/bsp/spi_flash/ext_flash.c
Normal file
132
MCU/components/drivers/bsp/spi_flash/ext_flash.c
Normal file
@ -0,0 +1,132 @@
|
||||
|
||||
#include "ext_flash.h"
|
||||
#include "driver_gpio.h"
|
||||
#include "driver_spi.h"
|
||||
#include "driver_dma.h"
|
||||
#include "IC_W25Qxx.h"
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
extern SPI_HandleTypeDef spi_flash_handle;
|
||||
extern DMA_HandleTypeDef dma_flash_handle;
|
||||
|
||||
|
||||
void ext_flash_gpio_init(void)
|
||||
{
|
||||
/* ========================================================== */
|
||||
/* ========= External Flash interface configuration ======== */
|
||||
/* ========================================================== */
|
||||
GPIO_InitTypeDef gpio_config;
|
||||
|
||||
/* config GPIO for external flash */
|
||||
gpio_config.Pin = GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
|
||||
gpio_config.Mode = GPIO_MODE_AF_PP;
|
||||
gpio_config.Pull = GPIO_PULLUP;
|
||||
gpio_config.Alternate = GPIO_FUNCTION_7;
|
||||
gpio_init(GPIOC, &gpio_config);
|
||||
|
||||
/* CS of external flash is controllerd by software */
|
||||
__SYSTEM_GPIOC_CLK_ENABLE();
|
||||
gpio_config.Pin = GPIO_PIN_9;
|
||||
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
gpio_config.Pull = GPIO_PULLUP;
|
||||
gpio_config.Alternate = GPIO_FUNCTION_0;
|
||||
gpio_init(GPIOC, &gpio_config);
|
||||
}
|
||||
|
||||
void ext_flash_dma_init(void)
|
||||
{
|
||||
/* config DMA0 for external flash */
|
||||
__SYSTEM_DMA0_CLK_ENABLE();
|
||||
dma_flash_handle.DMAx = DMA0;
|
||||
dma_flash_handle.Channel = DMA_Channel0;
|
||||
dma_flash_handle.Init.Data_Flow = DMA_P2M_DMAC;
|
||||
dma_flash_handle.Init.Request_ID = 2;
|
||||
system_dmac_request_id_config(SPIMX8_1_RX, DMA0_REQUEST_ID_2);
|
||||
dma_flash_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_1;
|
||||
dma_flash_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_4;
|
||||
dma_flash_handle.Init.Source_Inc = DMA_ADDR_INC_NO_CHANGE;
|
||||
dma_flash_handle.Init.Desination_Inc = DMA_ADDR_INC_INC;
|
||||
dma_flash_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
|
||||
dma_flash_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
|
||||
dma_flash_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4;
|
||||
dma_flash_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4;
|
||||
dma_init(&dma_flash_handle);
|
||||
}
|
||||
|
||||
void ext_flash_controler_init(void)
|
||||
{
|
||||
/* Initial SPIx8_1 for extern flash */
|
||||
__SYSTEM_SPI_MASTER1_X8_CLK_ENABLE();
|
||||
spi_flash_handle.SPIx = SPIMX8_1;
|
||||
spi_flash_handle.Init.Work_Mode = SPI_WORK_MODE_3;
|
||||
spi_flash_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT;
|
||||
spi_flash_handle.Init.BaudRate_Prescaler = 2;
|
||||
spi_flash_handle.Init.TxFIFOEmpty_Threshold = 20;
|
||||
spi_flash_handle.Init.RxFIFOFull_Threshold = 0;
|
||||
spi_master_init(&spi_flash_handle);
|
||||
// __SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2);
|
||||
spi_flash_cs_set();
|
||||
|
||||
IC_W25Qxx_QuadConfig(true);
|
||||
|
||||
NVIC_EnableIRQ(DMA0_IRQn);
|
||||
NVIC_EnableIRQ(SPIMX8_1_IRQn);
|
||||
}
|
||||
|
||||
void ext_flash_device_init(void)
|
||||
{
|
||||
ext_flash_gpio_init();
|
||||
ext_flash_dma_init();
|
||||
ext_flash_controler_init();
|
||||
}
|
||||
|
||||
uint32_t ext_flash_get_id(void)
|
||||
{
|
||||
return IC_W25Qxx_Read_ID();
|
||||
}
|
||||
|
||||
// void spi_flash_cs_set(void)
|
||||
// {
|
||||
// gpio_write_pin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
|
||||
// }
|
||||
|
||||
// void spi_flash_cs_clear(void)
|
||||
// {
|
||||
// gpio_write_pin(GPIOC, GPIO_PIN_9, GPIO_PIN_CLEAR);
|
||||
// }
|
||||
|
||||
void ext_flash_erase(uint32_t addr, uint32_t len)
|
||||
{
|
||||
for (int i = 0; i < len; i += 4096)
|
||||
{
|
||||
IC_W25Qxx_EraseSector(addr + i);
|
||||
}
|
||||
}
|
||||
|
||||
void ext_flash_chip_erase(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ext_flash_protect_enable(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ext_flash_protect_disable(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uint8_t ext_flash_read(uint32_t addr, int len,uint8_t* buffer)
|
||||
{
|
||||
IC_W25Qxx_Read_Data(buffer, addr, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t ext_flash_write(uint32_t addr, int len,uint8_t* buffer)
|
||||
{
|
||||
IC_W25Qxx_PageProgram(buffer, addr, len);
|
||||
return 0;
|
||||
}
|
27
MCU/components/drivers/bsp/spi_flash/ext_flash.h
Normal file
27
MCU/components/drivers/bsp/spi_flash/ext_flash.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef __EXT_FLASH__
|
||||
#define __EXT_FLASH__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void ext_flash_device_init(void);
|
||||
uint32_t ext_flash_get_id(void);
|
||||
void spi_flash_cs_set(void);
|
||||
void spi_flash_cs_clear(void);
|
||||
|
||||
void ext_flash_erase(uint32_t addr, uint32_t len);
|
||||
void ext_flash_chip_erase(void);
|
||||
void ext_flash_protect_enable(void);
|
||||
void ext_flash_protect_disable(void);
|
||||
uint8_t ext_flash_read(uint32_t addr, int len,uint8_t* buffer);
|
||||
uint8_t ext_flash_write(uint32_t addr, int len,uint8_t* buffer);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __EXT_FLASH__ */
|
2243
MCU/components/drivers/bsp/touchpad/chsc5816_ctp.h
Normal file
2243
MCU/components/drivers/bsp/touchpad/chsc5816_ctp.h
Normal file
File diff suppressed because it is too large
Load Diff
1064
MCU/components/drivers/bsp/touchpad/chsc6x_comp.c
Normal file
1064
MCU/components/drivers/bsp/touchpad/chsc6x_comp.c
Normal file
File diff suppressed because it is too large
Load Diff
41
MCU/components/drivers/bsp/touchpad/chsc6x_comp.h
Normal file
41
MCU/components/drivers/bsp/touchpad/chsc6x_comp.h
Normal file
@ -0,0 +1,41 @@
|
||||
#ifndef __CHSC6X_COMP_H__
|
||||
#define __CHSC6X_COMP_H__
|
||||
|
||||
struct ts_fw_infos {
|
||||
unsigned short chsc6x_cfg_version; //customer read
|
||||
unsigned short chsc6x_boot_version; //customer read
|
||||
unsigned short chsc6x_vendor_id; //customer read
|
||||
unsigned short chsc6x_project_id; //customer read
|
||||
unsigned short chsc6x_chip_id; //customer read
|
||||
unsigned short chsc6x_chip_type; //customer read
|
||||
unsigned short chsc6x_rpt_lcd_x; //customer read must after chsc6x_get_chip_info
|
||||
unsigned short chsc6x_rpt_lcd_y; //customer read must after chsc6x_get_chip_info
|
||||
unsigned short chsc6x_max_pt_num; //customer read must after chsc6x_get_chip_info
|
||||
};
|
||||
|
||||
|
||||
/* FUNC In your systerm init process,Must call this interface function to detec if the TP IC is Chipsemi corp'.
|
||||
* PARM pfw_infos: to get top 5 fw info in struct ts_fw_infos.
|
||||
* PARM update_ret_flag: point value=1 update succeed; point value=0 update failed, If opend CHSC6X_AUTO_UPGRADE macro.
|
||||
* RETURN 1:is chsc chip, 0:is not chsc chip
|
||||
*/
|
||||
extern int chsc6x_tp_dect(struct ts_fw_infos *pfw_infos, unsigned char *update_ret_flag);
|
||||
|
||||
|
||||
/* FUNC You can call this interfacce function to realize upgrade TP Firmware by OTA.
|
||||
* PARM pfw_infos: to get top 6 fw infos in struct ts_fw_infos, after ota upgrade.
|
||||
* PARM p_fw_upd: array address of the upgrade firmware array
|
||||
* PARM fw_len: total size of the upgrade firmware array
|
||||
* RETURN NULL
|
||||
*/
|
||||
extern void chsc6x_ota_upgrade_tp_fw(struct ts_fw_infos *pfw_infos, unsigned char* p_fw_upd, unsigned int fw_len);
|
||||
|
||||
|
||||
/* FUNC: get fw info in struct ts_fw_infos you can call this func anytime.
|
||||
* PARM pfw_infos: can get all fw infos in struct ts_fw_infos, after call this interface.
|
||||
* RETURN NULL
|
||||
*/
|
||||
extern void chsc6x_get_chip_info(struct ts_fw_infos *infos);
|
||||
|
||||
|
||||
#endif
|
895
MCU/components/drivers/bsp/touchpad/chsc6x_flash_boot.h
Normal file
895
MCU/components/drivers/bsp/touchpad/chsc6x_flash_boot.h
Normal file
@ -0,0 +1,895 @@
|
||||
#ifndef __CHSC6X_FLASH_BOOT_H__
|
||||
#define __CHSC6X_FLASH_BOOT_H__
|
||||
|
||||
const unsigned char chsc_boot[] = {
|
||||
0x43,0x48,0x53,0x43,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
|
||||
0xCC,0x00,0x00,0x00,0x8C,0x36,0x00,0x00,0x01,0xC6,0x0E,0x00,0x01,0xC6,0x0E,0x08,
|
||||
0x01,0x3C,0x02,0x93,0x1B,0x02,0x02,0x00,0x00,0x01,0x0F,0x01,0x13,0x0F,0x43,0x0A,
|
||||
0x0A,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x10,0x0C,0x00,0x00,0x00,
|
||||
0x00,0x0B,0x08,0x03,0x01,0x04,0x05,0x09,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x07,0x0A,0x0F,0x0E,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x18,0x45,0x91,0x02,0x38,0x00,0x72,0x01,0x72,0x01,0x50,0x00,0xF0,0x00,
|
||||
0x90,0x01,0x00,0x02,0x84,0x03,0x20,0x10,0x78,0x78,0x78,0x78,0x64,0x40,0x08,0x84,
|
||||
0x08,0x1E,0x26,0x23,0x28,0x26,0x5C,0x0B,0x90,0x08,0x46,0x46,0x23,0x23,0x65,0xBD,
|
||||
0x1B,0x06,0x11,0x20,0x03,0x19,0x84,0xAF,0x9E,0x40,0x91,0x01,0xC8,0x60,0x2C,0x2D,
|
||||
0x25,0x11,0x32,0x6A,0x80,0x32,0x21,0x46,0xC8,0x28,0xDA,0x6B,0x59,0x05,0x84,0xA2,
|
||||
0x26,0x06,0x33,0x08,0x22,0x06,0x2B,0x08,0xF7,0x05,0x07,0x08,0x3E,0x06,0x95,0x08,
|
||||
0x00,0x00,0x34,0x2D,0x34,0x2D,0x00,0x00,0x00,0x00,0xD6,0x02,0x0E,0x00,0x08,0x08,
|
||||
0x28,0x10,0x32,0x03,0x51,0x32,0x01,0x21,0x19,0x19,0x11,0x12,0x13,0x13,0x11,0x19,
|
||||
0x1A,0x1A,0x1D,0x1B,0x1A,0x19,0x19,0x82,0x08,0x80,0x36,0x35,0x2D,0x02,0x88,0x36,
|
||||
0xBD,0x4E,0x4C,0x54,0x40,0x00,0x88,0x00,0x4A,0x80,0xC0,0x46,0x00,0xA0,0x20,0x09,
|
||||
0x20,0x0A,0x08,0x50,0x04,0xB1,0x91,0x02,0xFB,0xCB,0x13,0x08,0xC0,0x6B,0x14,0x08,
|
||||
0x85,0x06,0x12,0x08,0xC0,0x6B,0x13,0x08,0x85,0x06,0x1B,0x08,0x1B,0x09,0x10,0x0A,
|
||||
0x08,0x50,0x04,0xB1,0x91,0x02,0xFB,0xCB,0x10,0x09,0x11,0x0A,0x00,0xA0,0x08,0x50,
|
||||
0x04,0xB1,0x91,0x02,0xFB,0xCD,0x0C,0x09,0x04,0xA0,0x08,0x40,0x05,0xA0,0x48,0x40,
|
||||
0x0C,0x09,0x0D,0x0A,0x0D,0x0B,0x08,0x58,0x10,0x50,0x04,0xB1,0x04,0xB2,0x9A,0x02,
|
||||
0xF9,0xCB,0x01,0x90,0x19,0x9C,0xC0,0x46,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,
|
||||
0xFC,0x9D,0x80,0x00,0xFC,0x9C,0x80,0x00,0x0C,0x06,0x80,0x00,0x00,0x84,0x80,0x00,
|
||||
0x00,0x85,0x80,0x00,0x10,0x36,0x00,0x00,0x04,0x8D,0x80,0x00,0x7C,0x8D,0x80,0x00,
|
||||
0x00,0x84,0x80,0x00,0x00,0xA0,0x80,0x00,0xCE,0xFA,0xAD,0xDE,0xE0,0x93,0x80,0x00,
|
||||
0x00,0x65,0x0F,0x64,0xD8,0x6B,0x01,0x64,0xF0,0x64,0x4F,0x06,0x56,0x06,0x5D,0x06,
|
||||
0x64,0x06,0xF0,0x64,0x44,0x06,0x10,0x64,0x00,0x90,0x10,0x99,0x10,0x6C,0xA0,0x06,
|
||||
0xF0,0x6C,0xB9,0x06,0xB2,0x06,0xAB,0x06,0xA4,0x06,0xF0,0x6C,0x01,0x6C,0xD0,0x6B,
|
||||
0x0F,0x6C,0x00,0x69,0x00,0x00,0x00,0x00,0x03,0xA2,0x05,0x80,0x01,0xA2,0x03,0x80,
|
||||
0x02,0xA2,0x01,0x80,0x00,0xA2,0xFF,0x87,0xCB,0x6B,0x18,0x64,0x80,0xA4,0x23,0x03,
|
||||
0xC3,0x6B,0x09,0x0B,0x18,0x50,0x04,0xB3,0x19,0x50,0x08,0xBB,0x1A,0x40,0x18,0x48,
|
||||
0x00,0xA8,0xFC,0xC1,0x01,0xAA,0x02,0xC9,0x08,0xB3,0x18,0x58,0x01,0x80,0x04,0xB3,
|
||||
0x18,0x58,0x18,0x6C,0xC3,0x6B,0x70,0x07,0x64,0x06,0x80,0x00,0x60,0x06,0x80,0x00,
|
||||
0x68,0x06,0x80,0x00,0xC0,0x46,0xC0,0x46,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
|
||||
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
|
||||
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
|
||||
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x01,0x08,0x08,0x01,0x01,0x08,0x08,0x01,
|
||||
0x00,0xFA,0xAA,0x00,0x00,0xFA,0xB4,0x00,0x70,0x65,0x00,0x90,0x67,0x99,0x24,0x0B,
|
||||
0x00,0xA2,0x1A,0x40,0x23,0x0A,0xB9,0xA1,0x11,0x40,0x1A,0x48,0x00,0xAA,0xFC,0xC1,
|
||||
0x1F,0x0B,0x01,0xA2,0x1A,0x40,0x20,0x0C,0x20,0x0E,0x81,0xA5,0x06,0xA1,0x06,0xA0,
|
||||
0x00,0x90,0x5A,0x98,0x0B,0xA0,0x01,0xA1,0x00,0x90,0x56,0x98,0x25,0x40,0x20,0xA3,
|
||||
0xC0,0x06,0x01,0xBB,0x00,0xAB,0xFB,0xC1,0x66,0xA2,0x32,0x40,0x18,0x09,0x4A,0x4E,
|
||||
0x01,0xAA,0x09,0xC1,0x17,0x09,0x0B,0x40,0x03,0xB1,0x0B,0x40,0x16,0x0B,0x02,0xA1,
|
||||
0x19,0x40,0x09,0xBB,0x1A,0x40,0x07,0x80,0x4B,0x4E,0x00,0xAB,0x04,0xC0,0x06,0xA0,
|
||||
0x00,0x90,0x24,0x98,0x04,0xA8,0xD9,0xC0,0x09,0x0B,0x00,0xA2,0x1A,0x40,0x09,0x0A,
|
||||
0xAB,0xA1,0x11,0x40,0x1A,0x48,0x00,0xAA,0xFC,0xC1,0x05,0x0B,0x01,0xA2,0x1A,0x40,
|
||||
0x20,0xA3,0xC0,0x06,0x01,0xBB,0x00,0xAB,0xFB,0xC1,0x00,0x90,0x5F,0x99,0x70,0x6D,
|
||||
0x0D,0x00,0x80,0x00,0x0C,0x00,0x80,0x00,0x67,0x00,0x80,0x00,0x0F,0x04,0x80,0x00,
|
||||
0x2C,0x8F,0x80,0x00,0x06,0x04,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0xF6,0x80,0xA3,
|
||||
0xDB,0xF3,0x00,0xFE,0xC0,0xE8,0x05,0x0B,0x05,0x0A,0x18,0x50,0x01,0xA3,0x11,0x48,
|
||||
0x0B,0x02,0xFC,0xC1,0x03,0x0B,0x18,0x48,0x70,0x07,0xC0,0x46,0xB8,0x00,0x80,0x00,
|
||||
0xBA,0x00,0x80,0x00,0xB9,0x00,0x80,0x00,0x00,0xF6,0xC0,0xA3,0xDB,0xF3,0x00,0xFE,
|
||||
0x09,0xF6,0xC0,0xE8,0x09,0xFC,0x04,0x0B,0x40,0xE8,0x04,0x0A,0x18,0x50,0x01,0xA3,
|
||||
0x11,0x48,0x0B,0x02,0xFC,0xC1,0x70,0x07,0xB8,0x00,0x80,0x00,0xBA,0x00,0x80,0x00,
|
||||
0x70,0x65,0x0B,0x0A,0x0B,0x0B,0x28,0xB2,0x15,0x48,0x40,0xB3,0x80,0xA2,0x0A,0x09,
|
||||
0xED,0xE8,0x0A,0x0C,0x12,0xF1,0x07,0x80,0x1E,0x48,0xB6,0xF0,0x36,0x19,0x96,0xEB,
|
||||
0x46,0x03,0x01,0xB3,0x0E,0x20,0x02,0xB1,0xAB,0x02,0xF5,0xC1,0x70,0x6D,0xC0,0x46,
|
||||
0x6C,0x90,0x80,0x00,0x00,0x8E,0x80,0x00,0xFC,0x90,0x80,0x00,0x80,0x8D,0x80,0x00,
|
||||
0x07,0x0A,0x00,0xA3,0x53,0x45,0x93,0x45,0x06,0x0A,0x13,0x40,0x03,0xB2,0x13,0x40,
|
||||
0x05,0x0B,0x02,0xA2,0x1A,0x40,0x01,0xA2,0x09,0xBB,0x1A,0x40,0x70,0x07,0xC0,0x46,
|
||||
0x2C,0x8F,0x80,0x00,0x06,0x04,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0x65,0x05,0x0B,
|
||||
0x1A,0x58,0x08,0xBB,0x1B,0x58,0x13,0x00,0x5A,0xF4,0x01,0xC5,0x00,0x90,0x6C,0x98,
|
||||
0x00,0x6D,0xC0,0x46,0x48,0x06,0x80,0x00,0xF0,0x65,0x02,0xEC,0x00,0xA4,0x00,0xA3,
|
||||
0x40,0xA0,0x07,0x0E,0x09,0x80,0x15,0x28,0xA5,0x02,0x04,0xC9,0xF7,0x1C,0x00,0xAF,
|
||||
0x01,0xC1,0x2C,0xEC,0x18,0xEC,0x01,0xB3,0x02,0xB2,0x8B,0x02,0xF3,0xCB,0xF0,0x6D,
|
||||
0x80,0x92,0x80,0x00,0x80,0xEA,0xC9,0xEA,0x02,0xEC,0x0B,0xEC,0x50,0x03,0x59,0x03,
|
||||
0x08,0xE8,0x70,0x07,0x30,0x65,0x05,0xEC,0x1C,0xEC,0xAA,0x02,0x0A,0xC0,0x03,0x38,
|
||||
0x59,0xEA,0x80,0xEA,0x48,0x03,0x51,0xEB,0xFF,0x97,0xC8,0x9E,0x01,0xE9,0x00,0xA9,
|
||||
0x00,0xCC,0x01,0xA1,0x09,0xF4,0x08,0xE4,0x30,0x6D,0x10,0x65,0x00,0xA4,0x03,0x1F,
|
||||
0x01,0xA0,0x93,0x02,0x04,0xCB,0x89,0xEA,0xD8,0xE7,0xCA,0xFF,0x8B,0x02,0x50,0x01,
|
||||
0x10,0x6D,0x10,0x65,0x04,0x58,0x03,0xEC,0x94,0x02,0x01,0xCA,0x02,0x50,0x04,0x80,
|
||||
0x89,0xEA,0x00,0xA0,0x8C,0x02,0x01,0xCB,0x19,0x50,0x01,0xA0,0x10,0x6D,0x92,0xF8,
|
||||
0x00,0xA3,0x01,0x80,0x02,0xD0,0x01,0xB3,0x93,0x02,0xFB,0xC3,0x70,0x07,0x10,0x65,
|
||||
0x00,0xA3,0x02,0x80,0x10,0xD9,0x10,0xD0,0x01,0xB3,0x93,0x02,0xFA,0xC3,0x10,0x6D,
|
||||
0x04,0x0B,0x1B,0x58,0x18,0xEA,0x4B,0xF0,0x59,0xE8,0xC9,0xF0,0x81,0x02,0x80,0x01,
|
||||
0x40,0x02,0x70,0x07,0x34,0x06,0x80,0x00,0x10,0x65,0x12,0x0B,0x03,0xA2,0x1A,0x40,
|
||||
0x11,0x0C,0x63,0x4E,0x00,0xAB,0x0E,0xC1,0x02,0xA0,0x00,0x90,0x81,0x9B,0xA3,0x4D,
|
||||
0x0E,0xAB,0x0B,0xC8,0x0D,0x0B,0x01,0xA2,0x1A,0x40,0xA3,0x4D,0x01,0xB3,0x1B,0xF6,
|
||||
0x1B,0xFE,0xA3,0x45,0x04,0x80,0x04,0xA0,0xFF,0x97,0x3A,0x9F,0x01,0xA3,0x63,0x45,
|
||||
0x05,0x0B,0x5B,0x4D,0x01,0xAB,0x03,0xC1,0x05,0x0A,0x13,0x40,0x03,0xB2,0x13,0x40,
|
||||
0x10,0x6D,0xC0,0x46,0x09,0x02,0x80,0x00,0x2C,0x8F,0x80,0x00,0x00,0x02,0x80,0x00,
|
||||
0x06,0x04,0x80,0x00,0x04,0x0A,0x80,0xA3,0x10,0x58,0x11,0x58,0x5B,0xF4,0x19,0x03,
|
||||
0x18,0x00,0x11,0x50,0x70,0x07,0xC0,0x46,0x40,0x06,0x80,0x00,0x10,0x65,0x04,0xEC,
|
||||
0x00,0x90,0x88,0x9B,0x03,0xA1,0x02,0xA0,0xFF,0x97,0xFE,0x9E,0x17,0x0A,0x18,0x0B,
|
||||
0x00,0xA1,0x1A,0x20,0x14,0xA0,0xFF,0x97,0xF7,0x9E,0x06,0xA1,0x11,0xA0,0xFF,0x97,
|
||||
0xF3,0x9E,0x01,0xA1,0x05,0xA0,0xFF,0x97,0xEF,0x9E,0x21,0xF6,0x09,0xFE,0x08,0xA0,
|
||||
0xFF,0x97,0xEA,0x9E,0x21,0xF4,0x09,0xFE,0x24,0xF2,0x09,0xA0,0xFF,0x97,0xE4,0x9E,
|
||||
0x21,0xFE,0x0A,0xA0,0xFF,0x97,0xE0,0x9E,0x0A,0x0A,0x01,0xA3,0x13,0x40,0x03,0xB2,
|
||||
0x13,0x40,0x09,0x0B,0x66,0xA2,0x1A,0x40,0x01,0xA1,0x01,0xA0,0xFF,0x97,0xD4,0x9E,
|
||||
0x6C,0xA1,0x00,0xA0,0xFF,0x97,0xD0,0x9E,0x10,0x6D,0xC0,0x46,0x01,0x01,0x00,0x00,
|
||||
0x6C,0x00,0x80,0x00,0x06,0x04,0x80,0x00,0x0F,0x04,0x80,0x00,0x10,0x65,0x64,0xA1,
|
||||
0x00,0xA0,0xFF,0x97,0xC1,0x9E,0x00,0xA1,0x14,0xA0,0xFF,0x97,0xBD,0x9E,0x04,0xA1,
|
||||
0x06,0xA0,0xFF,0x97,0xB9,0x9E,0x03,0xA1,0x01,0xA0,0xFF,0x97,0xB5,0x9E,0x16,0x0B,
|
||||
0x00,0xA4,0x1C,0x40,0x03,0xB3,0x1C,0x40,0xFF,0x97,0x9C,0x9F,0x06,0xA0,0xFF,0x97,
|
||||
0x95,0x9E,0x83,0xF7,0x0B,0xC5,0x11,0x0B,0xDC,0x45,0x11,0x0B,0x1B,0x58,0x7A,0xB3,
|
||||
0x1B,0x48,0x0F,0xA2,0x1A,0x00,0x0F,0x0B,0x01,0xBA,0x2C,0xB3,0x1A,0x40,0x0B,0x0B,
|
||||
0x5A,0x4E,0x02,0xAA,0x04,0xC1,0x01,0xA2,0x5A,0x45,0x32,0xA2,0x1A,0x46,0x06,0x80,
|
||||
0x5A,0x4E,0x00,0xAA,0x01,0xC1,0x01,0xA2,0x00,0x80,0x00,0xA2,0x5A,0x45,0x03,0x0B,
|
||||
0x00,0xA2,0x9A,0x45,0x10,0x6D,0xC0,0x46,0x06,0x04,0x80,0x00,0x2C,0x8F,0x80,0x00,
|
||||
0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x00,0x65,0x19,0x0B,0x19,0x28,0x19,0x0B,
|
||||
0x28,0xB3,0x1B,0x48,0x9A,0xF0,0xD3,0xE8,0xDA,0xE0,0x17,0x0B,0x91,0x02,0x0A,0xCD,
|
||||
0x1A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x08,0xAA,0x05,0xC9,0x13,0x09,
|
||||
0x00,0xA2,0x0A,0x40,0x00,0x80,0x00,0xA2,0x1A,0x40,0x10,0x0B,0x1A,0x48,0x03,0xAA,
|
||||
0x15,0xC8,0x0F,0x0A,0x11,0x28,0x01,0xB1,0x09,0xF4,0x09,0xFC,0x11,0x20,0x1A,0x48,
|
||||
0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x00,0xA2,0xDA,0x45,0x5A,0x46,0x05,0x0B,
|
||||
0x28,0xB3,0x1A,0x48,0x07,0x08,0x52,0xF0,0x07,0x09,0x02,0x90,0xCA,0x9D,0x00,0x6D,
|
||||
0x7C,0x92,0x80,0x00,0x6C,0x90,0x80,0x00,0x7C,0x8D,0x80,0x00,0x2C,0x8F,0x80,0x00,
|
||||
0xB8,0x93,0x80,0x00,0x9C,0x90,0x80,0x00,0xFC,0x90,0x80,0x00,0x10,0x65,0x17,0x0B,
|
||||
0x1A,0xEC,0x80,0xB2,0x14,0x48,0x16,0x0A,0x81,0xB3,0x19,0x48,0x53,0xEC,0xD8,0x4F,
|
||||
0x93,0xEC,0xDB,0x4F,0x09,0xF2,0x1B,0xF2,0x21,0x03,0x03,0x03,0x99,0x02,0x1C,0xC2,
|
||||
0x13,0xEC,0x2B,0xB3,0x19,0x48,0x0F,0x0B,0x1B,0x28,0x01,0xB1,0x99,0x02,0x14,0xCB,
|
||||
0x28,0xB2,0x10,0x48,0x0C,0x0B,0x40,0xF0,0x0C,0x09,0xC0,0xE8,0x0B,0x80,0x1A,0x28,
|
||||
0x12,0xF4,0x12,0xE4,0x00,0xAA,0x04,0xCA,0x0C,0x28,0x52,0x02,0xD2,0xE0,0xA2,0xEA,
|
||||
0x0A,0x20,0x02,0xB3,0x02,0xB1,0x83,0x02,0xF1,0xC1,0x10,0x6D,0xA4,0x8F,0x80,0x00,
|
||||
0x6C,0x90,0x80,0x00,0x7C,0x92,0x80,0x00,0x1C,0x92,0x80,0x00,0x9C,0x90,0x80,0x00,
|
||||
0xF0,0x65,0x3E,0x0C,0x23,0x48,0x05,0xF4,0x2D,0xFC,0x03,0xAB,0x75,0xC9,0xFF,0x97,
|
||||
0xBD,0x9F,0x63,0x4B,0x18,0xEE,0x02,0xC0,0x00,0xA2,0x39,0x0B,0x6C,0x80,0x39,0x0A,
|
||||
0x13,0xEC,0x80,0xB3,0x81,0xB2,0x19,0x48,0x13,0x48,0x1B,0xF2,0x0B,0x03,0x36,0x09,
|
||||
0x4A,0xEC,0xD6,0x4F,0x8A,0xEC,0xD2,0x4F,0x12,0xF2,0x32,0x03,0x93,0x02,0x02,0xC9,
|
||||
0x2F,0x0A,0x50,0x40,0x59,0x80,0x28,0xAB,0x22,0xC9,0x62,0x49,0x10,0xEE,0x1F,0xC1,
|
||||
0x2B,0x0B,0x5A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x5A,0x40,0x0F,0xAA,0x4C,0xC9,
|
||||
0x58,0x40,0x28,0xB1,0x0C,0x48,0x29,0x0B,0x64,0xF0,0x29,0x0A,0xE4,0xE8,0x0C,0x80,
|
||||
0x19,0x28,0x09,0xF4,0x08,0xE4,0x00,0xA8,0x05,0xCD,0xA8,0x02,0x03,0xCA,0x10,0x28,
|
||||
0x89,0xE4,0x09,0xE8,0x11,0x20,0x02,0xB3,0x02,0xB2,0xA3,0x02,0xF0,0xC1,0x34,0x80,
|
||||
0x1A,0x0A,0x51,0x49,0x00,0xA9,0x04,0xC0,0x52,0x49,0x01,0xAA,0x29,0xC1,0x13,0xAB,
|
||||
0x27,0xC8,0x17,0x0B,0x9A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x9A,0x40,0x0F,0xAA,
|
||||
0x23,0xC9,0x00,0xA2,0x9A,0x40,0x14,0x0B,0x1A,0xEC,0x28,0xB2,0x29,0xB3,0x17,0x48,
|
||||
0x1E,0x48,0x12,0x09,0x12,0x0A,0x00,0xA3,0x10,0x80,0x08,0x28,0x04,0xF4,0x24,0xE4,
|
||||
0x00,0xAC,0x08,0xCD,0xB3,0x02,0x01,0xC3,0xAC,0x02,0x04,0xCA,0x14,0x28,0x00,0xF4,
|
||||
0x80,0xE4,0x00,0xE9,0x10,0x20,0x01,0xB3,0x02,0xB1,0x02,0xB2,0xBB,0x02,0xEC,0xC3,
|
||||
0x03,0x80,0x03,0x0B,0x00,0xA2,0x9A,0x40,0x5A,0x40,0xF0,0x6D,0x2C,0x8F,0x80,0x00,
|
||||
0x7C,0x8D,0x80,0x00,0xA4,0x8F,0x80,0x00,0x6C,0x90,0x80,0x00,0x1C,0x92,0x80,0x00,
|
||||
0x9C,0x90,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
|
||||
0x01,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
|
||||
0x09,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
|
||||
0x0A,0x00,0x80,0x00,0x02,0x0B,0x00,0xF6,0x00,0xFE,0x18,0x40,0x70,0x07,0xC0,0x46,
|
||||
0x0B,0x00,0x80,0x00,0xF0,0x65,0x3C,0x0B,0x1B,0x48,0x09,0xF6,0x81,0x60,0x04,0xEC,
|
||||
0x09,0xFE,0x05,0xAB,0x52,0xC1,0x39,0x0B,0x1B,0x4E,0x00,0xAB,0x4E,0xC1,0xB4,0xA0,
|
||||
0x00,0xA9,0x40,0xC0,0x01,0xA9,0x3A,0xC1,0x35,0x0B,0x08,0xA2,0x1A,0x40,0x35,0x09,
|
||||
0x0B,0x58,0x00,0x33,0x34,0x0B,0x14,0xA2,0x1A,0x40,0xA2,0xF0,0x12,0xE9,0x10,0xF1,
|
||||
0x82,0xEA,0x32,0x0E,0x92,0xF0,0x40,0xA5,0x9C,0x06,0x0F,0x58,0x00,0x3B,0xFB,0xEA,
|
||||
0x93,0x02,0x09,0xC2,0x37,0x58,0x3D,0x02,0xF7,0xC0,0x60,0x06,0x07,0x48,0xF8,0xF6,
|
||||
0xF3,0xC5,0x2B,0x09,0x08,0xA0,0x08,0x40,0x2A,0x09,0xD3,0xEA,0x8B,0x02,0x0B,0xCD,
|
||||
0xD8,0xF0,0xC0,0xE8,0x28,0x0B,0x22,0x0A,0x40,0xF0,0x00,0xA1,0xC0,0xE8,0x11,0x40,
|
||||
0xC0,0xE2,0xFF,0x97,0xA9,0x9C,0x2C,0x80,0x96,0xA1,0x49,0xF0,0x8B,0x02,0x25,0xCD,
|
||||
0x1C,0x0B,0x18,0x58,0x00,0x39,0x41,0xEA,0x91,0x02,0xFA,0xC3,0x1E,0x80,0x02,0xA9,
|
||||
0x28,0xC1,0xDF,0xA0,0x40,0xF0,0xFF,0x97,0x97,0x9C,0xA1,0xF0,0x0C,0xE9,0x1B,0x0B,
|
||||
0x21,0xF1,0x1A,0x58,0x0C,0xEB,0x64,0xF1,0x14,0xEB,0x1A,0x80,0x10,0x0B,0x08,0xA2,
|
||||
0x1A,0x40,0x10,0x0B,0x1A,0x58,0x00,0x32,0xA2,0xF0,0x12,0xE9,0x11,0xF1,0x8A,0xEA,
|
||||
0x92,0xF0,0x18,0x58,0x00,0x39,0x41,0xEA,0x91,0x02,0xFA,0xC3,0x08,0x0B,0x00,0xA2,
|
||||
0x1A,0x40,0xA2,0xF0,0x14,0xE9,0x22,0xF1,0x00,0x3B,0x14,0xEB,0x64,0xF1,0xE4,0xE8,
|
||||
0x04,0x0B,0x1C,0x50,0x01,0x60,0xF0,0x6D,0x03,0x00,0x80,0x00,0x2C,0x8F,0x80,0x00,
|
||||
0x68,0x00,0x80,0x00,0x34,0x06,0x80,0x00,0x22,0x00,0x80,0x00,0x48,0x06,0x80,0x00,
|
||||
0x83,0x00,0x80,0x00,0x0E,0x10,0x00,0x00,0x08,0xE7,0xFE,0xFF,0x68,0x90,0x80,0x00,
|
||||
0x10,0x65,0x24,0x0B,0x66,0xA2,0x1A,0x40,0x02,0xA1,0x02,0xA0,0xFF,0x97,0xC4,0x9C,
|
||||
0x21,0x0B,0xAA,0xA2,0x21,0x0C,0x1A,0x40,0xFF,0xA3,0x23,0x40,0x00,0x90,0x42,0x99,
|
||||
0x1F,0x0A,0x00,0xA3,0x13,0x50,0x11,0x58,0x08,0xB2,0x11,0x50,0x28,0xBA,0x23,0x40,
|
||||
0x13,0x40,0x10,0xB2,0x13,0x50,0x1B,0x0A,0x08,0xA1,0x11,0x40,0x1A,0x09,0x04,0xBA,
|
||||
0x11,0x20,0x1A,0x09,0x5C,0xA2,0x0A,0x40,0x08,0xB1,0x0A,0x40,0x01,0xB1,0x0A,0x40,
|
||||
0x01,0xB1,0x0A,0x40,0x16,0x0A,0x05,0xA1,0x11,0x40,0x16,0x09,0x25,0xB2,0x11,0x20,
|
||||
0x40,0xB2,0x13,0x40,0x14,0x0B,0x7F,0xA2,0x1A,0x40,0xE0,0xA3,0x1B,0xF2,0x1C,0x48,
|
||||
0x12,0x0B,0x1B,0x48,0x63,0x00,0xFF,0xAB,0x09,0xC1,0x23,0xEC,0x50,0xBB,0x1B,0xF6,
|
||||
0x1B,0xFE,0xA8,0xAB,0x03,0xC8,0x03,0xA0,0x21,0xEC,0xFF,0x97,0x85,0x9C,0x0C,0x0B,
|
||||
0x1C,0x21,0x10,0x6D,0x0F,0x04,0x80,0x00,0x10,0x04,0x80,0x00,0x61,0x00,0x80,0x00,
|
||||
0x40,0x06,0x80,0x00,0x86,0x00,0x80,0x00,0x07,0x08,0x00,0x00,0x01,0x00,0x80,0x00,
|
||||
0x03,0x00,0x80,0x00,0x00,0x9F,0xFF,0xFF,0x64,0x00,0x80,0x00,0x01,0xE0,0x00,0x00,
|
||||
0xB8,0x93,0x80,0x00,0x00,0x65,0x22,0x0A,0x22,0x0B,0x10,0xA0,0x1A,0x50,0x03,0xA1,
|
||||
0xFF,0x97,0x62,0x9C,0x64,0xA1,0x00,0xA0,0xFF,0x97,0x5E,0x9C,0x06,0xA0,0xFF,0x97,
|
||||
0x45,0x9C,0x01,0xEC,0x06,0xA0,0xFF,0x97,0x57,0x9C,0x1B,0x0B,0xF0,0xA2,0x1A,0x40,
|
||||
0x1A,0x09,0x00,0xA2,0x06,0xB3,0x1A,0x40,0x03,0xB3,0x1A,0x40,0x0A,0x20,0x18,0x0A,
|
||||
0x00,0xA3,0x13,0x40,0x17,0x0A,0x13,0xA1,0x11,0x40,0x17,0x08,0x01,0xBA,0x13,0x40,
|
||||
0x02,0xA2,0x02,0x40,0x01,0xB0,0x01,0x40,0x14,0x09,0x0B,0x40,0x07,0xB1,0x0A,0x40,
|
||||
0x13,0x0A,0x13,0x40,0x13,0x0A,0x13,0x40,0x01,0xA3,0x01,0xB2,0x13,0x40,0x12,0x0A,
|
||||
0x13,0x40,0x12,0x0A,0x12,0x0B,0x12,0xF4,0x12,0xFC,0x1A,0x20,0x11,0x08,0xF0,0xA2,
|
||||
0x00,0xA1,0xFF,0x97,0xCC,0x9C,0x10,0x0B,0x82,0xA2,0x1A,0x40,0x00,0x6D,0xC0,0x46,
|
||||
0x00,0x9E,0x80,0x00,0x7C,0x93,0x80,0x00,0x00,0x04,0x80,0x00,0x0A,0x04,0x80,0x00,
|
||||
0x0E,0x04,0x80,0x00,0x0C,0x02,0x80,0x00,0x0D,0x02,0x80,0x00,0x01,0x02,0x80,0x00,
|
||||
0x12,0x02,0x80,0x00,0x15,0x04,0x80,0x00,0x17,0x02,0x80,0x00,0x80,0x8D,0x80,0x00,
|
||||
0x14,0x02,0x80,0x00,0x00,0xE0,0x80,0x00,0x6B,0x00,0x80,0x00,0x18,0x0B,0x1B,0x58,
|
||||
0x9A,0x49,0x07,0xA1,0x11,0x00,0x17,0x0A,0x20,0xB1,0x11,0x40,0x19,0x29,0x16,0x0A,
|
||||
0x89,0xF5,0x89,0xFF,0x11,0x40,0x19,0x4A,0x0A,0xB2,0x11,0x20,0x99,0x28,0x0E,0xBA,
|
||||
0x11,0x20,0x59,0x29,0x02,0xB2,0x11,0x20,0x19,0x4B,0x0F,0xB2,0x11,0x40,0x9A,0x29,
|
||||
0x18,0xEC,0x0E,0x0B,0x12,0xFA,0x1A,0x40,0xF6,0xB3,0xFF,0xB3,0xFF,0xA2,0x0C,0x09,
|
||||
0x1A,0x40,0x16,0xB0,0x00,0xA3,0xC2,0x1C,0x00,0xAA,0x02,0xC0,0x8A,0xE8,0x3F,0xB2,
|
||||
0x13,0x40,0x01,0xB3,0x30,0xAB,0xF6,0xC1,0x06,0x0B,0x02,0xA2,0x1A,0x40,0x70,0x07,
|
||||
0x7C,0x93,0x80,0x00,0x0D,0x04,0x80,0x00,0x06,0x02,0x80,0x00,0x17,0x02,0x80,0x00,
|
||||
0x00,0x8E,0x80,0x00,0x09,0x02,0x80,0x00,0x00,0x65,0x06,0x0A,0x06,0x0B,0x1A,0x50,
|
||||
0xFF,0x97,0xB0,0x9C,0x05,0x0A,0x80,0xA3,0x11,0x58,0xDB,0xF1,0x0B,0x03,0x13,0x50,
|
||||
0x00,0x6D,0xC0,0x46,0x09,0xF0,0x00,0x00,0x20,0x06,0x80,0x00,0x40,0x06,0x80,0x00,
|
||||
0xF0,0x65,0x17,0x0B,0x9C,0x4D,0x17,0x0A,0x17,0x0B,0x18,0x09,0x00,0xAC,0x07,0xC0,
|
||||
0x28,0xB1,0x0D,0x48,0x40,0xB3,0x80,0xA1,0xED,0xE8,0x15,0x0C,0x09,0xF1,0x1C,0x80,
|
||||
0x28,0xB1,0x0D,0x48,0x40,0xB3,0x80,0xA1,0xED,0xE8,0x11,0x0C,0x09,0xF1,0x07,0x80,
|
||||
0x1E,0x48,0xB6,0xF0,0x36,0x19,0x8E,0xEB,0xC6,0x00,0x16,0x20,0x01,0xB3,0x02,0xB2,
|
||||
0xAB,0x02,0xF5,0xC1,0x0B,0x80,0x1E,0x48,0xB6,0xF0,0x36,0x19,0x17,0x28,0x8E,0xEB,
|
||||
0xC6,0x00,0xF6,0xE9,0x16,0x20,0x01,0xB3,0x02,0xB2,0xAB,0x02,0xF3,0xC1,0xF0,0x6D,
|
||||
0x2C,0x8F,0x80,0x00,0xFC,0x90,0x80,0x00,0x00,0x8E,0x80,0x00,0x6C,0x90,0x80,0x00,
|
||||
0x80,0x8D,0x80,0x00,0x04,0x0A,0x05,0x0B,0x10,0x58,0x11,0x58,0x0B,0x00,0x13,0x50,
|
||||
0x80,0xA3,0x5B,0xF4,0x18,0x00,0x70,0x07,0x40,0x06,0x80,0x00,0xFF,0xFF,0xFF,0xFE,
|
||||
0x70,0x65,0x2B,0x0B,0x00,0xA6,0x1E,0x40,0x2A,0x0D,0x2B,0x58,0x9B,0x49,0x35,0xAB,
|
||||
0x4D,0xC1,0xFA,0xA0,0x80,0xF0,0x02,0x90,0xA5,0x9A,0x27,0x0C,0x29,0x58,0x20,0xEC,
|
||||
0x0C,0xA2,0x02,0x90,0xE2,0x9A,0x20,0xEC,0x08,0xA1,0x02,0x90,0xF9,0x9A,0x23,0x48,
|
||||
0x00,0xA8,0x35,0xC1,0x62,0x48,0xD2,0xE8,0xFF,0xAA,0x31,0xC1,0x42,0xAB,0x0B,0xC1,
|
||||
0x1E,0x0B,0x1A,0x58,0x05,0xA1,0x51,0x40,0x22,0x49,0xC1,0xAA,0x28,0xC1,0x1C,0x0A,
|
||||
0x01,0xA1,0x11,0x40,0x1B,0x58,0x11,0x80,0x98,0xAB,0x21,0xC1,0x17,0x0B,0x1A,0x58,
|
||||
0x05,0xA3,0x53,0x40,0xE1,0x48,0xA3,0x48,0x09,0xF2,0x19,0x03,0x15,0x0B,0x99,0x02,
|
||||
0x16,0xC1,0x23,0x49,0x55,0xAB,0x03,0xC1,0x56,0x40,0x13,0x0B,0x5E,0x40,0x0F,0x80,
|
||||
0xAA,0xAB,0x0D,0xC1,0x11,0x08,0xCC,0xA1,0x02,0x90,0xB8,0x9A,0x00,0xA8,0x03,0xC1,
|
||||
0x00,0x90,0x44,0x9D,0xFF,0x97,0x1A,0x9F,0x08,0x0B,0x1B,0x58,0x00,0xA2,0x5A,0x40,
|
||||
0x03,0x0B,0x08,0xA2,0x1A,0x40,0x03,0x0B,0x1B,0x58,0x30,0xA2,0x9A,0x41,0x70,0x6D,
|
||||
0x83,0x00,0x80,0x00,0x24,0x8F,0x80,0x00,0x0C,0x8F,0x80,0x00,0x28,0x8F,0x80,0x00,
|
||||
0x03,0x00,0x80,0x00,0x36,0x35,0x00,0x00,0x2C,0x8F,0x80,0x00,0x00,0x9E,0x80,0x00,
|
||||
0x30,0x65,0x04,0x3C,0x80,0xF0,0x24,0xE8,0x20,0x58,0x03,0x3D,0x00,0xA8,0x05,0xC0,
|
||||
0x00,0xA9,0x03,0xC0,0x00,0xA3,0x23,0x50,0x01,0xA0,0x10,0x80,0x0B,0xAD,0x08,0xC8,
|
||||
0x19,0xF1,0xCB,0xEA,0x93,0x02,0x09,0xC2,0x28,0xAA,0x07,0xC9,0x01,0xA3,0x23,0x50,
|
||||
0x04,0x80,0x00,0xA0,0x64,0xAD,0x02,0xC9,0x20,0x50,0x00,0x80,0x00,0xA0,0x30,0x6D,
|
||||
0xF0,0x65,0x92,0x60,0x11,0x33,0x7D,0x0B,0x1B,0x58,0x7C,0xB3,0x1B,0x28,0x0C,0x33,
|
||||
0x03,0x28,0x14,0xEC,0x1A,0xF4,0x05,0xEC,0x0E,0xEC,0x79,0x0F,0x00,0xAA,0x00,0xCC,
|
||||
0x89,0x83,0x39,0x1D,0x77,0x0A,0x00,0xA9,0x00,0xC1,0xF9,0x82,0x76,0x08,0x67,0xF1,
|
||||
0x38,0xE8,0x03,0x30,0x12,0x1D,0x0A,0x32,0x00,0xA2,0x08,0xA9,0x00,0xC1,0x0A,0x3A,
|
||||
0xE7,0xF0,0xBA,0xE8,0x71,0x08,0x52,0xF0,0x10,0x1A,0x0F,0x30,0x70,0x08,0x10,0x1A,
|
||||
0x0A,0x3A,0x10,0x30,0x07,0xB2,0x07,0xA0,0x10,0x00,0x1B,0xF4,0x84,0x06,0x1B,0xE4,
|
||||
0x07,0x33,0x67,0x04,0x69,0x0A,0x7F,0xF0,0xBA,0x1A,0x9B,0xEA,0x0D,0x32,0x00,0xA2,
|
||||
0xB0,0x1E,0x05,0x33,0x09,0x30,0x66,0x0B,0xFF,0x1A,0x0E,0x37,0xC7,0xEB,0x05,0x38,
|
||||
0xC2,0xE7,0x83,0xE8,0x53,0x00,0x1B,0xF4,0xF8,0xE7,0x1B,0xFC,0x04,0x33,0x3B,0xE8,
|
||||
0x43,0x00,0x60,0x0A,0x1B,0xF4,0x1B,0xFC,0x0B,0x37,0x03,0x38,0x06,0x33,0x03,0x32,
|
||||
0x00,0xA7,0x00,0xA2,0x8C,0x06,0x08,0x34,0x16,0x80,0x10,0xD8,0x01,0xA1,0x3B,0xEC,
|
||||
0x21,0x02,0x0F,0xC0,0xE3,0xF3,0x57,0x09,0x03,0x3C,0x1B,0xFC,0x8C,0x02,0x02,0xC0,
|
||||
0x9C,0x02,0x03,0xC3,0x03,0x80,0x1F,0xEC,0x03,0x33,0x00,0x80,0x03,0x33,0x9F,0x02,
|
||||
0x00,0xC8,0x3B,0xEC,0x01,0xB2,0x1F,0xEC,0x62,0x05,0xE6,0xC3,0x03,0x3A,0xD0,0xEB,
|
||||
0x00,0xF4,0x08,0x3C,0x00,0xFC,0x64,0xAF,0x07,0xC9,0x4A,0x0B,0x11,0xEC,0x79,0x03,
|
||||
0x58,0x03,0xFF,0x97,0xB3,0x99,0x00,0xF4,0x00,0xFC,0x04,0x39,0x00,0xA3,0x08,0x33,
|
||||
0x02,0xA9,0x1E,0xC9,0x2B,0xA3,0x63,0x03,0x43,0x0A,0xD3,0xE8,0x02,0xB3,0xDB,0x4F,
|
||||
0x05,0xAB,0x16,0xC0,0x0D,0x3A,0x0F,0x39,0x53,0xEA,0x05,0x3A,0x53,0x03,0x06,0x39,
|
||||
0xDB,0xFF,0x08,0x33,0x0B,0xEC,0x04,0x39,0x5B,0xE8,0x1E,0xAB,0x09,0xCD,0x13,0xA8,
|
||||
0x07,0xC8,0x8F,0xA2,0x00,0xA3,0xBA,0x02,0x5B,0x01,0x08,0x3A,0x5B,0x02,0x1A,0x00,
|
||||
0x08,0x32,0x06,0x3F,0x00,0xA3,0x05,0x33,0x02,0xAF,0x1D,0xC9,0x2B,0xA3,0x63,0x03,
|
||||
0x31,0x0A,0xD3,0xE8,0x02,0xB3,0xDB,0x4F,0x05,0xAB,0x15,0xC0,0x0E,0x39,0x10,0x3A,
|
||||
0x0B,0x3F,0x8B,0xEA,0x7B,0x03,0xDB,0xFF,0x05,0x33,0x13,0xA8,0x0C,0xC8,0x06,0x38,
|
||||
0x03,0xEC,0x04,0x38,0x1B,0xE8,0x1E,0xAB,0x06,0xCD,0x03,0x39,0x05,0x3A,0x45,0xA3,
|
||||
0x8B,0x02,0x9B,0x01,0x1A,0x00,0x05,0x32,0x0C,0x3B,0x1B,0xFA,0x0B,0x33,0x07,0x3A,
|
||||
0x09,0x3B,0x0D,0x38,0x0E,0x39,0xFF,0x97,0x85,0x9A,0x0B,0x3F,0x1F,0x0A,0xA3,0xF0,
|
||||
0xB8,0x02,0x05,0xC2,0xD1,0x18,0x1D,0xA9,0x4F,0xC8,0x01,0xB1,0xD1,0x10,0x4C,0x80,
|
||||
0x00,0xA1,0xD1,0x10,0x0B,0x39,0x4A,0xF0,0x90,0x02,0x46,0xC2,0x18,0x0A,0xD2,0x18,
|
||||
0x04,0xAA,0x42,0xCC,0x17,0x09,0x2A,0x28,0xCB,0x18,0x11,0xF4,0x09,0xE4,0xC9,0xEA,
|
||||
0x01,0xA9,0x01,0xCD,0x9A,0xEC,0x02,0x80,0x01,0xB1,0x02,0xCA,0x9A,0xEE,0x12,0xF4,
|
||||
0x12,0xFC,0x2A,0x20,0x10,0x0A,0x33,0x28,0xA1,0xF0,0x8A,0x18,0x19,0xF4,0x09,0xE4,
|
||||
0x89,0xEA,0x01,0xA9,0x1A,0xCD,0x93,0xEC,0x1B,0x80,0xC0,0x46,0x7C,0x93,0x80,0x00,
|
||||
0xCC,0x8E,0x80,0x00,0xF8,0x8E,0x80,0x00,0xAC,0x8E,0x80,0x00,0x98,0x8E,0x80,0x00,
|
||||
0xD8,0x8E,0x80,0x00,0x10,0x27,0x00,0x00,0x4C,0x8F,0x80,0x00,0x00,0x8F,0x80,0x00,
|
||||
0xF4,0x8E,0x80,0x00,0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0x01,0xB1,0x02,0xCA,
|
||||
0x93,0xEE,0x1B,0xF4,0x1B,0xFC,0x33,0x20,0xCC,0x09,0x00,0xA7,0xE8,0x1F,0xA2,0xF0,
|
||||
0x50,0x10,0x1B,0xF4,0xCA,0x09,0x1B,0xE4,0x53,0x10,0xCA,0x0B,0xA7,0xF0,0xFB,0x18,
|
||||
0x03,0x33,0x1A,0xF4,0xC8,0x0B,0xFB,0x18,0x04,0x33,0x19,0xF4,0xC7,0x0B,0xDB,0x1B,
|
||||
0x06,0x33,0xC7,0x0B,0xDB,0x1B,0x07,0x33,0x2B,0xA3,0x18,0xEC,0x60,0x03,0xC5,0x0B,
|
||||
0x18,0xE8,0x09,0x30,0x03,0xEC,0x02,0xB3,0xDB,0x4F,0x12,0xFC,0x09,0xFC,0x05,0xAB,
|
||||
0x00,0xC0,0x8E,0x80,0xC0,0x08,0x03,0x1D,0x02,0xAB,0x00,0xC8,0x4D,0x81,0x08,0x3B,
|
||||
0x05,0x38,0x03,0x02,0x00,0xC0,0x48,0x81,0x12,0xF4,0x09,0xF4,0x12,0xE4,0x09,0xE4,
|
||||
0x03,0x32,0x04,0x31,0x07,0x3A,0x06,0x39,0x08,0xF4,0x11,0xF4,0x00,0xE4,0x09,0xE4,
|
||||
0x03,0x3A,0x04,0x3B,0xFF,0x97,0xF6,0x99,0x64,0xA8,0x20,0xC9,0xB3,0x0B,0xFB,0x18,
|
||||
0x03,0xAB,0x1C,0xC8,0xB0,0x0B,0x1A,0x1D,0x03,0xAA,0x18,0xC9,0x09,0x3B,0x03,0xB3,
|
||||
0xDB,0x4F,0x02,0xAB,0x13,0xC1,0xAE,0x0B,0x1B,0x1D,0x00,0xAB,0x0F,0xC0,0x00,0xA3,
|
||||
0x04,0xAA,0x03,0xC0,0x0A,0x3B,0x07,0xA2,0x04,0xB3,0x13,0x00,0xE2,0xF0,0xD3,0xE8,
|
||||
0xA8,0x0A,0x5B,0xF0,0x9A,0x1A,0x06,0x32,0xA7,0x0A,0x9A,0x1A,0x07,0x32,0x06,0x38,
|
||||
0x03,0x3A,0x07,0xF4,0x03,0x39,0x3F,0xE4,0x79,0xEA,0x07,0x38,0xD7,0xEB,0xFB,0xF0,
|
||||
0xDF,0xE9,0x04,0x3A,0x09,0x31,0x03,0xF4,0x04,0x39,0x1B,0xE4,0x59,0xEA,0xD3,0xEA,
|
||||
0xDA,0xF0,0xD3,0xE8,0x5B,0xF0,0x06,0x33,0x12,0xA3,0x0C,0x31,0x07,0x33,0x7F,0xF0,
|
||||
0xFB,0xE7,0x1B,0xFF,0x06,0x39,0xDB,0xE9,0x03,0x38,0x1B,0xE1,0xC0,0xE8,0xCB,0xE7,
|
||||
0x1B,0xFF,0x5B,0xE8,0x04,0x3A,0x1B,0xE1,0xD2,0xE8,0x08,0x30,0xB8,0xA3,0x05,0x32,
|
||||
0x00,0x33,0x01,0x33,0xB9,0xA0,0xB9,0xA1,0x08,0x3A,0x05,0x3B,0x02,0x90,0x86,0x98,
|
||||
0x00,0xA8,0x0B,0xC0,0x06,0x3A,0x07,0x38,0x13,0xEC,0x0C,0x3A,0x09,0x39,0x01,0xB8,
|
||||
0x9B,0xE8,0x07,0x30,0x7F,0xE8,0x06,0x33,0x00,0xA8,0xD9,0xC1,0x08,0x3F,0x00,0xAF,
|
||||
0x01,0xCC,0x01,0xA0,0x08,0x30,0x05,0x39,0x00,0xA9,0x01,0xCC,0x01,0xA2,0x05,0x32,
|
||||
0x20,0xA7,0x6B,0x06,0xFB,0x1A,0x14,0xA0,0x6F,0x06,0xC7,0x1B,0x2B,0x20,0x37,0x20,
|
||||
0xC3,0x80,0x07,0xAB,0x00,0xC0,0xC0,0x80,0x12,0xF4,0x12,0xE4,0x94,0x06,0x07,0x3A,
|
||||
0x09,0xF4,0x10,0xF4,0x09,0xE4,0x00,0xE4,0x40,0xEA,0x06,0x3F,0xC3,0xE7,0xC0,0xE8,
|
||||
0x3A,0xF4,0x58,0x00,0x12,0xE4,0x63,0x06,0xD2,0xEA,0xD7,0xE7,0xD2,0xE9,0x7A,0x00,
|
||||
0x82,0xE8,0x00,0xA0,0x33,0x1E,0x59,0xEA,0x00,0xA0,0x2F,0x1E,0x05,0x33,0xCB,0xE7,
|
||||
0xC8,0xE8,0x61,0x06,0x58,0x00,0x7B,0xEA,0xD9,0xE7,0x5B,0xE8,0x4B,0x00,0xC1,0xE8,
|
||||
0x65,0x0B,0x1B,0x1D,0x9C,0x06,0x01,0xA3,0x23,0xA9,0x00,0xCC,0x00,0xA3,0x1B,0xF6,
|
||||
0x00,0xAB,0x03,0xC0,0x01,0xA0,0x23,0xA3,0x84,0x05,0x1E,0xC0,0x01,0xA3,0x05,0xAA,
|
||||
0x00,0xCC,0x00,0xA3,0x1B,0xF6,0x00,0xAB,0x12,0xC0,0x07,0xA3,0x9C,0x05,0x0F,0xC8,
|
||||
0x53,0xF0,0x99,0x02,0x0C,0xCD,0x48,0xE0,0x84,0x06,0x94,0x05,0x03,0xCC,0xD0,0xEC,
|
||||
0x84,0x06,0x8C,0x05,0x08,0xCB,0x96,0xAB,0x07,0xCD,0x1B,0xE1,0x96,0xB3,0x04,0x80,
|
||||
0x96,0xA3,0x96,0xA9,0x01,0xCC,0x70,0x80,0x03,0xEC,0x03,0x38,0x03,0x39,0xC9,0xEB,
|
||||
0x3F,0xEA,0x08,0x37,0x0C,0x31,0x08,0x39,0x3F,0xF1,0x7F,0xEA,0x04,0x38,0x05,0x39,
|
||||
0x40,0xEA,0x0F,0x30,0x04,0x38,0x08,0xEA,0x05,0x30,0x05,0x39,0x00,0xF1,0x02,0x32,
|
||||
0x40,0xEA,0x9C,0x06,0x0F,0xA1,0xFB,0xE7,0x1B,0xFF,0xDB,0xE9,0x1B,0xE1,0x09,0x33,
|
||||
0xC3,0xE7,0x1B,0xFF,0x1B,0xE8,0x1B,0xE1,0x06,0x33,0x04,0x3B,0x1A,0xEC,0x06,0x3B,
|
||||
0xD2,0xE8,0x06,0x3B,0x07,0x32,0xDA,0xE7,0x9B,0xE8,0x53,0x00,0x10,0x33,0x09,0x3B,
|
||||
0x1A,0xEC,0x03,0x3B,0xD2,0xE8,0x09,0x3B,0x06,0x32,0xDA,0xE7,0x9B,0xE8,0x53,0x00,
|
||||
0x09,0x33,0x10,0x3B,0x1A,0xEC,0x09,0x3B,0xD2,0xE8,0x09,0x32,0x0F,0x3A,0x0C,0x3B,
|
||||
0x80,0xE8,0x09,0x3A,0xFF,0xE8,0x01,0xB9,0x01,0xA3,0x62,0x05,0x00,0xCC,0x00,0xA3,
|
||||
0x1B,0xF6,0x00,0xAB,0x01,0xC0,0x00,0xA9,0xCD,0xCC,0x02,0x3A,0x09,0x3B,0x93,0x02,
|
||||
0x14,0xCC,0x08,0x3F,0x02,0xB1,0x3B,0xEC,0x4B,0x03,0xDA,0xE7,0x12,0xFF,0xD3,0xE8,
|
||||
0x05,0x3A,0x51,0x03,0x03,0x38,0x1B,0xE1,0x1B,0xE8,0x2B,0x20,0xCB,0xE7,0x1B,0xFF,
|
||||
0x59,0xE8,0x04,0x3B,0x09,0xE1,0xC9,0xE8,0x31,0x20,0x07,0x80,0x18,0xA0,0x6F,0x06,
|
||||
0xC7,0x1B,0x1C,0xA1,0x68,0x06,0x08,0x1A,0x2F,0x20,0x30,0x20,0x13,0x0A,0x06,0x39,
|
||||
0xA3,0xF0,0x99,0x10,0x07,0x3F,0x12,0x0A,0x9F,0x10,0x12,0x0A,0xA3,0xF0,0x99,0x18,
|
||||
0x12,0x0A,0x99,0x10,0x10,0x0A,0x99,0x18,0x11,0x0A,0x99,0x10,0x00,0xA0,0x2A,0x1E,
|
||||
0x00,0xA1,0x73,0x1E,0x0D,0x38,0x0E,0x39,0xFF,0x97,0xAC,0x98,0x0B,0x3A,0x90,0x02,
|
||||
0x00,0xC2,0x77,0x80,0x0C,0x0B,0x1F,0x1D,0x00,0xAF,0x4B,0xC0,0x0C,0x0B,0x1B,0x1D,
|
||||
0x00,0xAB,0x1B,0xC0,0x00,0xA3,0x03,0xAF,0x1C,0xC9,0x43,0x80,0x04,0x8F,0x80,0x00,
|
||||
0x08,0x8F,0x80,0x00,0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0xD4,0x8E,0x80,0x00,
|
||||
0xEC,0x8E,0x80,0x00,0x4C,0x8F,0x80,0x00,0xCC,0x8E,0x80,0x00,0x00,0x8F,0x80,0x00,
|
||||
0x78,0x93,0x80,0x00,0x98,0x8E,0x80,0x00,0xD8,0x8E,0x80,0x00,0x00,0xA3,0x08,0xAF,
|
||||
0x00,0xC1,0x0A,0x3B,0xE1,0xF0,0xCB,0xE8,0x73,0x09,0x5B,0xF0,0x00,0xA0,0x2A,0x1E,
|
||||
0x59,0x1E,0x51,0xEA,0xCA,0xE7,0x89,0xE8,0x70,0x08,0x51,0x00,0x1B,0x1A,0x32,0x28,
|
||||
0x00,0xA9,0x0E,0xC0,0x18,0xF4,0x12,0xF4,0x12,0xE4,0x00,0xE4,0x10,0xEA,0xC3,0xE7,
|
||||
0xC0,0xE8,0x58,0x00,0x64,0xA3,0x58,0x03,0xFE,0x97,0x40,0x9F,0x00,0xF4,0x00,0xFC,
|
||||
0x00,0x80,0x67,0x08,0x0A,0x39,0xE2,0xF0,0x52,0xE8,0x40,0xF0,0x65,0x0B,0x92,0xF0,
|
||||
0x01,0xB0,0xD0,0x10,0x0A,0x3A,0xE3,0xF0,0x29,0x28,0x9B,0xE8,0x5E,0x0A,0x5B,0xF0,
|
||||
0x99,0x12,0x5E,0x0A,0x31,0x28,0x99,0x12,0x0A,0x3B,0x07,0xA2,0x01,0xB3,0x1A,0x00,
|
||||
0x5D,0x0B,0x1A,0x15,0x07,0xAF,0x15,0xC8,0x5C,0x0B,0x01,0xB7,0x1F,0x15,0x11,0x80,
|
||||
0x55,0x08,0x21,0xF1,0x0B,0x12,0x55,0x0B,0x30,0x28,0xC8,0x12,0x01,0xA3,0x13,0x15,
|
||||
0x3B,0x15,0x57,0x0A,0x00,0xA7,0xE9,0x1F,0xA3,0xF0,0x99,0x10,0x00,0xA0,0x31,0x1E,
|
||||
0x54,0x0A,0x99,0x10,0xE3,0xF0,0x54,0x0A,0x1B,0xE9,0x5B,0xF0,0x99,0x1C,0xD3,0xE8,
|
||||
0x5A,0x48,0x12,0xF2,0x0A,0x03,0x03,0x32,0xD9,0x48,0x9A,0x48,0x09,0xF2,0x11,0x03,
|
||||
0x0A,0x31,0x5A,0x49,0x19,0x49,0x12,0xF2,0x0A,0x03,0x63,0xF0,0x04,0x32,0x1B,0xE9,
|
||||
0x4A,0x0A,0x5B,0xF0,0xD3,0xE8,0x5B,0x49,0x00,0xAB,0x50,0xC0,0x48,0x09,0xA7,0xF0,
|
||||
0x79,0x18,0x48,0x0A,0x8C,0x06,0xB9,0x18,0x00,0xA3,0xEA,0x1E,0x00,0xA0,0x33,0x1E,
|
||||
0x60,0x06,0xFF,0x97,0x07,0x98,0x11,0x39,0x8A,0xF0,0x52,0xE8,0x91,0xF0,0x42,0x0B,
|
||||
0x52,0xE8,0x42,0x09,0xF8,0x10,0x8A,0xE8,0x10,0x4A,0x04,0x39,0x84,0x06,0x50,0x4A,
|
||||
0x0A,0xF4,0x52,0xE4,0x00,0xF2,0x61,0x06,0x12,0xF4,0x01,0x03,0x12,0xFC,0x91,0x02,
|
||||
0x2D,0xC2,0x0A,0x38,0x02,0xF4,0x12,0xE4,0x04,0x32,0x04,0x38,0x00,0xA2,0xB1,0x1E,
|
||||
0x41,0xEA,0x18,0xB1,0x30,0xA9,0x22,0xC8,0x03,0x3A,0x11,0xF4,0x00,0xA2,0xA8,0x1E,
|
||||
0x09,0xE4,0x08,0xEA,0x1D,0xB0,0x3A,0xA8,0x19,0xC8,0x2D,0x08,0x38,0x18,0x84,0x06,
|
||||
0x8C,0x05,0x14,0xC1,0x2B,0x0A,0x04,0x38,0xB9,0x18,0x81,0x02,0x0F,0xC1,0x28,0xA2,
|
||||
0x69,0x06,0x51,0x1A,0x0C,0xA0,0x6A,0x06,0x82,0x1A,0x31,0x20,0x2A,0x20,0x1F,0x0A,
|
||||
0x12,0x1D,0x01,0xAA,0x01,0xC8,0x00,0xA2,0x00,0x80,0x01,0xA2,0xFA,0x10,0x24,0x0B,
|
||||
0x1B,0x58,0x76,0xB3,0x1B,0x28,0x0F,0xA2,0x13,0x00,0x28,0xEC,0x31,0xEC,0xB9,0xA2,
|
||||
0x00,0x90,0x26,0x99,0x15,0x80,0x13,0x0B,0x60,0xF1,0xC0,0xE8,0x00,0xA1,0x08,0xA2,
|
||||
0xFE,0x97,0xE5,0x9F,0x10,0x0A,0x00,0xA3,0x13,0x15,0x1A,0x0A,0x03,0xA1,0x11,0x15,
|
||||
0x19,0x09,0xA2,0xF0,0x53,0x10,0x19,0x09,0x3B,0x15,0x53,0x10,0x12,0x0B,0xFF,0xA1,
|
||||
0xD1,0x10,0x00,0xA3,0xEA,0x1E,0x0E,0x0B,0xA4,0xF0,0xE2,0x10,0x00,0xA7,0xF2,0x1F,
|
||||
0x0C,0x0B,0x12,0x60,0xE2,0x10,0xF0,0x6D,0x98,0x8E,0x80,0x00,0xD8,0x8E,0x80,0x00,
|
||||
0x90,0xE2,0x00,0x00,0xAC,0x8E,0x80,0x00,0xF8,0x8E,0x80,0x00,0xCC,0x8E,0x80,0x00,
|
||||
0xD4,0x8E,0x80,0x00,0xEC,0x8E,0x80,0x00,0x64,0x93,0x80,0x00,0xE8,0x93,0x80,0x00,
|
||||
0xA8,0x8E,0x80,0x00,0xF0,0x8E,0x80,0x00,0xF4,0x8E,0x80,0x00,0x48,0x93,0x80,0x00,
|
||||
0x7C,0x93,0x80,0x00,0xE8,0x8E,0x80,0x00,0xFC,0x8E,0x80,0x00,0xD0,0x8E,0x80,0x00,
|
||||
0xF0,0x65,0x51,0x0B,0x88,0x60,0x06,0x31,0x1B,0x58,0x05,0x30,0x06,0x28,0x06,0x38,
|
||||
0x76,0xB3,0x19,0x28,0x00,0x28,0x14,0xEC,0x49,0xF9,0x02,0x30,0x00,0xAE,0x01,0xC0,
|
||||
0x00,0xA9,0x03,0xC1,0x49,0x0B,0xA2,0xF0,0x00,0xA0,0xD0,0x10,0x47,0x0A,0xA3,0xF0,
|
||||
0x94,0x06,0x98,0x18,0x02,0x3A,0x12,0xF4,0x37,0xF4,0x45,0x0D,0x04,0x32,0x00,0xA8,
|
||||
0x05,0xC1,0x3F,0xE4,0x60,0x06,0x12,0xE4,0x1F,0x10,0xEA,0x10,0x7A,0x80,0x00,0xF4,
|
||||
0x02,0xFC,0xED,0x1A,0x3F,0xE4,0x03,0xE4,0x07,0x32,0x04,0x3A,0xFB,0xEA,0xD8,0xE7,
|
||||
0x12,0xE4,0x1B,0xE8,0x04,0x32,0x43,0x00,0x2A,0xF4,0x04,0x38,0x12,0xE4,0x82,0xEA,
|
||||
0xD0,0xE7,0x12,0xE8,0x03,0x35,0x42,0x00,0x8B,0x02,0x02,0xC9,0x14,0xA5,0x8A,0x02,
|
||||
0x39,0xC8,0xD3,0xE8,0x1A,0xF1,0xD3,0xEA,0x58,0xF0,0xFE,0x97,0x0B,0x9E,0x85,0xEE,
|
||||
0x05,0xA8,0x03,0xC8,0x00,0xA5,0x02,0xA8,0x00,0xC9,0x45,0xEE,0xB4,0xA3,0x00,0x33,
|
||||
0xA7,0xA3,0x01,0x33,0xB9,0xA0,0xB9,0xA1,0x3A,0xEC,0x04,0x3B,0x01,0x90,0xFE,0x9D,
|
||||
0x00,0xF6,0x00,0xFE,0x01,0xA8,0x04,0xC1,0x26,0x0B,0xA2,0xF0,0xD3,0x18,0x9B,0xF8,
|
||||
0x15,0x80,0x02,0xA8,0x04,0xC1,0x23,0x0B,0xA2,0xF0,0xD3,0x18,0xDB,0xF8,0x0E,0x80,
|
||||
0x2B,0xA3,0x63,0x03,0x20,0x0A,0xD3,0xE8,0x05,0xB3,0xDB,0x4F,0x01,0xAB,0x07,0xC9,
|
||||
0x1C,0x0B,0xA2,0xF0,0xD3,0x18,0x07,0xA2,0x9A,0x02,0x9B,0x01,0x5B,0x02,0xED,0xE8,
|
||||
0x14,0xAD,0x00,0xC9,0x14,0xA5,0x1F,0xA2,0x02,0x38,0x6B,0xEC,0x55,0xEB,0x07,0x3A,
|
||||
0x36,0xF4,0x11,0xF4,0x02,0xF4,0x03,0x38,0x12,0xE4,0x36,0xE4,0x09,0xE4,0x5E,0x03,
|
||||
0x69,0x03,0x53,0x03,0x02,0xF4,0x12,0xE4,0x55,0x03,0x71,0xE8,0x10,0xB1,0x05,0x3A,
|
||||
0xC9,0xF2,0x5B,0xE9,0x09,0xFC,0x10,0xB3,0x11,0x20,0xDB,0xF2,0x07,0x0A,0x06,0x38,
|
||||
0x09,0xF4,0x1B,0xFC,0xA4,0xF0,0x09,0xE4,0x03,0x20,0xA1,0x10,0x1B,0xF4,0x04,0x0A,
|
||||
0x1B,0xE4,0xA3,0x10,0x08,0x60,0xF0,0x6D,0x7C,0x93,0x80,0x00,0x04,0x8F,0x80,0x00,
|
||||
0x08,0x8F,0x80,0x00,0x00,0x8F,0x80,0x00,0x4C,0x8F,0x80,0x00,0x30,0x65,0x02,0xEC,
|
||||
0x00,0xA3,0x01,0x80,0x52,0xE0,0x01,0xB3,0x1F,0xAA,0xFB,0xCC,0x11,0xEC,0x99,0x00,
|
||||
0x41,0xEA,0x09,0xAB,0x03,0xCD,0x18,0xEC,0x0A,0xB8,0x01,0x01,0x02,0x80,0x0A,0xA0,
|
||||
0xC0,0xEA,0x81,0x00,0x08,0xEC,0x0C,0x0C,0x51,0xF0,0x01,0xB2,0x52,0xF0,0x09,0x1F,
|
||||
0x12,0x1F,0x52,0xEA,0x42,0x03,0x92,0xE2,0x52,0xE8,0xD9,0xF7,0x05,0xC5,0x07,0x09,
|
||||
0x4A,0x03,0x80,0xA5,0xED,0xF1,0x52,0xE9,0xD2,0xE3,0x58,0xE0,0x80,0xA1,0x82,0x00,
|
||||
0x09,0xF1,0x50,0xE8,0x00,0xE3,0x30,0x6D,0x04,0x8D,0x80,0x00,0x05,0xB5,0x00,0x00,
|
||||
0xF0,0x65,0x82,0x60,0x01,0x30,0x15,0xF4,0x18,0xF4,0x01,0x3B,0x2C,0xE4,0x00,0xE4,
|
||||
0x2D,0xFC,0x1F,0x28,0x28,0xEA,0x00,0xF4,0x00,0xE4,0x0E,0xEC,0x3F,0xF4,0x00,0xA3,
|
||||
0xC9,0x1E,0x02,0xEC,0x3F,0xE4,0x09,0xEB,0x50,0x03,0x3A,0xEB,0x00,0x32,0x0A,0xEC,
|
||||
0x51,0x03,0x00,0x3A,0x13,0xEC,0x53,0x03,0xC9,0xE8,0x81,0x02,0x23,0xCB,0x80,0xF3,
|
||||
0xFE,0x97,0x4C,0x9D,0xFF,0x97,0xAA,0x9F,0xA7,0x02,0x06,0xCA,0xE7,0xEB,0x47,0x03,
|
||||
0x01,0x3B,0xFF,0xF9,0xEF,0xEB,0x1F,0x20,0x06,0x80,0x00,0x3A,0x13,0xEC,0x43,0x03,
|
||||
0x01,0x3A,0xDB,0xF9,0xEB,0xE8,0x13,0x20,0x33,0x28,0x1B,0xF4,0x1B,0xE4,0xA3,0x02,
|
||||
0x04,0xCA,0xE4,0xEA,0x60,0x03,0xC0,0xF9,0x2D,0xEA,0x03,0x80,0x1C,0xEB,0x60,0x03,
|
||||
0xC0,0xF9,0x2D,0xE8,0x35,0x20,0x02,0x60,0xF0,0x6D,0xC0,0x46,0xF0,0x65,0x58,0x0B,
|
||||
0x08,0xA2,0x1A,0x40,0x57,0x0B,0x1D,0x58,0x2B,0xEC,0x08,0xB3,0xDA,0x2F,0x56,0x0B,
|
||||
0x10,0xF7,0x99,0xED,0xC0,0xFF,0xC8,0x47,0x96,0xFA,0x22,0xB1,0x0E,0x40,0x91,0xF5,
|
||||
0x89,0xFE,0x09,0xF6,0x0C,0xFE,0x29,0xA7,0xFC,0x14,0x07,0xA7,0x17,0x00,0xDA,0xED,
|
||||
0xD7,0x47,0x4E,0x0A,0x34,0xEB,0xD4,0x47,0x2A,0xEC,0x4C,0xB2,0x17,0x28,0x3A,0xFA,
|
||||
0x5A,0x42,0x1F,0x42,0x2A,0xEC,0x4E,0xB2,0x14,0x28,0x83,0x60,0x01,0x34,0x12,0x48,
|
||||
0x9A,0x42,0x22,0xFA,0xDA,0x42,0x2A,0xEC,0x48,0xB2,0x14,0x48,0x9C,0x44,0x52,0x48,
|
||||
0xDA,0x44,0x2A,0xEC,0x4A,0xB2,0x14,0x48,0x1C,0x44,0x52,0x48,0x1C,0xEC,0x5A,0x44,
|
||||
0x2A,0xB4,0x4A,0xFE,0x22,0x40,0x2B,0xB3,0x00,0xA8,0x02,0xC0,0x89,0xFE,0x19,0x40,
|
||||
0x00,0x80,0x1A,0x40,0x38,0x0C,0x72,0xA3,0x01,0xA0,0x23,0x43,0xA3,0x43,0x60,0x43,
|
||||
0xE0,0x43,0x2B,0xEC,0x64,0xB3,0x1B,0x48,0x3F,0xA2,0x1A,0x00,0x63,0xED,0xDA,0x47,
|
||||
0x00,0xA6,0x1E,0xA3,0xE6,0x45,0xA3,0x45,0x2B,0xEC,0x8E,0xB3,0x18,0x28,0x82,0xF9,
|
||||
0xFF,0xA3,0x11,0xEC,0x19,0x00,0x18,0x00,0x12,0xFA,0x00,0x31,0x21,0x47,0x62,0x47,
|
||||
0x02,0x30,0xA0,0x46,0x00,0xA0,0xE0,0x46,0x28,0xEC,0x8A,0xB0,0x00,0x28,0x80,0xF9,
|
||||
0x01,0xEC,0x19,0x00,0x00,0xFA,0xA1,0x47,0xE0,0x47,0x28,0xEC,0x8C,0xB0,0x00,0x28,
|
||||
0x03,0x00,0x60,0xEC,0xC3,0x47,0xA3,0xEC,0x00,0xA0,0xD8,0x47,0x6B,0x06,0x1B,0x48,
|
||||
0x62,0x45,0x23,0x45,0x68,0x06,0x08,0xA1,0x08,0x1C,0x00,0xA1,0x20,0x46,0x61,0x46,
|
||||
0x01,0x3A,0xB9,0xA1,0x50,0xF3,0x49,0xF0,0xB9,0xB0,0xFE,0x97,0x9F,0x9C,0x03,0xFA,
|
||||
0x20,0x41,0x63,0x41,0x7F,0xF3,0x03,0xFC,0x00,0xFE,0xE0,0x41,0xB9,0xA1,0x38,0xEC,
|
||||
0xA3,0x41,0x49,0xF0,0xB9,0xB0,0xFE,0x97,0x91,0x9C,0x03,0xFA,0x63,0x40,0x03,0xFC,
|
||||
0x20,0x40,0xA3,0x40,0x00,0xFE,0xE3,0xEC,0x20,0xA2,0xE0,0x40,0xDA,0x47,0x23,0xED,
|
||||
0x03,0xA2,0xDA,0x47,0x7A,0xB5,0x2B,0x48,0x0F,0xA2,0x13,0x00,0x2C,0xB4,0x23,0x40,
|
||||
0x07,0x0B,0x01,0xA4,0x03,0x60,0x5C,0x40,0x1E,0x40,0xDE,0x45,0x5E,0x46,0xF0,0x6D,
|
||||
0x83,0x00,0x80,0x00,0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x74,0x90,0x80,0x00,
|
||||
0x2C,0x8F,0x80,0x00,0x10,0x65,0x0E,0x0C,0x0E,0x09,0x20,0x58,0xFE,0x97,0xD0,0x9D,
|
||||
0x00,0xA8,0x14,0xC0,0x0C,0x0B,0x5A,0x48,0x00,0xAA,0x06,0xC0,0x1A,0x48,0x00,0xAA,
|
||||
0x03,0xC0,0x9B,0x2B,0xA2,0x28,0x9A,0x02,0x09,0xC0,0x08,0x0B,0x66,0xA2,0x1A,0x40,
|
||||
0x05,0x0B,0x9A,0x2B,0x02,0x0B,0x9A,0x20,0x05,0x0A,0x12,0x58,0x1A,0x50,0x10,0x6D,
|
||||
0x70,0x8E,0x80,0x00,0x40,0x42,0x0F,0x00,0x2C,0x8F,0x80,0x00,0x0F,0x04,0x80,0x00,
|
||||
0x34,0x06,0x80,0x00,0x10,0x65,0xFF,0x97,0x2B,0x98,0xFF,0x97,0x8B,0x98,0x01,0x90,
|
||||
0xAB,0x9C,0x0C,0x0C,0x80,0xA1,0x20,0xEC,0x09,0xF2,0xCC,0xA2,0x01,0x90,0x69,0x9C,
|
||||
0x20,0xEC,0xCC,0xA1,0x01,0x90,0x7A,0x9C,0x00,0xA8,0x04,0xC1,0xFF,0x97,0x06,0x9F,
|
||||
0xFF,0x97,0xDC,0x98,0x02,0x80,0x00,0xA3,0x23,0x20,0x63,0x20,0xFF,0x97,0x14,0x99,
|
||||
0x10,0x6D,0xC0,0x46,0x00,0x9E,0x80,0x00,0x10,0x65,0xFF,0x97,0xDB,0x9F,0x06,0x0C,
|
||||
0x03,0x80,0xFF,0x97,0xAF,0x9F,0xFF,0x97,0x63,0x99,0x63,0x48,0x00,0xAB,0xF8,0xC0,
|
||||
0x00,0x90,0x24,0x98,0x10,0x6D,0xC0,0x46,0x2C,0x8F,0x80,0x00,0x10,0x65,0x0A,0x0B,
|
||||
0x1B,0x48,0x05,0xAB,0x02,0xC1,0x09,0x0B,0xFF,0xA2,0x1A,0x40,0x08,0x0B,0x1A,0x58,
|
||||
0x08,0x0B,0x09,0x0C,0x1A,0x50,0x00,0xA3,0x23,0x40,0x64,0xA0,0x01,0xA1,0xFE,0x97,
|
||||
0x59,0x9F,0x08,0xA3,0x23,0x40,0x10,0x6D,0x03,0x00,0x80,0x00,0x80,0x9F,0x80,0x00,
|
||||
0x34,0x06,0x80,0x00,0x68,0x90,0x80,0x00,0x83,0x00,0x80,0x00,0xF0,0x65,0xFE,0x97,
|
||||
0xD7,0x9C,0x87,0x0B,0x00,0xA2,0x1A,0x41,0xDA,0x46,0x64,0xA2,0x1A,0x46,0x84,0x0B,
|
||||
0x5B,0x4D,0x00,0xAB,0xFB,0xC0,0x83,0x0B,0x1B,0x58,0xDB,0x28,0x1B,0xFB,0x9C,0x06,
|
||||
0x81,0x0B,0x00,0xA2,0x1A,0x20,0x81,0x0B,0x28,0xB3,0x1A,0x48,0x00,0xA1,0x57,0xF0,
|
||||
0x00,0xA3,0x7F,0x08,0x1E,0x80,0x7F,0x0C,0x7F,0x0E,0xE5,0x1A,0xF4,0x1A,0x2D,0xEB,
|
||||
0x2D,0xF4,0x2D,0xFC,0x7D,0x0E,0x2C,0xF4,0x24,0xE4,0xF5,0x12,0x00,0xAC,0x0D,0xCD,
|
||||
0x26,0xEC,0x64,0x06,0x74,0x03,0xE4,0xE0,0x2C,0xE9,0x24,0xF4,0x24,0xFC,0xC4,0x12,
|
||||
0xB4,0xAC,0x06,0xC9,0x01,0xB1,0x09,0xF4,0x09,0xFC,0x02,0x80,0xC4,0xE8,0x00,0xA5,
|
||||
0x25,0x20,0x02,0xB3,0xBB,0x02,0xDE,0xC1,0x6B,0x0B,0x19,0x20,0x68,0x0B,0x09,0xF6,
|
||||
0x09,0xFE,0x19,0x45,0x6E,0x0B,0x1B,0x48,0x01,0xAB,0x04,0xC1,0x52,0xF0,0x6D,0x08,
|
||||
0x67,0x09,0x01,0x90,0xD6,0x9B,0x62,0x0B,0x1A,0x4D,0x00,0xAA,0x0B,0xC1,0xD9,0x4D,
|
||||
0xA8,0xA9,0x02,0xC9,0x01,0xA2,0x5A,0x46,0x1F,0x80,0xD9,0x4D,0x01,0xB1,0x09,0xF6,
|
||||
0x09,0xFE,0xD9,0x45,0x01,0x80,0x00,0xA2,0xDA,0x45,0x5A,0x46,0xFE,0x97,0x78,0x9C,
|
||||
0x01,0x90,0xC4,0x9C,0x00,0x90,0xEC,0x99,0x00,0x90,0x7E,0x9C,0x00,0x90,0x84,0x9F,
|
||||
0x54,0x0B,0x1B,0x58,0x72,0xB3,0x1B,0x28,0xD8,0xF6,0x02,0xC5,0x5A,0x08,0x00,0x90,
|
||||
0xC7,0x98,0x00,0x90,0xD4,0x98,0x01,0x90,0x01,0x9C,0x4D,0x0B,0x5A,0x4D,0x00,0xAA,
|
||||
0xFC,0xC0,0xDB,0x4E,0x00,0xAB,0x08,0xC0,0x54,0x0B,0x55,0x09,0x18,0x58,0xFE,0x97,
|
||||
0xD7,0x9C,0x00,0xA8,0x01,0xC0,0xFF,0x97,0x59,0x9F,0x45,0x0B,0x5A,0x4E,0x01,0xAA,
|
||||
0x1C,0xC1,0x4B,0x0B,0x1B,0x48,0x05,0xAB,0x08,0xC1,0x4E,0x08,0xFE,0x97,0xA4,0x9B,
|
||||
0x4A,0x0B,0x4D,0x09,0x1A,0x58,0x52,0xE8,0x1A,0x50,0x43,0x80,0x4B,0x08,0x00,0xA1,
|
||||
0xFE,0x97,0xB0,0x9E,0xFE,0x97,0x3C,0x9C,0x3A,0x0B,0x1B,0x58,0x7A,0xB3,0x1B,0x48,
|
||||
0x0F,0xA2,0x1A,0x00,0x39,0x0B,0x01,0xBA,0x2C,0xB3,0x2B,0x80,0x5A,0x4E,0x00,0xAA,
|
||||
0x2A,0xC1,0xD9,0x48,0x00,0xA9,0x0C,0xC0,0xD9,0x48,0x01,0xB9,0x09,0xF6,0x09,0xFE,
|
||||
0xD9,0x40,0x01,0xA1,0x19,0x41,0x3E,0x0B,0x1A,0x40,0x3E,0x0B,0x1A,0x58,0x37,0x0B,
|
||||
0x1A,0x50,0x2B,0x0B,0x1A,0x49,0x01,0xAA,0x02,0xC1,0x52,0xA0,0x01,0xA1,0x07,0x80,
|
||||
0x1B,0x4D,0x00,0xAB,0x02,0xC0,0x52,0xA0,0x00,0xA1,0x01,0x80,0xB6,0xA0,0x02,0xA1,
|
||||
0xFE,0x97,0x80,0x9E,0x22,0x0B,0x1A,0x49,0x01,0xAA,0x0B,0xC1,0x00,0xA2,0x1A,0x41,
|
||||
0x2F,0x0B,0x08,0xA2,0x1A,0x40,0x05,0x80,0x5B,0x4E,0x02,0xAB,0x02,0xC1,0x2E,0x08,
|
||||
0xFE,0x97,0x5A,0x9B,0x1A,0x0B,0x19,0x4F,0x5A,0x4F,0x12,0xF2,0x0A,0x03,0x01,0xB2,
|
||||
0xFF,0xA0,0x11,0xF4,0x02,0x00,0x18,0x4F,0x1A,0x47,0x0A,0xFE,0x59,0x4F,0x5A,0x47,
|
||||
0x1A,0x4E,0x00,0xAA,0x04,0xC0,0x1A,0x4E,0x01,0xBA,0x12,0xF6,0x12,0xFE,0x1A,0x46,
|
||||
0x0F,0x0B,0xDA,0x4B,0x5A,0x43,0xFE,0x97,0x2F,0x9D,0x20,0x0B,0x66,0xA2,0x1A,0x40,
|
||||
0x13,0x0B,0x1A,0x48,0x01,0xAA,0x06,0xC1,0x01,0x90,0xE2,0x9C,0x01,0x90,0x1C,0x9D,
|
||||
0x01,0x90,0x50,0x9C,0x07,0x80,0x1B,0x48,0xFF,0xAB,0x04,0xC1,0x01,0x90,0xD8,0x9C,
|
||||
0x01,0x90,0x12,0x9D,0xF0,0x6D,0x64,0xA0,0xFE,0x97,0x92,0x9D,0xF7,0x86,0xC0,0x46,
|
||||
0x2C,0x8F,0x80,0x00,0x7C,0x93,0x80,0x00,0x7C,0x92,0x80,0x00,0x6C,0x90,0x80,0x00,
|
||||
0x5C,0x91,0x80,0x00,0xFC,0x90,0x80,0x00,0x9C,0x90,0x80,0x00,0x1C,0x92,0x80,0x00,
|
||||
0x03,0x00,0x80,0x00,0xBC,0x91,0x80,0x00,0xE0,0x93,0x80,0x00,0x68,0x90,0x80,0x00,
|
||||
0xC0,0xFB,0x39,0x00,0x14,0x05,0x00,0x00,0x80,0xB0,0xED,0xFF,0xF3,0x01,0x00,0x00,
|
||||
0x83,0x00,0x80,0x00,0x34,0x06,0x80,0x00,0x89,0xA9,0x03,0x00,0x0F,0x04,0x80,0x00,
|
||||
0x70,0x65,0x06,0x49,0x84,0xEC,0x05,0xEC,0x32,0xEC,0x21,0xEC,0xFF,0x97,0x60,0x9C,
|
||||
0x28,0xEC,0x32,0xEC,0x21,0xEC,0x00,0xA3,0xFF,0x97,0x7A,0x98,0x70,0x6D,0xF0,0x65,
|
||||
0x2E,0x0B,0x1B,0x58,0x76,0xB3,0x1B,0x48,0x1B,0xF6,0x1A,0xFF,0x1B,0xF1,0x84,0x60,
|
||||
0x1B,0xFF,0x00,0x32,0x00,0xA6,0x01,0x33,0x49,0x80,0x77,0xF0,0x28,0x0B,0xBF,0xE9,
|
||||
0x7F,0xF0,0xDD,0xE9,0x27,0x0C,0x6A,0x48,0xF9,0x1C,0x12,0xF2,0x63,0x48,0x0A,0x03,
|
||||
0x21,0x48,0x1B,0xF2,0x0B,0x03,0xA1,0x48,0x09,0xF4,0x0B,0x03,0xE1,0x48,0x12,0xF4,
|
||||
0x09,0xF6,0x12,0xE4,0x0B,0x03,0x53,0x03,0x1F,0x0A,0x9B,0xE8,0x5B,0xFB,0x03,0x33,
|
||||
0xEA,0x48,0xA9,0x48,0x63,0x49,0x12,0xF2,0x0A,0x03,0x21,0x49,0x1B,0xF2,0x0B,0x03,
|
||||
0xA1,0x49,0x09,0xF4,0x0B,0x03,0xE1,0x49,0x12,0xF4,0x09,0xF6,0x12,0xE4,0x0B,0x03,
|
||||
0x53,0x03,0x15,0x0A,0x9B,0xE8,0x5B,0xFB,0x02,0x33,0xE1,0x4A,0xA3,0x4A,0x09,0xF2,
|
||||
0x19,0x03,0x00,0x3A,0x02,0x78,0xFE,0x97,0xAC,0x9B,0x61,0x4A,0x23,0x4A,0x09,0xF2,
|
||||
0x19,0x03,0x01,0x3A,0x03,0x78,0xFE,0x97,0xA4,0x9B,0x03,0x3B,0x08,0x0A,0xD3,0x15,
|
||||
0x1B,0xFA,0x6B,0x40,0x02,0x3B,0xAB,0x40,0x1B,0xFA,0xEB,0x40,0x01,0xB6,0x07,0x0A,
|
||||
0xD3,0x4B,0x9E,0x02,0xB1,0xCB,0x04,0x60,0xF0,0x6D,0xC0,0x46,0x7C,0x93,0x80,0x00,
|
||||
0xE0,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0xFF,0x0F,0x00,0x00,0x2C,0x8F,0x80,0x00,
|
||||
0xF0,0x65,0x4E,0x0A,0x55,0x28,0x16,0x28,0x2B,0xF1,0x5B,0xEB,0x9B,0xE9,0x9E,0x60,
|
||||
0x9B,0xE0,0x09,0x33,0x33,0xF1,0x9B,0xEB,0x5B,0xE9,0x9B,0xE0,0x0A,0x33,0x90,0x2A,
|
||||
0x94,0x28,0x03,0xF1,0x1B,0xEA,0x1B,0xE9,0x9B,0xE0,0x0B,0x33,0x23,0xF1,0x1B,0xEB,
|
||||
0x1B,0xE8,0x9B,0xE0,0x0C,0x33,0x93,0x2B,0x91,0x29,0x03,0x33,0x03,0x3F,0x1B,0xF1,
|
||||
0xDB,0xEB,0x5B,0xE8,0x9B,0xE0,0x0D,0x33,0x0B,0xF1,0x5B,0xEA,0xDB,0xE9,0x9B,0xE0,
|
||||
0x0E,0x33,0xD3,0x2B,0x04,0x33,0x17,0x2C,0x3B,0xF1,0x05,0x37,0xDB,0xEB,0x04,0x3F,
|
||||
0xDB,0xE9,0x9B,0xE0,0x0F,0x33,0x3B,0xF1,0xDB,0xEB,0x05,0x3F,0xDB,0xE9,0x9B,0xE0,
|
||||
0x10,0x33,0x00,0xA3,0x07,0x33,0x4A,0x80,0x00,0xAB,0x01,0xC0,0x04,0xAB,0x03,0xC1,
|
||||
0x04,0xAA,0x37,0xC0,0x00,0xAA,0x35,0xC0,0x91,0xEE,0x08,0xEC,0x41,0x02,0x41,0x01,
|
||||
0x00,0xA9,0x06,0xC0,0x00,0xAB,0x04,0xC1,0x09,0x3F,0xAE,0x02,0x2B,0xC8,0x0A,0x3F,
|
||||
0x29,0x80,0x00,0xAA,0x08,0xC1,0x08,0x3F,0x00,0xAF,0x05,0xC0,0x02,0x38,0x0B,0x3F,
|
||||
0x84,0x02,0x20,0xC8,0x0C,0x3F,0x1E,0x80,0x04,0xAA,0x09,0xC1,0x08,0x3F,0x00,0xAF,
|
||||
0x06,0xC0,0x01,0x38,0x03,0x39,0x0D,0x3F,0x88,0x02,0x14,0xC8,0x0E,0x3F,0x12,0x80,
|
||||
0x00,0xA9,0x08,0xC0,0x04,0xAB,0x06,0xC1,0x04,0x38,0x05,0x39,0x0F,0x3F,0x88,0x02,
|
||||
0x09,0xC8,0x10,0x3F,0x07,0x80,0x07,0x38,0x14,0x09,0x47,0xF0,0x01,0xB0,0x7F,0x1A,
|
||||
0x07,0x30,0x00,0x80,0x00,0xA7,0x06,0x38,0x01,0xB2,0x07,0x20,0x02,0xB0,0x06,0x30,
|
||||
0x05,0xAA,0xB9,0xC1,0x01,0xB3,0x02,0x38,0x01,0x39,0x05,0xAB,0x0F,0xC0,0x9A,0xF0,
|
||||
0xD2,0xE8,0x52,0xF0,0x11,0x7F,0xBF,0xE8,0x06,0x37,0x00,0xA2,0x9F,0xEE,0x00,0x32,
|
||||
0x7A,0x02,0x7A,0x01,0x08,0x32,0x02,0x30,0x01,0x31,0x00,0xA2,0xA4,0x87,0x11,0x79,
|
||||
0x02,0x08,0x32,0xA2,0x01,0x90,0xD5,0x99,0x1E,0x60,0xF0,0x6D,0x5C,0x91,0x80,0x00,
|
||||
0xF0,0x65,0xB4,0x0E,0xB4,0x0C,0x00,0xA3,0x8A,0x60,0x33,0x40,0x20,0xEC,0x19,0xA1,
|
||||
0xFE,0x97,0xA2,0x9A,0x18,0xA8,0x00,0xCD,0x59,0x81,0x40,0xF0,0x03,0x1B,0xBD,0xAB,
|
||||
0x00,0xC8,0x54,0x81,0xFF,0x97,0x4C,0x9F,0x20,0xEC,0x19,0xA1,0xFE,0x97,0x94,0x9A,
|
||||
0x05,0xEC,0x18,0xA8,0x00,0xCD,0x4A,0x81,0x43,0xF0,0x1B,0x1B,0xBD,0xAB,0x00,0xC8,
|
||||
0x45,0x81,0xA6,0x0A,0x11,0xEC,0x80,0xB1,0x0B,0x40,0x81,0xB2,0x1B,0xFA,0x13,0x40,
|
||||
0x01,0xA3,0x33,0x40,0xA2,0x0B,0x05,0xA1,0x18,0x50,0xFE,0x97,0x6F,0x99,0x00,0xF6,
|
||||
0x00,0xFE,0x83,0xF1,0x9F,0x0E,0x1B,0xEA,0x9B,0xF0,0x9F,0x0C,0x30,0x40,0x18,0xEA,
|
||||
0x9E,0x0B,0x40,0xE9,0x18,0x40,0x19,0xA2,0x20,0xEC,0x00,0xA1,0xFE,0x97,0xB7,0x9A,
|
||||
0x63,0xE9,0x1A,0x48,0x01,0xA7,0x38,0xEC,0x02,0x03,0x1A,0x40,0x33,0x48,0x00,0xAB,
|
||||
0x06,0xC0,0x6A,0xEF,0xA2,0xE8,0x11,0x48,0x0F,0x03,0x17,0x40,0x03,0xAB,0x05,0xC8,
|
||||
0x6B,0xED,0xE3,0xE8,0x19,0x48,0x01,0xA2,0x0A,0x03,0x1A,0x40,0x8F,0x0B,0x1B,0x48,
|
||||
0x00,0xAB,0x07,0xC0,0x6A,0xEE,0xA2,0xE8,0x10,0x48,0x01,0xA1,0x01,0x03,0x11,0x40,
|
||||
0x03,0xAB,0x05,0xC8,0x01,0xB5,0x65,0xE9,0x2A,0x48,0x01,0xA3,0x13,0x03,0x2B,0x40,
|
||||
0x84,0x0B,0x1A,0x48,0x85,0x0B,0x19,0x48,0x93,0xF0,0x9B,0xE8,0x5B,0xE8,0x1D,0xEF,
|
||||
0x9E,0xEF,0x58,0xEF,0x01,0x35,0x40,0xF0,0x02,0x36,0x5E,0xEE,0x03,0x36,0x08,0x30,
|
||||
0x1E,0xED,0x01,0x38,0x5D,0xEC,0x04,0x36,0x5E,0xED,0x05,0x36,0x6D,0xF0,0x76,0x0E,
|
||||
0x40,0xF0,0x06,0xB3,0x07,0x35,0x09,0x30,0x06,0x33,0xB4,0x06,0x00,0xA3,0x00,0xAB,
|
||||
0x11,0xC1,0x04,0xA9,0x01,0xC1,0x01,0xA3,0x11,0x80,0x00,0xAA,0x01,0xC1,0x01,0xA3,
|
||||
0x0B,0x80,0x07,0x3D,0x66,0x06,0xAD,0x1B,0x08,0x38,0x00,0x35,0x87,0x1B,0x09,0x38,
|
||||
0x85,0x1B,0x01,0x38,0x33,0x80,0x01,0xAB,0x0E,0xC1,0x00,0xA9,0x10,0xC0,0x00,0xAA,
|
||||
0x01,0xC1,0x02,0xA3,0x0A,0x80,0x03,0x3E,0x63,0x08,0x75,0xF0,0x2D,0x1A,0x00,0x35,
|
||||
0x08,0x3D,0x02,0x3E,0x2F,0x1A,0x1F,0x80,0x02,0xAB,0x11,0xC1,0x00,0xA9,0x01,0xC1,
|
||||
0x03,0xA3,0x0F,0x80,0x04,0xAA,0x01,0xC1,0x03,0xA3,0x09,0x80,0x03,0x3E,0x5A,0x08,
|
||||
0x75,0xF0,0x2D,0x1A,0x05,0x3E,0x00,0x35,0x75,0xF0,0x2F,0x1A,0x04,0x3E,0x0B,0x80,
|
||||
0x04,0xA9,0x19,0xC0,0x04,0xAA,0x17,0xC0,0x53,0x08,0x07,0x3D,0x2D,0x1A,0x05,0x3E,
|
||||
0x00,0x35,0x75,0xF0,0x2F,0x1A,0x06,0x3E,0x75,0xF0,0x2D,0x1A,0x30,0xEC,0x00,0x3E,
|
||||
0xBF,0xE9,0xBD,0x02,0x08,0xCC,0x00,0xA8,0x06,0xCB,0x4F,0x0D,0x40,0xE9,0x05,0x48,
|
||||
0x00,0xAD,0x01,0xC1,0x01,0xA5,0x05,0x40,0x01,0xB3,0x04,0xAB,0xA7,0xC1,0x02,0xBA,
|
||||
0x1B,0xC4,0x90,0xF0,0x4B,0xEE,0x82,0xE8,0xD2,0xE8,0x43,0x0D,0xA0,0xE8,0x52,0xF0,
|
||||
0x52,0xE9,0x01,0xB1,0x01,0xA5,0x00,0xAB,0x09,0xCB,0x04,0xAB,0x0D,0xCC,0x06,0x48,
|
||||
0x00,0xAE,0x04,0xC1,0x17,0x28,0x56,0x29,0xB7,0x02,0x00,0xC2,0x05,0x40,0x01,0xB0,
|
||||
0x02,0xB2,0x8B,0x02,0x01,0xC0,0x01,0xB3,0xED,0x87,0x3C,0x0B,0x18,0x48,0x39,0x0B,
|
||||
0x1A,0x48,0x02,0xB2,0x04,0xAA,0x1C,0xCC,0x91,0xF0,0x43,0xEE,0x8A,0xE8,0xD2,0xE8,
|
||||
0x31,0x0D,0xA1,0xE8,0x05,0xBA,0x52,0xF0,0x52,0xE9,0x01,0xB0,0x01,0xA5,0x00,0xAB,
|
||||
0x09,0xCB,0x04,0xAB,0x0D,0xCC,0x0E,0x48,0x00,0xAE,0x04,0xC1,0x57,0x29,0x16,0x28,
|
||||
0xB7,0x02,0x00,0xC2,0x0D,0x40,0x01,0xB1,0x02,0xB2,0x83,0x02,0x01,0xC0,0x01,0xB3,
|
||||
0xED,0x87,0x2A,0x0B,0x1A,0x48,0x02,0xBA,0x1D,0xC4,0x26,0x0B,0x18,0x48,0x43,0xEE,
|
||||
0x99,0xF0,0xC9,0xE8,0x8A,0xE8,0x20,0x0D,0xA1,0xE8,0x52,0xF0,0x52,0xE9,0x01,0xB0,
|
||||
0x01,0xA5,0x5E,0xEC,0x09,0xC0,0x04,0xAB,0x0D,0xCC,0x0E,0x48,0x00,0xAE,0x04,0xC1,
|
||||
0x17,0x28,0x56,0x28,0xB7,0x02,0x00,0xC2,0x0D,0x40,0x05,0xB1,0x0A,0xB2,0x83,0x02,
|
||||
0x01,0xC0,0x01,0xB3,0xED,0x87,0x19,0x0B,0x18,0x48,0x02,0xB0,0x04,0xA8,0x1E,0xCC,
|
||||
0x14,0x0B,0x19,0x48,0x4B,0xEE,0x9A,0xF0,0xD2,0xE8,0x12,0xE8,0x0E,0x08,0xA4,0xE8,
|
||||
0x52,0xF0,0x12,0xE8,0x01,0xB1,0x01,0xA0,0x5D,0xEC,0x0A,0xC0,0x04,0xAB,0x0E,0xCC,
|
||||
0x25,0x48,0x00,0xAD,0x05,0xC1,0x95,0xEE,0x16,0x28,0x2D,0x28,0xAE,0x02,0x00,0xC2,
|
||||
0x20,0x40,0x05,0xB4,0x0A,0xB2,0x8B,0x02,0x01,0xC0,0x01,0xB3,0xEC,0x87,0x0A,0x60,
|
||||
0xF0,0x6D,0xC0,0x46,0x41,0x93,0x80,0x00,0x5C,0x91,0x80,0x00,0xA4,0x8F,0x80,0x00,
|
||||
0x44,0x93,0x80,0x00,0x40,0x93,0x80,0x00,0x80,0x92,0x80,0x00,0x42,0x93,0x80,0x00,
|
||||
0x10,0x65,0x09,0xF6,0x14,0xF4,0x09,0xFE,0x24,0xFC,0x04,0xA9,0x11,0xC0,0x03,0xA9,
|
||||
0x0A,0xC8,0x02,0xA9,0x04,0xC0,0x01,0xA9,0x0B,0xC1,0x40,0xF2,0xFF,0x97,0x76,0x9A,
|
||||
0x40,0xF2,0xFF,0x97,0x73,0x9A,0x04,0x80,0x08,0xA9,0x02,0xC1,0x03,0xEC,0x58,0x03,
|
||||
0x40,0xFA,0x60,0x03,0x64,0xA1,0xFE,0x97,0x0D,0x98,0x80,0xA3,0x9B,0xF0,0xC0,0xE8,
|
||||
0x10,0x6D,0xF0,0x65,0x8D,0x60,0x06,0x31,0x06,0x3A,0x07,0x28,0x13,0x28,0x75,0x09,
|
||||
0x7F,0xE8,0x5B,0xE8,0x3F,0xF4,0x1B,0xF4,0x1B,0xFC,0x3F,0xFC,0x1D,0xF4,0x3C,0xF4,
|
||||
0x24,0xE4,0x2D,0xE4,0x05,0x30,0x00,0x33,0x01,0x33,0x28,0xEC,0x68,0x03,0x23,0xEC,
|
||||
0x63,0x03,0xC0,0xE8,0xFF,0x97,0x4A,0x9A,0x6B,0x0B,0x3E,0xEC,0x02,0x30,0x98,0x02,
|
||||
0x00,0xC8,0xCD,0x80,0x00,0xAD,0x13,0xCA,0x00,0xAC,0x06,0xCA,0x7E,0x02,0xFF,0xA3,
|
||||
0x36,0xF4,0x03,0x33,0x36,0xFC,0x02,0xA3,0x02,0x80,0x01,0xA1,0x03,0x31,0x01,0xA3,
|
||||
0x00,0x39,0x4A,0x02,0x12,0xF4,0x12,0xFC,0x01,0x32,0xFF,0xA2,0x04,0x32,0xB0,0x80,
|
||||
0x00,0xAC,0x00,0xCD,0xA9,0x80,0x7E,0x02,0x01,0xA3,0x36,0xF4,0xFF,0xA1,0x04,0x33,
|
||||
0x36,0xFC,0x03,0x31,0x03,0xA3,0xA4,0x80,0x1C,0x48,0x0C,0x78,0x84,0x14,0x1C,0x49,
|
||||
0x0B,0x78,0x84,0x14,0x1C,0x4A,0x09,0x78,0x44,0x12,0x1C,0x4B,0x07,0x78,0x01,0xB2,
|
||||
0x44,0x12,0x01,0xB3,0x02,0xB1,0x04,0xAA,0xEE,0xC1,0x01,0x3A,0x37,0xF4,0x13,0xF4,
|
||||
0x1B,0xE4,0x3F,0xE4,0x00,0x33,0x9F,0x02,0x19,0xCA,0x78,0xF2,0x19,0xEC,0xFD,0x97,
|
||||
0xA9,0x9F,0x01,0xA5,0x04,0xEC,0xFF,0xA8,0x2D,0xC8,0x00,0xAE,0x0B,0xC0,0x00,0x3B,
|
||||
0x39,0xEC,0x58,0xF2,0xFD,0x97,0x9E,0x9F,0xA0,0xA3,0x5B,0xF1,0x04,0xEC,0x00,0xA5,
|
||||
0x98,0x02,0x1F,0xC8,0x01,0x80,0xA0,0xA4,0x64,0xF1,0x00,0xA5,0x1B,0x80,0x00,0x39,
|
||||
0x48,0xF2,0x39,0xEC,0xFD,0x97,0x8E,0x9F,0x02,0xA5,0x04,0xEC,0xFF,0xA8,0x12,0xC8,
|
||||
0x01,0x3A,0x00,0xAA,0x0A,0xC0,0x78,0xF2,0x00,0x39,0xFD,0x97,0x83,0x9F,0xA0,0xA3,
|
||||
0x5B,0xF1,0x04,0xEC,0x03,0xA5,0x98,0x02,0x04,0xC8,0x01,0x80,0xA0,0xA4,0x64,0xF1,
|
||||
0x03,0xA5,0x00,0x80,0x1C,0xEC,0x0C,0x7B,0x59,0x1D,0x6F,0xF0,0x09,0x7B,0xFA,0x1A,
|
||||
0x20,0xEC,0xFF,0x97,0x45,0x9F,0x00,0x30,0x0B,0x7B,0x59,0x1D,0x07,0x7B,0xFA,0x1A,
|
||||
0x20,0xEC,0xFF,0x97,0x3D,0x9F,0x02,0x3B,0x1D,0xEC,0x28,0x0B,0x00,0x39,0xED,0xE8,
|
||||
0x0B,0xEC,0x6B,0x03,0x26,0x0A,0x36,0xF4,0x9B,0xE8,0x36,0xE4,0x07,0xEC,0x02,0x39,
|
||||
0x30,0xEC,0x58,0x03,0xFD,0x97,0x56,0x9F,0x7D,0x03,0x01,0x39,0x20,0x0B,0xC4,0xF1,
|
||||
0x08,0xF4,0xED,0xE8,0x00,0xE4,0x68,0x03,0x02,0x39,0xFD,0x97,0x4B,0x9F,0xB9,0xA3,
|
||||
0x24,0xFC,0xC0,0xF1,0xDB,0xF0,0x00,0xFC,0x22,0xEC,0x9C,0x02,0x00,0xC9,0x1A,0xEC,
|
||||
0x03,0x39,0x0B,0xF6,0x1B,0xE6,0x11,0xEC,0x1A,0xEC,0x4A,0x03,0xB9,0xA3,0xDB,0xF0,
|
||||
0xD2,0xE8,0x05,0x39,0xB9,0xA3,0xDB,0xF0,0x0A,0x20,0x02,0xEC,0x98,0x02,0x00,0xC9,
|
||||
0x1A,0xEC,0x04,0x39,0x0B,0xF6,0x1B,0xE6,0x11,0xEC,0x1A,0xEC,0x4A,0x03,0xB9,0xA3,
|
||||
0xDB,0xF0,0x06,0x39,0xD2,0xE8,0x0A,0x20,0x0A,0x80,0x01,0xA2,0x04,0x32,0x03,0x32,
|
||||
0x04,0xA3,0x08,0x0A,0x01,0xBB,0x1B,0xF1,0xD3,0xE8,0x00,0xA1,0x00,0xA2,0x53,0x87,
|
||||
0x0D,0x60,0xF0,0x6D,0x38,0xFA,0xFF,0xFF,0x56,0x04,0x00,0x00,0xAA,0xFB,0xFF,0xFF,
|
||||
0x00,0xAC,0x08,0x00,0x30,0x01,0x00,0x00,0xF0,0x65,0xCD,0x0B,0x18,0x29,0x94,0x60,
|
||||
0x00,0x30,0x9E,0x2A,0xCB,0x0B,0x00,0xA2,0xDA,0x43,0xCB,0x08,0x00,0xA1,0x19,0xA2,
|
||||
0xFE,0x97,0x55,0x98,0xC9,0x0B,0x1B,0x48,0x00,0xAB,0x00,0xC1,0x85,0x81,0xC8,0x0D,
|
||||
0x2C,0xEC,0x28,0xEC,0x00,0xA1,0x0C,0xA2,0x0C,0xB4,0xFE,0x97,0x48,0x98,0x20,0xEC,
|
||||
0x00,0xA1,0x0C,0xA2,0xFE,0x97,0x43,0x98,0x00,0xA3,0x15,0x80,0x03,0x48,0x01,0xA7,
|
||||
0x1F,0x02,0x06,0xC0,0x0F,0x28,0x13,0x28,0xFB,0xE8,0x13,0x20,0x23,0x28,0xFF,0xE8,
|
||||
0x27,0x20,0xBC,0x0B,0x02,0xB2,0x01,0xB0,0x02,0xB1,0x9A,0x02,0xEE,0xC1,0x63,0x06,
|
||||
0x05,0xB3,0x02,0xB4,0x19,0xAB,0x07,0xC0,0xB7,0x0F,0xD8,0xE9,0xB7,0x0F,0x59,0xF0,
|
||||
0x2A,0xEC,0xC9,0xE9,0x9C,0x06,0xE1,0x87,0xB3,0x08,0x00,0xA1,0x19,0xA2,0xFE,0x97,
|
||||
0x1E,0x98,0x00,0x38,0x00,0x3A,0x40,0xE0,0x71,0xE0,0xB1,0x0B,0xB1,0x0C,0x76,0xEA,
|
||||
0x12,0xEA,0x00,0xA7,0x08,0x30,0x09,0x31,0x0C,0x36,0x0B,0x32,0x0A,0x33,0x0D,0x34,
|
||||
0x06,0x37,0x00,0xA5,0x38,0x81,0x00,0xA0,0x10,0x7B,0x0D,0x3A,0x58,0x50,0x06,0x3B,
|
||||
0x02,0xDA,0x10,0x30,0x18,0xEC,0xA2,0x0B,0x0E,0x31,0xC0,0xE8,0x05,0xA1,0x0D,0x32,
|
||||
0xFD,0x97,0xB2,0x9F,0x9A,0x0F,0x01,0x30,0x02,0xB8,0x43,0xF0,0xFF,0xE8,0x01,0x3C,
|
||||
0x6B,0xF0,0x5B,0xE9,0x5B,0xF0,0x03,0xB4,0xC2,0xE8,0x02,0x30,0x98,0x09,0x07,0x34,
|
||||
0x04,0xEC,0x01,0x38,0x52,0xF0,0x00,0xA6,0x8A,0xE8,0x05,0x33,0x1B,0xE8,0x04,0x32,
|
||||
0x00,0x36,0x03,0x33,0x33,0x80,0x04,0xAC,0x2C,0xC8,0x02,0x39,0x8C,0x02,0x04,0xC0,
|
||||
0x04,0x38,0x03,0x28,0x94,0x02,0x1F,0xC1,0x0C,0x80,0x05,0x38,0x03,0x3A,0x8C,0x0B,
|
||||
0x01,0xE9,0x01,0xBA,0x49,0xF0,0x52,0xF0,0xD2,0x1A,0xC8,0x1A,0x03,0x39,0x50,0x03,
|
||||
0x4A,0xF0,0x07,0x80,0x03,0x39,0x86,0x0A,0x01,0xB1,0x49,0xF0,0x88,0x1A,0x03,0x39,
|
||||
0x58,0x03,0x4B,0xF0,0x99,0x1A,0xFD,0x97,0x69,0x9E,0x3B,0x28,0x43,0x03,0x00,0x3A,
|
||||
0x12,0xE8,0xF6,0xE8,0x00,0x32,0x05,0x80,0x3A,0x28,0x5A,0x03,0x00,0x38,0xC0,0xE8,
|
||||
0x00,0x30,0xB6,0xE8,0x04,0x39,0x02,0xB1,0x04,0x31,0x01,0xB4,0x02,0xB7,0x01,0x3A,
|
||||
0x07,0x3B,0x02,0xB2,0x9C,0x02,0xC6,0xC1,0x06,0x3C,0x20,0xEC,0x7A,0x0C,0x05,0xA1,
|
||||
0x00,0xE9,0x10,0x36,0xFD,0x97,0x58,0x9F,0x10,0x7B,0x01,0x30,0x6C,0x0A,0x02,0xB8,
|
||||
0x5F,0x58,0x43,0xF0,0xD3,0xE8,0x03,0x33,0x6B,0xF0,0x5B,0xE9,0x5B,0xF0,0xC2,0xE8,
|
||||
0x02,0x30,0x01,0x39,0x01,0x38,0x52,0xF0,0xA4,0xE8,0x03,0xB0,0x07,0x33,0x5B,0xE8,
|
||||
0x05,0x34,0x0F,0x30,0x02,0x3C,0x00,0xA6,0x04,0x33,0x39,0x80,0x04,0xAC,0x30,0xC8,
|
||||
0x02,0x3B,0x9C,0x02,0x04,0xC0,0x05,0x38,0x03,0x28,0x94,0x02,0x24,0xC1,0x10,0x80,
|
||||
0x07,0x38,0x04,0x3A,0x5E,0x0B,0x01,0xE9,0x01,0xBA,0x52,0xF0,0x49,0xF0,0x59,0xE8,
|
||||
0x9A,0xE8,0x92,0x29,0x88,0x29,0x04,0x39,0x50,0x03,0x4A,0xF0,0x9B,0xE8,0x99,0x29,
|
||||
0x0A,0x80,0x04,0x39,0x56,0x0A,0x01,0xB1,0x49,0xF0,0x51,0xE8,0x88,0x29,0x04,0x39,
|
||||
0x58,0x03,0x4B,0xF0,0xD2,0xE8,0x91,0x29,0xFD,0x97,0x08,0x9E,0x03,0x3A,0x13,0x28,
|
||||
0x43,0x03,0x36,0xE8,0xFF,0xE8,0x04,0x80,0x03,0x38,0x02,0x28,0x5A,0x03,0xF6,0xE8,
|
||||
0xBF,0xE8,0x03,0x39,0x05,0x3A,0x02,0xB1,0x02,0xB2,0x03,0x31,0x05,0x32,0x01,0xB4,
|
||||
0x01,0x3A,0x0F,0x3B,0x02,0xB2,0x9C,0x02,0xC0,0xC1,0x10,0x38,0x00,0x39,0xFD,0x97,
|
||||
0xED,0x9D,0x04,0xEC,0x29,0xBC,0x38,0xEC,0xFF,0xBC,0x31,0xEC,0x10,0x34,0xFD,0x97,
|
||||
0xE5,0x9D,0x08,0x3F,0x29,0xB8,0xFF,0xB8,0x11,0x30,0xBC,0x02,0x06,0xCA,0x3B,0xEB,
|
||||
0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,0xE4,0xEA,0x08,0x80,0x0B,0x39,0x8C,0x02,
|
||||
0x06,0xCD,0x63,0xEA,0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,0x1C,0xE9,0x10,0x34,
|
||||
0x09,0x3A,0x90,0x02,0x06,0xCA,0x13,0xEA,0x9A,0xF0,0xD3,0xE8,0x9B,0xF0,0xDB,0xE1,
|
||||
0xC0,0xEA,0x08,0x80,0x0C,0x3B,0x98,0x02,0x06,0xCD,0xC3,0xEA,0x9A,0xF0,0xD3,0xE8,
|
||||
0x9B,0xF0,0xDB,0xE1,0x18,0xE8,0x11,0x30,0x10,0x3B,0x10,0x7C,0xA3,0x50,0x63,0x58,
|
||||
0x12,0x78,0xE3,0x50,0x13,0x79,0xFF,0x97,0xAC,0x9D,0xA3,0x58,0x07,0xAB,0x01,0xCC,
|
||||
0x08,0xA3,0xA3,0x50,0x10,0x7B,0xDA,0x58,0x07,0xAA,0x01,0xCC,0x08,0xA2,0xDA,0x50,
|
||||
0x10,0x7B,0x99,0x58,0xDA,0x58,0xC9,0xE0,0xD2,0xE0,0x99,0x50,0xDA,0x50,0xAB,0xF0,
|
||||
0x5B,0xE9,0x0E,0x3F,0x98,0xF0,0x1B,0xE8,0x17,0x08,0x7C,0xF0,0x1B,0x0F,0xC3,0xE8,
|
||||
0xE7,0x1D,0x18,0xEC,0x08,0xB0,0x87,0x40,0x18,0x0F,0xE4,0xE9,0x64,0x48,0xC4,0x40,
|
||||
0x00,0x3C,0x36,0xE9,0x1E,0x42,0x36,0xFA,0x46,0x40,0x18,0xED,0x19,0x41,0x82,0x40,
|
||||
0x09,0xFA,0x12,0xFA,0x41,0x40,0xC2,0x40,0x0A,0x3F,0x3D,0x40,0x06,0x38,0x19,0xB7,
|
||||
0x0C,0xB0,0x0A,0x37,0x06,0x30,0x01,0xB5,0x08,0x09,0x0B,0x48,0x9D,0x02,0x00,0xCA,
|
||||
0xC1,0x86,0x2D,0xF6,0x03,0x0B,0x2D,0xFE,0xDD,0x43,0x14,0x60,0xF0,0x6D,0xC0,0x46,
|
||||
0x48,0x8D,0x80,0x00,0x2C,0x8F,0x80,0x00,0x48,0x93,0x80,0x00,0x41,0x93,0x80,0x00,
|
||||
0xF0,0x93,0x80,0x00,0xFA,0x93,0x80,0x00,0x80,0x92,0x80,0x00,0x5C,0x91,0x80,0x00,
|
||||
0x5C,0x93,0x80,0x00,0x44,0x93,0x80,0x00,0xFC,0x93,0x80,0x00,0x70,0x07,0x70,0x65,
|
||||
0x00,0xA2,0x02,0xA8,0x30,0xCD,0x2B,0xA4,0x61,0x03,0xC2,0xEE,0x17,0x0B,0x52,0xF0,
|
||||
0x52,0xE8,0xD6,0x1C,0x9A,0xE8,0x55,0x48,0x82,0xEE,0x52,0xF0,0x01,0xB8,0x52,0xE8,
|
||||
0x2D,0xF2,0x40,0xF0,0x41,0xE8,0x35,0x03,0xD6,0x1C,0x9A,0xE8,0x54,0x48,0xCA,0x1C,
|
||||
0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,0x24,0xF2,0x1A,0xEC,0x34,0x03,0x19,0xBA,
|
||||
0x12,0xEB,0x10,0xF4,0x05,0xC4,0x21,0xEC,0x14,0xB9,0x49,0xEB,0x01,0xA2,0x08,0xF4,
|
||||
0x0A,0xC5,0x22,0xEC,0x19,0xBA,0xD3,0xEA,0x19,0xF4,0x04,0xC4,0x14,0xBD,0x2C,0xEB,
|
||||
0x02,0xA2,0x23,0xF4,0x00,0xC5,0x00,0xA2,0x10,0xEC,0x70,0x6D,0x4C,0x8F,0x80,0x00,
|
||||
0xF0,0x65,0x16,0xF6,0x36,0xFE,0x2B,0xA3,0x32,0xEC,0x5A,0x03,0x84,0x60,0x49,0x0C,
|
||||
0x00,0x32,0xA5,0xE8,0xEA,0x48,0xAB,0x48,0x12,0xF2,0xAF,0x4C,0x1A,0x03,0xEB,0x4C,
|
||||
0x01,0xB5,0xED,0x4F,0x01,0xBD,0x2D,0xF6,0x2D,0xFE,0x1B,0xF2,0x03,0x35,0x3B,0x03,
|
||||
0x6F,0xF0,0x00,0x3D,0x7F,0xE9,0x3D,0x1D,0xE7,0xE9,0x7F,0x48,0x2E,0xEC,0x3F,0xF2,
|
||||
0x3E,0x03,0x03,0x3F,0x00,0x3D,0x08,0xB7,0x7F,0xF0,0x7F,0xE9,0x3D,0x1D,0xE7,0xE9,
|
||||
0x7F,0x48,0x3F,0xF2,0x2F,0x03,0x35,0xF4,0x2D,0xE4,0xAE,0xEA,0xF5,0xE7,0x76,0xE9,
|
||||
0x3F,0xF4,0x6E,0x00,0x3F,0xE4,0x75,0xEC,0xFE,0xEA,0xF7,0xE7,0xF6,0xE9,0x7E,0x00,
|
||||
0x01,0xB6,0x02,0x50,0x02,0x36,0x0B,0x50,0x31,0xAA,0x03,0xCC,0x01,0xA2,0xB5,0x02,
|
||||
0x12,0xCC,0x54,0x80,0x2C,0x0F,0x2C,0x0E,0x7F,0x4B,0x36,0x4B,0x3F,0xF2,0x37,0x03,
|
||||
0x31,0xA6,0xBC,0x06,0x76,0x02,0xB4,0x04,0x01,0x37,0x94,0x05,0x06,0xCC,0x02,0x3F,
|
||||
0xBD,0x02,0x44,0xCD,0x01,0x3A,0x01,0xBA,0x02,0x50,0x3F,0x80,0x22,0x0E,0xB6,0x4B,
|
||||
0xB4,0x06,0x21,0x0E,0xF7,0x4B,0x66,0x06,0x3F,0xF2,0x3E,0x03,0xB4,0x06,0x40,0xA6,
|
||||
0x76,0x02,0x37,0xEC,0x67,0x04,0x9F,0x02,0x07,0xCD,0x00,0xA7,0x00,0x3C,0xBC,0x06,
|
||||
0x01,0x34,0x02,0xA7,0x64,0x06,0x94,0x06,0x1C,0x80,0x02,0x3E,0xB5,0x02,0x26,0xCA,
|
||||
0x01,0xA7,0x7F,0x02,0x3B,0xEC,0x02,0x50,0x63,0x04,0x1F,0x80,0x26,0xEC,0x01,0x3A,
|
||||
0x09,0xB6,0x76,0xF0,0xB6,0xE8,0x0F,0x0A,0xB2,0x1C,0x00,0x32,0x0D,0x0A,0xB6,0xE8,
|
||||
0x76,0x48,0x00,0x3A,0x36,0xF2,0x32,0x03,0x93,0x02,0x00,0xCD,0x13,0xEC,0x01,0xB7,
|
||||
0x3F,0xF6,0x3F,0xFE,0x03,0x3E,0x01,0xB4,0xB7,0x02,0xE7,0xC3,0x62,0x06,0x4A,0xAB,
|
||||
0x05,0xCC,0x02,0x3F,0xBD,0x02,0x02,0xCA,0x02,0x50,0x01,0xA3,0x0B,0x50,0x04,0x60,
|
||||
0xF0,0x6D,0xC0,0x46,0x4C,0x8F,0x80,0x00,0x6C,0x90,0x80,0x00,0xF0,0x65,0x12,0xF6,
|
||||
0x2B,0xA3,0x12,0xFE,0x5A,0x03,0x3A,0x0F,0x87,0x60,0x04,0x30,0x05,0x31,0xBB,0xE8,
|
||||
0x01,0xB3,0xDB,0x4F,0x37,0x0C,0x00,0xA0,0x01,0x33,0x00,0xA3,0x02,0x33,0x25,0xEC,
|
||||
0x03,0x30,0x00,0xA6,0x06,0x32,0x84,0x06,0x37,0x80,0x06,0x38,0x30,0x09,0x5A,0xF0,
|
||||
0x12,0xE8,0x50,0x1C,0x52,0xE8,0x51,0x48,0x09,0xF2,0x01,0x03,0x18,0xEC,0x06,0x3A,
|
||||
0x08,0xB0,0x2B,0x0F,0x40,0xF0,0x80,0xE8,0xC2,0x1D,0xC0,0xE9,0x40,0x48,0x00,0xF2,
|
||||
0x02,0x03,0x08,0xEC,0xB1,0x02,0x00,0xC2,0x30,0xEC,0x06,0xF4,0x36,0xFC,0x08,0xEC,
|
||||
0xA9,0x02,0x00,0xC9,0x28,0xEC,0x03,0x3F,0x05,0xF4,0x68,0x06,0x2D,0xFC,0x02,0x20,
|
||||
0xBA,0x02,0x02,0xC2,0x0C,0xA7,0x3F,0x1A,0x07,0x20,0x6F,0x06,0x3F,0x28,0x38,0xF4,
|
||||
0x00,0xFC,0x03,0x30,0x10,0xEC,0xA2,0x02,0x00,0xC9,0x20,0xEC,0x04,0xF4,0x02,0x38,
|
||||
0x80,0xE8,0x02,0x30,0x24,0xFC,0x8C,0x04,0x01,0xB3,0x1A,0xF6,0x01,0x39,0x12,0xFE,
|
||||
0x8A,0x02,0xC2,0xC3,0x60,0x06,0x02,0xA9,0x14,0xC9,0x0F,0xEC,0x02,0xBF,0x3F,0xF6,
|
||||
0x3F,0xFE,0x80,0xEB,0x39,0xEC,0x40,0xEB,0xFD,0x97,0x20,0x9C,0x04,0x3A,0x02,0x3B,
|
||||
0x03,0x39,0x10,0x50,0x58,0xEA,0x00,0xEB,0x39,0xEC,0xFD,0x97,0x17,0x9C,0x05,0x3A,
|
||||
0x10,0x50,0x0A,0x80,0x01,0x39,0xFD,0x97,0x11,0x9C,0x04,0x3B,0x01,0x39,0x18,0x50,
|
||||
0x02,0x38,0xFD,0x97,0x0B,0x9C,0x05,0x3F,0x38,0x50,0x07,0x60,0xF0,0x6D,0xC0,0x46,
|
||||
0x4C,0x8F,0x80,0x00,0xFF,0xFF,0x00,0x00,0xF0,0x65,0xC7,0x0B,0xDB,0x4B,0x8E,0x60,
|
||||
0x06,0xA2,0xC6,0x08,0x00,0xA1,0x05,0x33,0xFD,0x97,0x51,0x9D,0xC4,0x0B,0x1A,0xEC,
|
||||
0x81,0xB3,0x80,0xB2,0x1B,0x48,0x12,0x48,0x1B,0xF2,0x13,0x03,0x63,0xAB,0x08,0xC8,
|
||||
0xC0,0x0B,0x1B,0x58,0x7A,0xB3,0x1B,0x48,0x0F,0xA2,0x1A,0x00,0xBE,0x0B,0x2C,0xB3,
|
||||
0x1A,0x40,0xBD,0x0B,0x2C,0xB3,0x1B,0x48,0x00,0xA0,0x07,0x33,0x04,0x30,0x00,0xA5,
|
||||
0xCE,0x82,0x00,0xA1,0x0D,0x31,0x0C,0x31,0xA9,0xF0,0x49,0xE9,0x8B,0xF0,0xB7,0x0A,
|
||||
0xC9,0xE8,0x89,0xE8,0x0C,0x4D,0x2B,0xA2,0x62,0x03,0xB5,0x0B,0xD2,0xE8,0x53,0xEC,
|
||||
0xDE,0x4F,0x0B,0xEC,0x08,0xB3,0x58,0x48,0x09,0x4A,0x00,0xF2,0x08,0x03,0x02,0x30,
|
||||
0x99,0x48,0xDB,0x48,0x1B,0xF2,0x0B,0x03,0x08,0x33,0x03,0xB2,0xD3,0x4F,0x00,0xAB,
|
||||
0x09,0xC0,0xA5,0x0F,0xFA,0x4C,0x01,0xA3,0x22,0x01,0x13,0x02,0x03,0xC0,0xFA,0x4C,
|
||||
0xA3,0x00,0x9A,0x03,0xFA,0x44,0x2B,0xA3,0x63,0x03,0xA5,0x0A,0xD3,0xE8,0xDA,0xEC,
|
||||
0x00,0xA0,0xD0,0x47,0x02,0xB3,0xDB,0x4F,0x00,0xAB,0x02,0xC1,0xA1,0x0B,0x01,0xA2,
|
||||
0x1A,0x15,0xA0,0x0B,0x1B,0x1D,0x00,0xAB,0x4E,0xC0,0x9C,0x09,0x07,0x3A,0x8C,0x06,
|
||||
0x9B,0x0F,0xA9,0xF0,0xB2,0x02,0x25,0xC9,0x2B,0xA3,0x18,0xEC,0x60,0x03,0x72,0xF0,
|
||||
0x49,0xE9,0x03,0x30,0x12,0xE8,0x88,0xF0,0x09,0xE8,0x61,0x04,0x08,0xED,0x09,0x49,
|
||||
0x8C,0x06,0x41,0x48,0x63,0x06,0x09,0xF2,0x19,0x03,0xB9,0x14,0x09,0xFA,0xBA,0xE8,
|
||||
0x51,0x40,0x32,0xEC,0x03,0x39,0x08,0xB2,0x52,0xF0,0x53,0xE8,0xC1,0x48,0x82,0x48,
|
||||
0x09,0xF2,0x0A,0x03,0x01,0xB6,0xFA,0x14,0x36,0xF6,0x12,0xFA,0xFB,0xE8,0x5A,0x40,
|
||||
0x36,0xFE,0x21,0x80,0x2B,0xA3,0x18,0xEC,0x60,0x03,0x72,0xEE,0x49,0xE9,0x52,0xF0,
|
||||
0x03,0x30,0x12,0xE8,0x88,0xF0,0x09,0xE8,0x61,0x04,0x08,0xED,0x09,0x49,0x8C,0x06,
|
||||
0x41,0x48,0x63,0x06,0x09,0xF2,0x19,0x03,0xB9,0x14,0x09,0xFA,0xBA,0xE8,0x51,0x40,
|
||||
0x03,0x39,0xF2,0xED,0x52,0xF0,0x53,0xE8,0xC1,0x48,0x82,0x48,0x09,0xF2,0x0A,0x03,
|
||||
0xFA,0x14,0x12,0xFA,0xFB,0xE8,0x5A,0x40,0x02,0xAE,0x76,0xC9,0x2B,0xA1,0x61,0x03,
|
||||
0x73,0x0A,0x73,0xEE,0x88,0xE8,0x10,0xB1,0x5B,0xF0,0x89,0xE8,0xC9,0xE8,0xC0,0xE8,
|
||||
0xE3,0xF0,0x71,0x0A,0x1B,0xE9,0x06,0x31,0x03,0x30,0x5B,0xF0,0xD3,0xE8,0x5A,0x29,
|
||||
0x09,0x32,0x9F,0x29,0x0A,0x37,0x1B,0x2A,0x0B,0x33,0x66,0x0B,0x1B,0x58,0x8A,0xB3,
|
||||
0x1B,0x28,0x00,0xA1,0x42,0x1E,0x06,0x38,0x3F,0xA7,0x1F,0x00,0x00,0xA1,0x43,0x1E,
|
||||
0xA5,0xA1,0x00,0x31,0x01,0x31,0xB9,0xA0,0xB9,0xA1,0x00,0x90,0x2F,0x9B,0x00,0xA8,
|
||||
0x02,0xC0,0x05,0xBF,0x3F,0xF4,0x3F,0xFC,0x60,0x0B,0x02,0x3A,0x9A,0x02,0x39,0xCC,
|
||||
0x09,0x38,0x03,0xEC,0x7B,0x03,0x9B,0xF2,0x1B,0xFC,0x9A,0x02,0x12,0xCB,0x06,0xBF,
|
||||
0x3F,0xF4,0x0A,0x39,0x3F,0xFC,0x0B,0xEC,0x7B,0x03,0x9B,0xF2,0x1B,0xFC,0x9A,0x02,
|
||||
0x08,0xCB,0x0B,0x38,0x47,0x03,0x08,0x3A,0xBF,0xF2,0x13,0xF4,0x1B,0xE4,0x3F,0xFC,
|
||||
0xBB,0x02,0x1F,0xCA,0xE3,0xF0,0x50,0x0A,0x1B,0xE9,0x5B,0xF0,0xD3,0xE8,0x03,0x39,
|
||||
0xDA,0x28,0x0A,0x20,0xA8,0xF0,0x19,0x29,0x06,0x3B,0x40,0xE9,0x19,0x20,0x83,0xF0,
|
||||
0xC0,0xE8,0x46,0x0B,0x18,0xE8,0x03,0xED,0x02,0x41,0x12,0xFA,0x99,0x40,0x09,0xFA,
|
||||
0x5A,0x40,0xD9,0x40,0x3C,0x0B,0x01,0xA1,0xDA,0x4C,0xA1,0x00,0x0A,0x03,0x12,0xF6,
|
||||
0x12,0xFE,0xDA,0x44,0x38,0x0B,0xDB,0x4C,0x23,0x01,0xDF,0xF7,0x05,0xC5,0x05,0x3B,
|
||||
0x01,0xBB,0x1B,0xF6,0x1B,0xFE,0x05,0x33,0xC7,0x81,0x2B,0xA3,0x18,0xEC,0x60,0x03,
|
||||
0x37,0x0A,0x13,0xE8,0x59,0xEC,0xCE,0x47,0x03,0x30,0x99,0xEC,0xC8,0x4F,0x01,0xA8,
|
||||
0x6E,0xC8,0x24,0xB3,0x1A,0x49,0xD9,0x48,0x12,0xF2,0x0A,0x03,0x59,0x49,0x09,0xF4,
|
||||
0x0A,0x03,0x99,0x49,0x09,0xF6,0x0A,0x03,0x02,0x39,0x8A,0x02,0x07,0xCA,0xD9,0x40,
|
||||
0x02,0x38,0x02,0xFA,0x1A,0x41,0x00,0xA2,0x5A,0x41,0x02,0xFE,0x9A,0x41,0x30,0xEC,
|
||||
0x21,0xEC,0xFF,0x97,0x5C,0x9D,0x00,0xA8,0x0C,0xC0,0x22,0xEC,0x0D,0x78,0x0C,0x79,
|
||||
0xFF,0x97,0x8E,0x9D,0x2B,0xA3,0x63,0x03,0x21,0x0A,0xD3,0xE8,0x02,0xB3,0x02,0xA2,
|
||||
0xDA,0x47,0x23,0x80,0x07,0x39,0x1E,0x0F,0xB1,0x02,0x19,0xC8,0x0C,0x79,0x22,0xEC,
|
||||
0x0D,0x78,0xFF,0x97,0x1B,0x9E,0xAB,0xF0,0x5B,0xE9,0x9A,0xF0,0x9B,0xE8,0x17,0x0A,
|
||||
0xD3,0xE8,0x2B,0xA2,0x62,0x03,0xBF,0xE8,0x3A,0xEC,0x24,0xB2,0xD1,0x48,0x12,0x49,
|
||||
0x12,0xF2,0x11,0x03,0x19,0x42,0x09,0xFA,0x59,0x42,0x02,0xB7,0x07,0xA3,0x04,0x80,
|
||||
0x2B,0xA3,0x63,0x03,0xFF,0xE8,0x02,0xB7,0x01,0xA3,0xFB,0x47,0xE3,0xF0,0x0E,0x0A,
|
||||
0x1B,0xE9,0x0D,0x39,0x5B,0xF0,0x99,0x12,0xD3,0xE8,0x0C,0x3A,0x08,0xA6,0x5A,0x20,
|
||||
0x6A,0x06,0xB2,0x1A,0x9A,0x20,0x4A,0x81,0x2C,0x8F,0x80,0x00,0xE0,0x93,0x80,0x00,
|
||||
0xA4,0x8F,0x80,0x00,0x7C,0x93,0x80,0x00,0x6C,0x90,0x80,0x00,0x48,0x93,0x80,0x00,
|
||||
0x4C,0x8F,0x80,0x00,0x90,0x8E,0x80,0x00,0x64,0x93,0x80,0x00,0xCF,0x07,0x00,0x00,
|
||||
0x02,0xA8,0x45,0xC1,0xAF,0xF0,0x7F,0xE9,0xB8,0xF0,0x3F,0xE8,0xD6,0x08,0xC7,0xE9,
|
||||
0x38,0xED,0x08,0x30,0x3F,0x49,0x02,0x37,0x47,0x48,0x02,0x38,0x3F,0xF2,0x38,0x03,
|
||||
0x07,0xF4,0x3F,0xE4,0x02,0x37,0x48,0x48,0x9F,0x48,0x00,0xF2,0x07,0x03,0xBC,0x06,
|
||||
0x02,0x3F,0xBC,0x04,0x60,0x06,0x40,0xE0,0x02,0x30,0x0D,0x30,0x08,0x3F,0xBF,0x48,
|
||||
0xBC,0x06,0x08,0x3F,0xF8,0x48,0x67,0x06,0x00,0xF2,0x38,0x03,0x9F,0x4C,0xDB,0x4C,
|
||||
0x00,0xF4,0x1B,0xF2,0x3B,0x03,0x00,0xE4,0x03,0x3F,0xC0,0xE8,0x73,0xEE,0x5B,0xF0,
|
||||
0xFF,0xE8,0xBC,0x06,0x6B,0x06,0x08,0xA7,0xFB,0x1C,0x40,0xE0,0x67,0x06,0x0C,0x30,
|
||||
0xD3,0x15,0x02,0x3B,0x1F,0xFA,0x13,0xEC,0x63,0x04,0x5F,0x40,0x03,0x3F,0x07,0xB6,
|
||||
0x76,0xF0,0xF6,0xE9,0x90,0x15,0x00,0xFA,0x96,0xE9,0x70,0x40,0x03,0xA3,0x46,0x80,
|
||||
0x03,0xA8,0x46,0xC1,0xAF,0xF0,0x7F,0xE9,0xB8,0xF0,0x3F,0xE8,0xB2,0x08,0xC7,0xE9,
|
||||
0x38,0xED,0x08,0x30,0x3F,0x49,0x02,0x37,0x47,0x48,0x02,0x38,0x3F,0xF2,0x38,0x03,
|
||||
0x07,0xF4,0x3F,0xE4,0x02,0x37,0x48,0x48,0x9F,0x48,0x00,0xF2,0x07,0x03,0xBC,0x06,
|
||||
0x02,0x3F,0xBC,0x04,0x60,0x06,0x40,0xE0,0x02,0x30,0x0D,0x30,0x08,0x3F,0xBF,0x48,
|
||||
0xBC,0x06,0x08,0x3F,0xF8,0x48,0x67,0x06,0x00,0xF2,0x38,0x03,0x9F,0x4C,0xDB,0x4C,
|
||||
0x00,0xF4,0x1B,0xF2,0x3B,0x03,0x00,0xE4,0x03,0x3F,0xC0,0xE8,0x73,0xEE,0x5B,0xF0,
|
||||
0xFF,0xE8,0xBC,0x06,0x6B,0x06,0x08,0xA7,0xFB,0x1C,0x40,0xE0,0x67,0x06,0x0C,0x30,
|
||||
0xD3,0x15,0x02,0x3B,0x1F,0xFA,0x13,0xEC,0x63,0x04,0x5F,0x40,0x03,0x3F,0x07,0xB6,
|
||||
0x76,0xF0,0xF6,0xE9,0x90,0x15,0x00,0xFA,0x96,0xE9,0x70,0x40,0x07,0xA3,0xCB,0x47,
|
||||
0xA5,0x80,0x04,0xA8,0x02,0xC1,0x00,0xA0,0xC8,0x47,0xA0,0x80,0x07,0xA2,0xCA,0x47,
|
||||
0xA9,0xF0,0x49,0xE9,0x8A,0xF0,0x89,0xE8,0x8B,0x0A,0x51,0xE8,0x0A,0xED,0x56,0x48,
|
||||
0x09,0x49,0x36,0xF2,0x0E,0x03,0x36,0xF4,0x36,0xE4,0x0D,0x36,0xD7,0x48,0x91,0x48,
|
||||
0x3F,0xF2,0x0F,0x03,0x85,0x0A,0x3F,0xF4,0x3F,0xE4,0x12,0x58,0x0C,0x37,0x72,0xB2,
|
||||
0x12,0x28,0x91,0xF6,0x00,0xC4,0x82,0x80,0x05,0xB3,0x02,0x33,0xDB,0x4F,0x02,0xAB,
|
||||
0x7D,0xC8,0xE3,0xF0,0x7E,0x0A,0x1B,0xE9,0x5B,0xF0,0x98,0x1A,0x03,0x30,0xD3,0xE8,
|
||||
0x5B,0x28,0x06,0x33,0xA5,0xA3,0x32,0xEC,0x00,0x33,0x01,0x33,0xB9,0xA1,0x3B,0xEC,
|
||||
0xB9,0xA0,0x00,0x90,0x9B,0x99,0x03,0xEC,0x5A,0xEE,0x93,0x01,0x5B,0x02,0x14,0xA1,
|
||||
0x19,0x00,0x03,0x3B,0xF2,0xEA,0x12,0xF4,0x12,0xE4,0x09,0x31,0xD1,0xE7,0x50,0xE8,
|
||||
0x06,0x3A,0xBB,0xEA,0x1B,0xF4,0x48,0x00,0x1B,0xE4,0x08,0x30,0xD8,0xE7,0x1B,0xE8,
|
||||
0x08,0x3A,0x43,0x00,0x99,0xE8,0x09,0xF4,0x09,0xE4,0x50,0xA9,0x03,0xCD,0x02,0x38,
|
||||
0x03,0xA3,0xC3,0x47,0x38,0x80,0x32,0xA9,0x03,0xCD,0x02,0x39,0x02,0xA3,0xCB,0x47,
|
||||
0x32,0x80,0x09,0x3A,0x91,0x02,0x2F,0xCD,0x02,0x38,0xC0,0x4F,0x00,0xA2,0x84,0x06,
|
||||
0x94,0x05,0x29,0xC1,0x03,0x38,0x06,0x3A,0x00,0xF4,0x00,0xE4,0x12,0xF4,0x84,0x06,
|
||||
0x12,0xE4,0x66,0x04,0x94,0x06,0x02,0x3A,0x01,0xA0,0xD0,0x47,0x09,0x3A,0x67,0x04,
|
||||
0x76,0xE0,0x7F,0xE0,0x00,0xAA,0x17,0xC0,0x1E,0xA9,0x00,0xCC,0x00,0xA0,0x00,0xF6,
|
||||
0x00,0xA8,0x11,0xC0,0x59,0xF0,0x08,0x38,0xC9,0xE8,0x88,0x02,0x03,0xCD,0xA2,0xF0,
|
||||
0x01,0xA1,0x50,0x0B,0x07,0x80,0x08,0x3A,0x51,0xF0,0x8A,0xE8,0x93,0x02,0x03,0xCD,
|
||||
0x4D,0x0B,0xA2,0xF0,0x01,0xA1,0xD1,0x10,0x2B,0xA3,0x63,0x03,0x4B,0x0A,0xD3,0xE8,
|
||||
0x05,0xB3,0xDB,0x4F,0x00,0xAB,0x08,0xC1,0x03,0x3E,0x06,0x3F,0x33,0xF4,0x1B,0xE4,
|
||||
0x0D,0x33,0x3B,0xF4,0x1B,0xE4,0x0C,0x33,0x01,0x80,0x0D,0x36,0x0C,0x37,0x0D,0x3A,
|
||||
0x00,0xAA,0x12,0xC0,0x04,0x3B,0x59,0xF0,0x41,0x08,0xC9,0xE8,0x0C,0x3E,0x49,0xF0,
|
||||
0x43,0xE8,0x9E,0x40,0x36,0xFA,0xDE,0x40,0x42,0x14,0x12,0xFA,0x5A,0x40,0x1C,0x41,
|
||||
0x04,0x3B,0x01,0xB3,0x1B,0xF6,0x1B,0xFE,0x04,0x33,0x01,0xB5,0x2D,0xF4,0x2D,0xFC,
|
||||
0x38,0x0C,0xE3,0x4B,0x9D,0x02,0x00,0xC2,0x2B,0x85,0x05,0x3E,0x00,0xAE,0x00,0xC0,
|
||||
0xA1,0x80,0x0C,0x36,0x0D,0x36,0x2C,0x0B,0x1D,0x4D,0x2B,0xA1,0x69,0x03,0x2F,0x0B,
|
||||
0x58,0xE8,0x42,0xEC,0x14,0xA4,0x6F,0x06,0xD6,0x4F,0xE7,0x1D,0x2E,0x0A,0x57,0x15,
|
||||
0x84,0xEC,0xE2,0x4F,0x01,0xAA,0x08,0xC1,0x02,0xAE,0x6D,0xC9,0x0D,0x78,0x0C,0x79,
|
||||
0x2A,0xEC,0xFF,0x97,0x6B,0x9C,0x07,0xA3,0x14,0x80,0x02,0xAA,0x14,0xC1,0x76,0xF8,
|
||||
0x72,0xF0,0x52,0xE8,0xD0,0x1C,0x9A,0xE8,0x52,0x48,0x12,0xF2,0x02,0x03,0x08,0xB6,
|
||||
0x0D,0x32,0x76,0xF0,0x71,0xE8,0xCA,0x1C,0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,
|
||||
0x0C,0x33,0x03,0xA3,0xE3,0x47,0x58,0x80,0x03,0xAA,0x13,0xC1,0x72,0xEE,0x52,0xF0,
|
||||
0x52,0xE8,0xD0,0x1C,0x9A,0xE8,0x52,0x48,0x12,0xF2,0x02,0x03,0x07,0xB6,0x0D,0x32,
|
||||
0x76,0xF0,0x71,0xE8,0xCA,0x1C,0x59,0xE8,0x4B,0x48,0x1B,0xF2,0x13,0x03,0x0C,0x33,
|
||||
0x04,0xA3,0xE7,0x87,0x07,0xAA,0x21,0xC1,0xEB,0xF0,0x09,0x0A,0x5B,0xE9,0x5B,0xF0,
|
||||
0xD3,0xE8,0x06,0xA1,0x5A,0x1E,0x0D,0x32,0x08,0xA2,0x9B,0x1E,0x0C,0x33,0x05,0xA3,
|
||||
0xE3,0x47,0x03,0xB0,0x24,0x80,0xC0,0x46,0x48,0x93,0x80,0x00,0x7C,0x93,0x80,0x00,
|
||||
0x64,0x93,0x80,0x00,0xFC,0x8E,0x80,0x00,0xD0,0x8E,0x80,0x00,0x4C,0x8F,0x80,0x00,
|
||||
0xE0,0x93,0x80,0x00,0x2C,0x8F,0x80,0x00,0x90,0x8E,0x80,0x00,0x05,0xAA,0x18,0xC1,
|
||||
0x03,0xB0,0xC3,0x4F,0x01,0xAB,0x0F,0xC8,0xEB,0xF0,0x40,0x09,0x5B,0xE9,0x5B,0xF0,
|
||||
0xCB,0xE8,0x06,0xA6,0x99,0x1F,0x0D,0x31,0x08,0xA7,0xDB,0x1F,0xE2,0x47,0x0C,0x33,
|
||||
0xC3,0x4F,0x01,0xB3,0xC3,0x47,0x08,0x80,0x68,0x06,0x14,0xA1,0x08,0x1C,0xE0,0x47,
|
||||
0x03,0x80,0x69,0x06,0x14,0xA2,0x51,0x1C,0xE1,0x47,0x0C,0x3A,0x00,0xAA,0x12,0xC0,
|
||||
0x04,0x3B,0x59,0xF0,0x32,0x08,0xC9,0xE8,0x49,0xF0,0x43,0xE8,0x9A,0x40,0x12,0xFA,
|
||||
0xDA,0x40,0x0D,0x3A,0x42,0x14,0x12,0xFA,0x5A,0x40,0x1D,0x41,0x04,0x3B,0x01,0xB3,
|
||||
0x1B,0xF6,0x1B,0xFE,0x04,0x33,0x6C,0x06,0x10,0xA6,0x2A,0x0B,0x34,0x1D,0x2A,0x0A,
|
||||
0xDC,0x43,0x27,0x0B,0x19,0x49,0x93,0xEC,0xDB,0x4F,0x00,0xAB,0x17,0xC1,0x50,0xEC,
|
||||
0xC3,0x47,0x10,0xED,0xC3,0x47,0x50,0xED,0xC3,0x47,0xD0,0xED,0xC3,0x47,0x90,0xED,
|
||||
0xC3,0x47,0x02,0xB0,0xC3,0x47,0x20,0xB0,0x03,0x40,0x2A,0xB2,0x01,0xB0,0x03,0x40,
|
||||
0x13,0x40,0x1E,0x0B,0x01,0xA0,0x5A,0x1C,0x88,0x00,0x82,0x03,0x5A,0x14,0x18,0x0B,
|
||||
0x5D,0x48,0x1C,0x48,0x2D,0xF2,0x15,0x0A,0xC8,0xF0,0x2C,0x03,0x09,0xC0,0x40,0xE8,
|
||||
0x40,0xF0,0x12,0xE8,0xD4,0x20,0x98,0x48,0xDB,0x48,0x1B,0xF2,0x03,0x03,0x13,0x21,
|
||||
0x07,0x80,0x43,0xE8,0x5B,0xF0,0xD3,0xE8,0x11,0x0A,0x90,0x28,0xD8,0x20,0xD2,0x28,
|
||||
0x1A,0x21,0xCB,0xF0,0x59,0xE8,0x09,0x0B,0x49,0xF0,0x59,0xE8,0x08,0xEC,0x08,0xB0,
|
||||
0x42,0x28,0x8A,0x21,0x0A,0x0A,0x14,0x29,0x0B,0xEC,0x44,0x20,0x0C,0xB3,0x58,0x28,
|
||||
0x08,0x22,0x52,0x29,0x0E,0x60,0x5A,0x20,0xF0,0x6D,0xC0,0x46,0x64,0x93,0x80,0x00,
|
||||
0xE0,0x93,0x80,0x00,0x2C,0x8F,0x80,0x00,0x4C,0x8F,0x80,0x00,0x78,0x93,0x80,0x00,
|
||||
0x48,0x93,0x80,0x00,0x04,0x0B,0x42,0xF0,0x10,0xE8,0x19,0x58,0xC0,0xF0,0x1A,0x58,
|
||||
0x52,0xEA,0x82,0x02,0xFB,0xC3,0x70,0x07,0x34,0x06,0x80,0x00,0x30,0x65,0x03,0x3D,
|
||||
0x80,0xEA,0xC9,0xEA,0x02,0xEC,0x0B,0xEC,0x50,0x03,0x59,0x03,0x2A,0xEC,0x55,0x03,
|
||||
0x09,0xE8,0x04,0x3C,0x01,0xA0,0xA9,0x02,0x05,0xCC,0x23,0xEC,0x5C,0x03,0x00,0xA0,
|
||||
0xA1,0x02,0x00,0xCD,0x02,0xA0,0x30,0x6D,0x13,0xF4,0x02,0x28,0x12,0xF4,0x09,0xF4,
|
||||
0x1B,0xE4,0x12,0xE4,0x09,0xE4,0x9A,0x02,0x02,0xCB,0xCB,0xEA,0x9A,0x02,0x00,0xCB,
|
||||
0x03,0x20,0x70,0x07,0x00,0xA3,0x01,0x80,0xC1,0x14,0x01,0xB3,0x93,0x02,0xFB,0xC3,
|
||||
0x70,0x07,0x30,0x65,0x52,0xE0,0x00,0xA3,0x00,0xA4,0x03,0x80,0xCD,0x1A,0x01,0xB4,
|
||||
0xC5,0x12,0x02,0xB3,0x94,0x02,0xF9,0xCB,0x30,0x6D,0x10,0x65,0x00,0xA3,0x02,0x80,
|
||||
0xCC,0x1C,0xC4,0x14,0x01,0xB3,0x93,0x02,0xFA,0xC3,0x10,0x6D,0x10,0x65,0x09,0xF4,
|
||||
0x02,0xEC,0x49,0xFC,0x00,0xA3,0x00,0xA0,0x07,0x80,0x14,0x28,0x01,0xB3,0x00,0xE9,
|
||||
0x00,0xF4,0x1B,0xF4,0x00,0xFC,0x1B,0xFC,0x02,0xB2,0x8B,0x02,0xF5,0xC3,0x10,0x6D,
|
||||
0x10,0x65,0x09,0xF4,0x02,0xEC,0x09,0xFC,0x00,0xA0,0x00,0xA3,0x07,0x80,0x14,0x48,
|
||||
0x01,0xB3,0x00,0xE9,0x00,0xF6,0x1B,0xF4,0x00,0xFE,0x1B,0xFC,0x01,0xB2,0x8B,0x02,
|
||||
0xF5,0xC3,0x10,0x6D,0x70,0x07,0x00,0x00,0x00,0x65,0x07,0x0A,0x07,0x0B,0x08,0x08,
|
||||
0x1A,0x50,0x08,0x0B,0x18,0x50,0x08,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0xA1,0x0A,0xA2,
|
||||
0xFF,0x97,0xB0,0x9F,0x00,0x6D,0xC0,0x46,0x80,0x9F,0x80,0x00,0x28,0x8F,0x80,0x00,
|
||||
0x00,0x9F,0x80,0x00,0x24,0x8F,0x80,0x00,0xF8,0x9F,0x80,0x00,0xF0,0x65,0x52,0x0B,
|
||||
0x52,0x0D,0x00,0xA2,0x85,0x60,0x1A,0x44,0x6A,0x41,0x2C,0x80,0x56,0xF0,0xB6,0xE8,
|
||||
0x4F,0x09,0x76,0xF0,0x88,0xE9,0x04,0x49,0xA9,0xE9,0x0C,0x41,0x61,0xF0,0x09,0xE9,
|
||||
0x49,0xF0,0x8C,0x06,0x29,0xEC,0x61,0x04,0x01,0xA7,0x4F,0x41,0x1F,0x4C,0x00,0x37,
|
||||
0x01,0xA7,0xA7,0x00,0x3C,0xEC,0x00,0x3F,0x3C,0x03,0x24,0xF6,0x24,0xFE,0x1C,0x44,
|
||||
0x43,0x0C,0xA6,0x1D,0x44,0x48,0x24,0xF2,0x34,0x03,0x66,0x06,0xAC,0x15,0x24,0xFA,
|
||||
0x4C,0x40,0x84,0x48,0xC0,0x48,0x00,0xF2,0x20,0x03,0x88,0x40,0x01,0xB2,0x00,0xFA,
|
||||
0x12,0xF6,0xC8,0x40,0x12,0xFE,0xD9,0x4B,0x8A,0x02,0xCF,0xC3,0xD9,0x4C,0x1A,0x4C,
|
||||
0x0A,0x00,0xDA,0x44,0xDA,0x4B,0x00,0xAA,0x01,0xC0,0x02,0xA2,0xDA,0x40,0x32,0x0D,
|
||||
0xEB,0x48,0x00,0xAB,0x5B,0xC0,0x01,0x7C,0x20,0xEC,0xFF,0xA1,0x08,0xA2,0xFD,0x97,
|
||||
0x86,0x98,0x2B,0x4C,0x6A,0x4C,0xEE,0x4B,0x5A,0x00,0x26,0x40,0x2B,0x0B,0x94,0x06,
|
||||
0x1A,0x49,0x57,0xF0,0xBF,0xE8,0x7F,0xF0,0xF9,0x1C,0xDF,0xE9,0x78,0x48,0xBB,0x48,
|
||||
0xFF,0x48,0x00,0xF2,0x3F,0xF2,0x08,0x03,0x3B,0x03,0xED,0x4B,0x00,0xF4,0x1B,0xF4,
|
||||
0x67,0x06,0x01,0xE4,0x1B,0xE4,0x17,0x01,0x00,0xAD,0x0F,0xC1,0x01,0xA5,0x3D,0x02,
|
||||
0x2C,0xC0,0x10,0xA7,0xBC,0x06,0x67,0x06,0x3E,0x03,0x92,0xF0,0x16,0x03,0x26,0x40,
|
||||
0x61,0x40,0xA3,0x40,0x00,0xE6,0xFF,0xA9,0x1A,0xCC,0x0D,0x80,0x01,0xA5,0x3D,0x00,
|
||||
0x6F,0x02,0x6F,0x01,0x92,0xF0,0x00,0x37,0x16,0x03,0x7F,0xF1,0x3E,0x03,0x26,0x40,
|
||||
0x61,0x40,0xA3,0x40,0xFF,0xA9,0x09,0xCC,0xFF,0xAB,0x0F,0xCD,0x01,0xA2,0x1B,0xE2,
|
||||
0x13,0x03,0x22,0x48,0xDB,0xF1,0x13,0x03,0x23,0x40,0x07,0x80,0x00,0xE6,0x01,0xA5,
|
||||
0x22,0x48,0x05,0x03,0xAD,0xF1,0x15,0x03,0x25,0x40,0xED,0x87,0x09,0x0B,0x1B,0x48,
|
||||
0x01,0xAB,0x04,0xC0,0x08,0x08,0x01,0x79,0x02,0xA2,0xFD,0x97,0x38,0x98,0x02,0x0B,
|
||||
0x1A,0x4C,0x05,0x60,0x5A,0x44,0xF0,0x6D,0x2C,0x8F,0x80,0x00,0xE8,0x93,0x80,0x00,
|
||||
0xE0,0x93,0x80,0x00,0x03,0x00,0x80,0x00,0x80,0x9F,0x80,0x00,0x00,0x65,0xFE,0x97,
|
||||
0x59,0x9A,0x0F,0x0B,0x1B,0x58,0x9B,0x49,0x35,0xAB,0x01,0xC1,0xFD,0x97,0x08,0x9C,
|
||||
0x0C,0x0B,0x1A,0x48,0xA5,0xAA,0x12,0xC1,0x5A,0x48,0x03,0xAA,0x03,0xC1,0x0A,0x0A,
|
||||
0x02,0xA1,0x51,0x46,0x08,0x80,0x5A,0xAA,0x09,0xC1,0x07,0x0A,0x01,0xA1,0xD1,0x46,
|
||||
0x06,0x0A,0x11,0x58,0x06,0x0A,0x11,0x50,0x00,0xA2,0x1A,0x40,0x5A,0x40,0x00,0x6D,
|
||||
0x24,0x8F,0x80,0x00,0x00,0x9F,0x80,0x00,0x2C,0x8F,0x80,0x00,0x34,0x06,0x80,0x00,
|
||||
0x68,0x90,0x80,0x00,0xF0,0x65,0x39,0x0B,0x5B,0x4A,0x00,0xAB,0x03,0xC1,0x38,0x0B,
|
||||
0x1B,0x48,0x00,0xAB,0x68,0xC0,0x37,0x0A,0x37,0x0B,0x12,0x28,0x7F,0xA0,0x10,0x00,
|
||||
0x1B,0x28,0x36,0x0A,0x93,0x02,0x16,0xC9,0x30,0x0A,0x51,0x4A,0x00,0xA9,0x08,0xC1,
|
||||
0x3D,0xA8,0x06,0xC1,0x32,0x0C,0x01,0xA1,0x51,0x42,0xA3,0x02,0x01,0xC1,0x51,0x41,
|
||||
0x0F,0x80,0x30,0x0A,0x93,0x02,0x0C,0xC1,0x28,0x09,0x00,0xA2,0x4A,0x42,0x4A,0x41,
|
||||
0x29,0x09,0x0A,0x20,0x05,0x80,0x80,0xA2,0x12,0xF4,0x9D,0xE8,0x2A,0x0A,0x93,0x02,
|
||||
0x04,0xC9,0x03,0xA2,0x13,0x00,0x29,0x0A,0x9B,0xF0,0x9D,0x18,0x28,0x0B,0x28,0xB3,
|
||||
0x1B,0x48,0x98,0x02,0x02,0xC9,0x27,0x0A,0x95,0x02,0x00,0xC1,0x03,0xEC,0x23,0x0A,
|
||||
0x00,0xA1,0x14,0x59,0x00,0xA2,0x07,0x80,0x2E,0x28,0x89,0xE9,0x09,0xF4,0x26,0x20,
|
||||
0x09,0xFC,0x01,0xB2,0x02,0xB5,0x02,0xB4,0x9A,0x02,0xF5,0xC3,0x1B,0x0A,0x14,0x59,
|
||||
0x5A,0xF0,0xA4,0xE8,0x25,0xEC,0x1A,0xEC,0x1B,0x0E,0x0B,0x80,0x1D,0xAA,0x02,0xC8,
|
||||
0x7F,0xF0,0xBF,0x1B,0x2F,0x20,0x27,0x28,0x79,0xE8,0x09,0xF4,0x09,0xFC,0x01,0xB2,
|
||||
0x02,0xB4,0x02,0xB5,0xD7,0xEA,0x82,0x02,0xF0,0xC3,0x10,0x0B,0x1B,0x59,0x52,0xF0,
|
||||
0x9A,0xE8,0x11,0x20,0x05,0x0B,0x5B,0x4A,0x01,0xAB,0x02,0xC1,0x0F,0x0B,0x08,0xA2,
|
||||
0x1A,0x40,0x03,0x0B,0x00,0xA2,0x1A,0x20,0xF0,0x6D,0xC0,0x46,0x2C,0x8F,0x80,0x00,
|
||||
0x24,0x9F,0x80,0x00,0x20,0x9F,0x80,0x00,0x22,0x9F,0x80,0x00,0xFF,0xFE,0x00,0x00,
|
||||
0xF1,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xEF,0x00,0x00,0x64,0x8D,0x80,0x00,
|
||||
0x6C,0x90,0x80,0x00,0xD8,0x9E,0x80,0x00,0xB8,0x93,0x80,0x00,0x83,0x00,0x80,0x00,
|
||||
0xF0,0x65,0x19,0x0C,0x81,0x60,0x22,0xEC,0x18,0x09,0x00,0xA3,0x18,0x08,0x16,0x80,
|
||||
0x5D,0xF0,0xED,0xE8,0x17,0x0E,0x6D,0xF0,0xAE,0x1D,0x16,0x0F,0x00,0x36,0xED,0xE9,
|
||||
0x6E,0x48,0x00,0x3F,0x36,0xF2,0x37,0x03,0x97,0x20,0xAF,0x48,0xED,0x48,0x2D,0xF2,
|
||||
0x3D,0x03,0xD5,0x20,0x0D,0x48,0x01,0xB3,0x55,0x42,0x06,0xB1,0x06,0xB2,0xC5,0x4B,
|
||||
0xAB,0x02,0xE5,0xCB,0xC3,0x4B,0x23,0x40,0x63,0x48,0x01,0xB3,0x63,0x40,0x90,0xA7,
|
||||
0x03,0x4C,0xBF,0xF1,0xDB,0xE9,0x63,0x20,0x20,0xEC,0x1C,0xA1,0xFF,0x97,0x26,0x9E,
|
||||
0x01,0x60,0x40,0x02,0xA0,0x23,0xF0,0x6D,0xD8,0x9E,0x80,0x00,0xE4,0x93,0x80,0x00,
|
||||
0x2C,0x8F,0x80,0x00,0xE0,0x93,0x80,0x00,0xF0,0x65,0x2C,0x0B,0x2C,0x08,0x5B,0x59,
|
||||
0x00,0xA2,0x1A,0x20,0x82,0x60,0x9A,0x20,0x2A,0x09,0x04,0xEC,0x2C,0x80,0x0D,0x48,
|
||||
0x01,0x35,0x55,0xF0,0xAD,0xE8,0x28,0x0E,0x6D,0xF0,0xAE,0x1D,0x26,0x0F,0x00,0x36,
|
||||
0xED,0xE9,0x6E,0x48,0x00,0x3F,0x36,0xF2,0x37,0x03,0x00,0x37,0xAE,0x48,0xED,0x48,
|
||||
0x6F,0x06,0x3F,0x28,0x2D,0xF2,0x35,0x03,0x1F,0x20,0x5D,0x20,0x01,0x3D,0x01,0xAD,
|
||||
0x05,0xC1,0x1D,0x28,0x1D,0x0E,0x35,0x03,0x2D,0xF4,0x2D,0xFC,0x1D,0x20,0x25,0x4C,
|
||||
0x67,0x4C,0x7D,0x00,0x03,0xAD,0x04,0xC1,0xE5,0x4B,0x01,0xAD,0x01,0xC1,0x00,0xA5,
|
||||
0x1D,0x20,0x01,0xB2,0x04,0xB3,0x06,0xB1,0xC5,0x4B,0xAA,0x02,0xCF,0xCB,0x14,0x0B,
|
||||
0x1A,0x48,0x01,0xB2,0x12,0xF6,0x12,0xFE,0x1A,0x40,0x43,0x49,0x00,0xAB,0x0A,0xC0,
|
||||
0x10,0x0B,0x9B,0x49,0xC0,0xAB,0x06,0xC1,0x08,0x0B,0x59,0x59,0x80,0xA3,0x08,0x28,
|
||||
0xDB,0xF1,0x03,0x03,0x0B,0x20,0x05,0x0B,0x05,0x09,0x5B,0x59,0xC9,0x4B,0x19,0x21,
|
||||
0x19,0x29,0x12,0xF2,0x0A,0x03,0x02,0x60,0x1A,0x21,0xF0,0x6D,0x64,0x8D,0x80,0x00,
|
||||
0x2C,0x8F,0x80,0x00,0xE4,0x93,0x80,0x00,0xE0,0x93,0x80,0x00,0x00,0x80,0xFF,0xFF,
|
||||
0x94,0x8E,0x80,0x00,0x88,0x93,0x80,0x00,0x00,0x00,0x00,0x10,0xA0,0x16,0xB6,0x1B,
|
||||
0x00,0x20,0xC6,0x23,0x31,0x27,0x54,0x2A,0x41,0x2D,0x00,0x30,0x98,0x32,0x10,0x35,
|
||||
0x6C,0x37,0xB0,0x39,0xDD,0x3B,0xF7,0x3D,0x00,0x40,0xF8,0x41,0xE1,0x43,0xBE,0x45,
|
||||
0x8D,0x47,0x52,0x49,0x0B,0x4B,0xBB,0x4C,0x62,0x4E,0x00,0x50,0x95,0x51,0x23,0x53,
|
||||
0xA9,0x54,0x29,0x56,0xA2,0x57,0x15,0x59,0x82,0x5A,0x00,0x00,0x50,0x02,0xA0,0x04,
|
||||
0xF0,0x06,0x40,0x09,0x90,0x0B,0xE0,0x0D,0x50,0x02,0xA0,0x04,0xF0,0x06,0x40,0x09,
|
||||
0x90,0x0B,0xE0,0x0D,0x00,0x9F,0x80,0x00,0xFC,0x90,0x80,0x00,0xBC,0x91,0x80,0x00,
|
||||
0xD8,0x9E,0x80,0x00,0x9C,0x90,0x80,0x00,0x26,0x9F,0x80,0x00,0x96,0x9F,0x80,0x00,
|
||||
0x02,0x9E,0xD8,0x2D,
|
||||
};
|
||||
|
||||
#endif
|
186
MCU/components/drivers/bsp/touchpad/chsc6x_main.c
Normal file
186
MCU/components/drivers/bsp/touchpad/chsc6x_main.c
Normal file
@ -0,0 +1,186 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "chsc6x_comp.h"
|
||||
#include "chsc6x_platform.h"
|
||||
|
||||
struct ts_event {
|
||||
unsigned short x; /*x coordinate */
|
||||
unsigned short y; /*y coordinate */
|
||||
int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */
|
||||
int id; /*touch ID */
|
||||
};
|
||||
|
||||
bool chsc6x_read_touch_info(uint16_t *x, uint16_t *y)
|
||||
{
|
||||
int ret;
|
||||
int rd_len = 0;
|
||||
unsigned char point_num;
|
||||
unsigned char read_buf[6];
|
||||
struct ts_event events[CHSC6X_MAX_POINTS_NUM];
|
||||
|
||||
if(1 == CHSC6X_MAX_POINTS_NUM) {
|
||||
rd_len = 3;
|
||||
} else if(2 == CHSC6X_MAX_POINTS_NUM) {
|
||||
if ((CHSC6X_RES_MAX_X < 255) && (CHSC6X_RES_MAX_Y < 255) ) {
|
||||
rd_len = 5;
|
||||
} else {
|
||||
rd_len = 6;
|
||||
}
|
||||
} else {
|
||||
chsc6x_err("CHSC641X_MAX_POINTS_NUM more than two");
|
||||
return false;
|
||||
}
|
||||
|
||||
ret = chsc6x_i2c_read(CHSC6X_I2C_ID, read_buf, rd_len);
|
||||
if(rd_len == ret) {
|
||||
point_num = read_buf[0] & 0x03;
|
||||
|
||||
if(1 == CHSC6X_MAX_POINTS_NUM) {
|
||||
events[0].x = (unsigned short)(((read_buf[0] & 0x40) >> 6) << 8) | (unsigned short)read_buf[1];
|
||||
events[0].y = (unsigned short)(((read_buf[0] & 0x80) >> 7) << 8) | (unsigned short)read_buf[2];
|
||||
|
||||
events[0].flag= (read_buf[0] >> 4) & 0x03;
|
||||
events[0].id = (read_buf[0] >>2) & 0x01;
|
||||
chsc6x_info("chsc6x: 000 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
|
||||
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
|
||||
|
||||
} else if(2 == CHSC6X_MAX_POINTS_NUM) {
|
||||
if ((CHSC6X_RES_MAX_X > 255) || (CHSC6X_RES_MAX_Y > 255) ) {
|
||||
events[0].x = (unsigned short)((read_buf[5] & 0x01) << 8) | (unsigned short)read_buf[1];
|
||||
events[0].y = (unsigned short)((read_buf[5] & 0x02) << 7) | (unsigned short)read_buf[2];
|
||||
|
||||
events[0].flag = (read_buf[0] >> 4) & 0x03;
|
||||
events[0].id = (read_buf[0] >>2) & 0x01;
|
||||
chsc6x_info("chsc6x: 111 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
|
||||
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
|
||||
|
||||
events[1].x = (unsigned short)((read_buf[5] & 0x04) << 6) | (unsigned short)read_buf[3];
|
||||
events[1].y = (unsigned short)((read_buf[5] & 0x08) << 5) | (unsigned short)read_buf[4];
|
||||
|
||||
events[1].flag = (read_buf[0] >> 6) & 0x03;
|
||||
events[1].id = (read_buf[0] >>3) & 0x01;
|
||||
chsc6x_info("chsc6x: 222 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
|
||||
events[1].x, events[1].y, point_num, events[1].flag, events[1].id);
|
||||
} else {
|
||||
events[0].x = read_buf[1];
|
||||
events[0].y = read_buf[2];
|
||||
|
||||
events[0].flag = (read_buf[0] >> 4) & 0x03;
|
||||
events[0].id = (read_buf[0] >>2) & 0x01;
|
||||
chsc6x_info("chsc6x: 333 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
|
||||
events[0].x, events[0].y, point_num, events[0].flag, events[0].id);
|
||||
|
||||
events[1].x = read_buf[3];
|
||||
events[1].y = read_buf[4];
|
||||
|
||||
events[1].flag = (read_buf[0] >> 6) & 0x03;
|
||||
events[1].id = (read_buf[0] >>3) & 0x01;
|
||||
chsc6x_info("chsc6x: 444 X:%d, Y:%d, point_num:%d,flag:%d, id:%d \r\n", \
|
||||
events[1].x, events[1].y, point_num, events[1].flag, events[1].id);
|
||||
}
|
||||
}
|
||||
static uint16_t last_x = 0xffff, last_y = 0xffff;
|
||||
static uint8_t same_counter = 0;
|
||||
*x = events[0].x;
|
||||
*y = events[0].y;
|
||||
if ((last_x == events[0].x) && (last_y == events[0].y)) {
|
||||
if (same_counter < 10) {
|
||||
same_counter++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
last_x = events[0].x;
|
||||
last_y = events[0].y;
|
||||
same_counter = 0;
|
||||
}
|
||||
if ((point_num != 0)
|
||||
&& ((events[0].flag == 0) || (events[0].flag == 2))
|
||||
&& (same_counter < 10)) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else{
|
||||
chsc6x_err("chsc6x: chsc6x_read_touch_info iic err! rd_len=%d, ret=%d \r\n", rd_len, ret);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void chsc6x_resume(void)
|
||||
{
|
||||
chsc6x_info("touch_resume");
|
||||
chsc6x_tp_reset();
|
||||
}
|
||||
|
||||
void chsc6x_suspend(void)
|
||||
{
|
||||
unsigned char buft[1] = {0};
|
||||
int ret = -1;
|
||||
chsc6x_tp_reset();
|
||||
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xa503, buft, 0);
|
||||
if(ret == 0) {
|
||||
chsc6x_info("touch_suspend OK \r\n");
|
||||
}else{
|
||||
chsc6x_info("touch_suspend failed \r\n");
|
||||
}
|
||||
}
|
||||
|
||||
void chsc6x_dbcheck(void)
|
||||
{
|
||||
unsigned char buft[1] = {0};
|
||||
int ret = -1;
|
||||
chsc6x_tp_reset();
|
||||
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xd001, buft, 0); //0xd001 close
|
||||
if(ret == 0) {
|
||||
chsc6x_info("Enable dbcheck OK \r\n");
|
||||
}else{
|
||||
chsc6x_info("Enable dbcheck failed \r\n");
|
||||
}
|
||||
}
|
||||
|
||||
void chsc6x_palmcheck(void)
|
||||
{
|
||||
unsigned char buft[1] = {0};
|
||||
int ret = -1;
|
||||
chsc6x_tp_reset();
|
||||
ret = chsc6x_write_bytes_u16addr_sub(CHSC6X_I2C_ID, 0xd101, buft, 0); //0xd100 close
|
||||
if(ret == 0) {
|
||||
chsc6x_info("Enable palmcheck OK \r\n");
|
||||
}else{
|
||||
chsc6x_info("Enable palmcheck failed \r\n");
|
||||
}
|
||||
}
|
||||
|
||||
void chsc6x_init(void)
|
||||
{
|
||||
int i = 0;
|
||||
int ret = 0;
|
||||
unsigned char fw_update_ret_flag = 0; //1:update OK, !0 fail
|
||||
struct ts_fw_infos fw_infos;
|
||||
|
||||
chsc6x_tp_reset_active();
|
||||
|
||||
for(i = 0; i < 3; i++) {
|
||||
ret = chsc6x_tp_dect(&fw_infos, &fw_update_ret_flag);
|
||||
if(1 == ret) {
|
||||
#if CHSC6X_AUTO_UPGRADE /* If need update FW */
|
||||
chsc6x_info("chsc6x_tp_dect succeed!\r\n");
|
||||
if(1 == fw_update_ret_flag) {
|
||||
chsc6x_err("update fw succeed! \r\n");
|
||||
break;
|
||||
} else {
|
||||
chsc6x_err("update fw failed! \r\n");
|
||||
}
|
||||
#else
|
||||
break;
|
||||
#endif
|
||||
}else {
|
||||
chsc6x_err("chsc6x_tp_dect failed! i = %d \r\n", i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
339
MCU/components/drivers/bsp/touchpad/chsc6x_platform.c
Normal file
339
MCU/components/drivers/bsp/touchpad/chsc6x_platform.c
Normal file
@ -0,0 +1,339 @@
|
||||
#include "chsc6x_platform.h"
|
||||
#include "fr30xx.h"
|
||||
|
||||
void touchpad_reset_set(void);
|
||||
void touchpad_reset_clear(void);
|
||||
void touchpad_delay_ms(uint32_t counter);
|
||||
|
||||
extern I2C_HandleTypeDef i2c_touchpad_handle;
|
||||
|
||||
/************************************************************************************
|
||||
* @fn i2c_memory_read
|
||||
*
|
||||
* @brief i2c memory read.
|
||||
*/
|
||||
bool i2c_memory_chsc6x_read_only(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
||||
{
|
||||
uint32_t lu32_RxCount = fu32_Size;
|
||||
|
||||
if (fu32_Size == 0)
|
||||
goto _exit_i2c_read;
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
||||
|
||||
__I2C_ENABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->DATA_CMD = (0 >> 8) & 0xFF;
|
||||
hi2c->I2Cx->DATA_CMD = 0 & 0xFF;
|
||||
|
||||
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
||||
|
||||
/* DevAddress NACK */
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
goto _exit_i2c_read;
|
||||
}
|
||||
|
||||
if (fu32_Size > 1)
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
|
||||
|
||||
while (fu32_Size - 2)
|
||||
{
|
||||
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_READ;
|
||||
|
||||
fu32_Size--;
|
||||
}
|
||||
|
||||
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
||||
{
|
||||
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
||||
|
||||
lu32_RxCount--;
|
||||
}
|
||||
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
goto _exit_i2c_read;
|
||||
}
|
||||
}
|
||||
|
||||
/* Last byte with stop */
|
||||
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
||||
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
|
||||
}
|
||||
|
||||
uint8_t to_counter = 100;
|
||||
while (lu32_RxCount)
|
||||
{
|
||||
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
||||
{
|
||||
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
||||
|
||||
lu32_RxCount--;
|
||||
}
|
||||
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
goto _exit_i2c_read;
|
||||
}
|
||||
|
||||
system_delay_us(10);
|
||||
to_counter--;
|
||||
if (to_counter == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
||||
|
||||
if (lu32_RxCount == 0) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
|
||||
_exit_i2c_read:
|
||||
|
||||
__NOP();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* @fn i2c_memory_read
|
||||
*
|
||||
* @brief i2c memory read.
|
||||
*/
|
||||
bool i2c_memory_chsc6x_read(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
||||
{
|
||||
uint32_t lu32_RxCount = fu32_Size;
|
||||
|
||||
if (fu32_Size == 0)
|
||||
goto _exit_i2c_read;
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
||||
|
||||
__I2C_ENABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
|
||||
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
|
||||
|
||||
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
||||
|
||||
/* DevAddress NACK */
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
goto _exit_i2c_read;
|
||||
}
|
||||
|
||||
if (fu32_Size > 1)
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
|
||||
|
||||
while (fu32_Size - 2)
|
||||
{
|
||||
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_READ;
|
||||
|
||||
fu32_Size--;
|
||||
}
|
||||
|
||||
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
||||
{
|
||||
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
||||
|
||||
lu32_RxCount--;
|
||||
}
|
||||
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
goto _exit_i2c_read;
|
||||
}
|
||||
}
|
||||
|
||||
/* Last byte with stop */
|
||||
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
||||
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
|
||||
}
|
||||
|
||||
while (lu32_RxCount)
|
||||
{
|
||||
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
||||
{
|
||||
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
||||
|
||||
lu32_RxCount--;
|
||||
}
|
||||
}
|
||||
|
||||
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
||||
|
||||
return true;
|
||||
|
||||
_exit_i2c_read:
|
||||
|
||||
__NOP();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* @fn i2c_memory_write
|
||||
*
|
||||
* @brief i2c memory write.
|
||||
*/
|
||||
bool i2c_memory_chsc6x_write(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint16_t fu16_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
||||
{
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
||||
|
||||
__I2C_ENABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->DATA_CMD = (fu16_MemAddress >> 8) & 0xFF;
|
||||
hi2c->I2Cx->DATA_CMD = fu16_MemAddress & 0xFF;
|
||||
|
||||
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
||||
|
||||
/* DevAddress NACK */
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
goto _exit_i2c_write;
|
||||
}
|
||||
|
||||
while (fu32_Size - 1 > 0)
|
||||
{
|
||||
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = *fp_Data++;
|
||||
|
||||
fu32_Size--;
|
||||
}
|
||||
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
goto _exit_i2c_write;
|
||||
}
|
||||
}
|
||||
|
||||
/* Last byte with stop */
|
||||
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
||||
hi2c->I2Cx->DATA_CMD = *fp_Data | CMD_STOP;
|
||||
|
||||
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
||||
|
||||
//while(i2c_memory_is_busy(hi2c, fu16_DevAddress));
|
||||
|
||||
return true;
|
||||
|
||||
_exit_i2c_write:
|
||||
|
||||
__NOP();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* return: =read lenth succeed; <0 failed
|
||||
read reg addr not need
|
||||
just used for reading xy cord info*/
|
||||
int chsc6x_i2c_read(unsigned char id, unsigned char *p_data, unsigned short lenth)
|
||||
{
|
||||
bool ret = i2c_memory_chsc6x_read_only(&i2c_touchpad_handle, id, p_data, lenth);
|
||||
// bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, 0, p_data, lenth);
|
||||
if (ret) {
|
||||
return lenth;
|
||||
}else{
|
||||
return -1;
|
||||
}
|
||||
|
||||
// return i2cRead(id, lenth, p_data);
|
||||
}
|
||||
|
||||
/* RETURN:0->pass else->fail */
|
||||
int chsc6x_read_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *rxbuf, unsigned short lenth)
|
||||
{
|
||||
bool ret = i2c_memory_chsc6x_read(&i2c_touchpad_handle, id, adr, rxbuf, lenth);
|
||||
if (ret) {
|
||||
return 0;
|
||||
}else{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* RETURN:0->pass else->fail */
|
||||
int chsc6x_write_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *txbuf, unsigned short lenth)
|
||||
{
|
||||
bool ret = i2c_memory_chsc6x_write(&i2c_touchpad_handle, id, adr, txbuf, lenth);
|
||||
if(ret) {
|
||||
return 0;
|
||||
}else{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void chsc6x_msleep(int ms)
|
||||
{
|
||||
touchpad_delay_ms(ms);
|
||||
}
|
||||
|
||||
void chsc6x_tp_reset(void)
|
||||
{
|
||||
touchpad_reset_clear();
|
||||
touchpad_delay_ms(30);//30ms
|
||||
touchpad_reset_set();
|
||||
touchpad_delay_ms(30);//30ms
|
||||
}
|
||||
|
||||
void chsc6x_tp_reset_active(void)
|
||||
{
|
||||
touchpad_reset_clear();
|
||||
touchpad_delay_ms(30);//30ms
|
||||
touchpad_reset_set();
|
||||
touchpad_delay_ms(30);//30ms
|
||||
}
|
||||
|
51
MCU/components/drivers/bsp/touchpad/chsc6x_platform.h
Normal file
51
MCU/components/drivers/bsp/touchpad/chsc6x_platform.h
Normal file
@ -0,0 +1,51 @@
|
||||
#ifndef __CHSC6X_PLATFORM_H__
|
||||
#define __CHSC6X_PLATFORM_H__
|
||||
#include <stdio.h>
|
||||
|
||||
#if 0
|
||||
#define chsc6x_info(x...) pr_notice("[chsc6x] " x)
|
||||
#define chsc6x_err(x...) pr_err("[chsc6x][error] " x)
|
||||
#else
|
||||
#if 0
|
||||
#define chsc6x_info printf
|
||||
#define chsc6x_err printf
|
||||
#else
|
||||
#define chsc6x_info(x...)
|
||||
#define chsc6x_err(x...)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define CHSC6X_I2C_ID (0x5c) //8bit
|
||||
|
||||
#define CHSC6X_MAX_POINTS_NUM (1)
|
||||
#define CHSC6X_RES_MAX_X (370)
|
||||
#define CHSC6X_RES_MAX_Y (370)
|
||||
|
||||
/*MACRO SWITCH for driver update TP FW */
|
||||
#define CHSC6X_AUTO_UPGRADE (0)
|
||||
|
||||
/*MACRO SWITCH for multi TP_VENDOR Compatible update TP FW */
|
||||
#define CHSC6X_MUL_VENDOR_UPGRADE (0)
|
||||
|
||||
#define MAX_IIC_WR_LEN (8)
|
||||
#define MAX_IIC_RD_LEN (16)
|
||||
|
||||
|
||||
/* fail : <0 */
|
||||
int chsc6x_i2c_read(unsigned char id, unsigned char *p_data, unsigned short lenth);
|
||||
|
||||
/* RETURN:0->pass else->fail */
|
||||
int chsc6x_read_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *rxbuf, unsigned short lenth);
|
||||
|
||||
/* RETURN:0->pass else->fail */
|
||||
int chsc6x_write_bytes_u16addr_sub(unsigned char id, unsigned short adr, unsigned char *txbuf, unsigned short lenth);
|
||||
|
||||
void chsc6x_msleep(int ms);
|
||||
|
||||
void chsc6x_tp_reset(void);
|
||||
|
||||
void chsc6x_tp_reset_active(void);
|
||||
|
||||
|
||||
|
||||
#endif
|
119
MCU/components/drivers/bsp/touchpad/chsc6x_ramcode.h
Normal file
119
MCU/components/drivers/bsp/touchpad/chsc6x_ramcode.h
Normal file
@ -0,0 +1,119 @@
|
||||
#ifndef __CHSC6X_RAMCODE_H__
|
||||
#define __CHSC6X_RAMCODE_H__
|
||||
|
||||
const unsigned char fw_fcode_burn[1784] = {
|
||||
0x08,0x80,0x6F,0x6D,0x00,0x00,0xF8,0x06,0x4B,0x4E,0x4C,0x54,0x80,0x01,0x88,0x00,
|
||||
0x34,0x80,0xC0,0x46,0x00,0xA0,0x17,0x09,0x17,0x0A,0x08,0x50,0x04,0xB1,0x91,0x02,
|
||||
0xFB,0xCB,0x0C,0x08,0xC0,0x6B,0x0D,0x08,0x85,0x06,0x0B,0x08,0xC0,0x6B,0x0C,0x08,
|
||||
0x85,0x06,0x0C,0x09,0x40,0xA0,0x08,0x40,0x40,0xA0,0x48,0x40,0x0A,0x09,0x0B,0x0A,
|
||||
0x0B,0x0B,0x08,0x58,0x10,0x50,0x04,0xB1,0x04,0xB2,0x9A,0x02,0xF9,0xCB,0x00,0x90,
|
||||
0xF5,0x9A,0xC0,0x46,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xF0,0x9D,0x80,0x00,
|
||||
0xF0,0x9C,0x80,0x00,0x0C,0x06,0x80,0x00,0xF8,0x06,0x00,0x00,0x04,0x8D,0x80,0x00,
|
||||
0x04,0x8D,0x80,0x00,0x04,0x8D,0x80,0x00,0x00,0xA0,0x80,0x00,0x30,0x00,0x00,0x00,
|
||||
0x4D,0x03,0x00,0x00,0x31,0x00,0x00,0x00,0x15,0x03,0x00,0x00,0x33,0x00,0x00,0x00,
|
||||
0xD9,0x04,0x00,0x00,0x32,0x00,0x00,0x00,0xD1,0x02,0x00,0x00,0x30,0x65,0x07,0x0C,
|
||||
0x01,0xA3,0x23,0x40,0x05,0xF6,0x1C,0xA0,0x00,0x90,0x9E,0x98,0x00,0xA3,0x23,0x40,
|
||||
0x03,0x0B,0x2D,0xFE,0x1D,0x40,0x00,0x90,0xC7,0x98,0x30,0x6D,0x0D,0x00,0x80,0x00,
|
||||
0x0C,0x00,0x80,0x00,0xF0,0x65,0xFA,0xA0,0xC0,0xF0,0x00,0x90,0x8D,0x98,0x05,0xA0,
|
||||
0xFF,0x97,0xE4,0x9F,0x0A,0x0C,0x0B,0x0D,0x00,0xA6,0x01,0xA7,0x05,0x80,0xC8,0xA0,
|
||||
0x01,0xBC,0x00,0x90,0x81,0x98,0x00,0xAC,0x05,0xC0,0x2E,0x40,0x00,0x90,0xAC,0x98,
|
||||
0x2B,0x48,0x1F,0x02,0xF3,0xC1,0x04,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0xC0,0x46,
|
||||
0x80,0x96,0x98,0x00,0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x30,0x65,0x07,0x0C,
|
||||
0x03,0xFC,0x05,0xEC,0x23,0x40,0x00,0x90,0x97,0x98,0x2B,0xFA,0x23,0x40,0x00,0x90,
|
||||
0x93,0x98,0x25,0x40,0x00,0x90,0x90,0x98,0x30,0x6D,0xC0,0x46,0x0C,0x00,0x80,0x00,
|
||||
0x10,0x65,0x04,0xEC,0x06,0xA0,0xFF,0x97,0xB1,0x9F,0x20,0xA0,0xFF,0x97,0xAE,0x9F,
|
||||
0x20,0xEC,0xFF,0x97,0xE3,0x9F,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0xBA,0x9F,
|
||||
0x10,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x03,0xA0,0x0D,0xEC,
|
||||
0x16,0xEC,0x0E,0x0F,0xFF,0x97,0x9A,0x9F,0x20,0xEC,0xFF,0x97,0xCF,0x9F,0x00,0xA3,
|
||||
0x3B,0x40,0x00,0x90,0x69,0x98,0x0A,0x0B,0x0A,0xA2,0x1A,0x40,0x00,0x90,0x64,0x98,
|
||||
0x00,0xAD,0x07,0xC0,0x00,0xA4,0x3B,0x48,0x33,0x15,0x01,0xB4,0x00,0x90,0x5C,0x98,
|
||||
0xAC,0x02,0xF8,0xC1,0x02,0x0B,0x01,0xA2,0x1A,0x40,0xF0,0x6D,0x0C,0x00,0x80,0x00,
|
||||
0x0D,0x00,0x80,0x00,0xF0,0x65,0x04,0xEC,0x06,0xA0,0x0D,0xEC,0x16,0xEC,0xFF,0x97,
|
||||
0x75,0x9F,0x02,0xA0,0xFF,0x97,0x72,0x9F,0x20,0xEC,0xFF,0x97,0xA7,0x9F,0x00,0xAD,
|
||||
0x08,0xC0,0x07,0x0F,0x00,0xA4,0x33,0x1D,0x01,0xB4,0x3B,0x40,0x00,0x90,0x3C,0x98,
|
||||
0xA5,0x02,0xF8,0xC8,0x03,0x0B,0x01,0xA2,0x1A,0x40,0xFF,0x97,0x73,0x9F,0xF0,0x6D,
|
||||
0x0C,0x00,0x80,0x00,0x0D,0x00,0x80,0x00,0x06,0x09,0x0B,0x58,0x81,0x60,0x00,0x33,
|
||||
0x43,0xF0,0x18,0xE8,0xC0,0xF0,0x0A,0x58,0x00,0x3B,0xD3,0xEA,0x83,0x02,0xFA,0xC9,
|
||||
0x01,0x60,0x70,0x07,0x30,0x06,0x80,0x00,0x10,0x65,0x94,0xE0,0x00,0xAC,0x05,0xCD,
|
||||
0x00,0xA3,0x04,0xD9,0x01,0xB3,0x04,0xD0,0xA3,0x02,0xFA,0xC1,0x10,0x6D,0xC0,0x46,
|
||||
0x10,0x65,0x09,0xF4,0x49,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xA9,0x0B,0xC0,0x4C,0xEE,
|
||||
0x24,0xF4,0xE4,0xFB,0x02,0xB4,0x00,0xA2,0x99,0x1A,0x40,0xE8,0x00,0xF4,0x02,0xB2,
|
||||
0x00,0xFC,0xA2,0x02,0xF8,0xC1,0x10,0x6D,0x30,0x65,0x06,0x0D,0x2B,0x48,0xDA,0xF6,
|
||||
0x06,0xC5,0x10,0xA4,0x1C,0xA0,0xFF,0x97,0xC7,0x9F,0x2B,0x48,0x1C,0x02,0xF9,0xC1,
|
||||
0x30,0x6D,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x01,0xA2,0x1A,0x40,0x70,0x07,
|
||||
0x0D,0x00,0x80,0x00,0x01,0x0B,0x00,0xA2,0x1A,0x40,0x70,0x07,0x0D,0x00,0x80,0x00,
|
||||
0x01,0x0B,0x18,0x40,0x70,0x07,0xC0,0x46,0x0C,0x00,0x80,0x00,0x01,0x0B,0x18,0x40,
|
||||
0x70,0x07,0xC0,0x46,0x0D,0x00,0x80,0x00,0x01,0x0B,0x18,0x48,0x70,0x07,0xC0,0x46,
|
||||
0x0C,0x00,0x80,0x00,0x10,0x65,0x03,0x0C,0x00,0xA3,0x23,0x40,0xFF,0x97,0xCC,0x9F,
|
||||
0x20,0x48,0x10,0x6D,0x0C,0x00,0x80,0x00,0x10,0x65,0x04,0x0C,0x00,0xA3,0x23,0x40,
|
||||
0xFF,0x97,0xC2,0x9F,0x23,0x48,0x01,0xA0,0x18,0x00,0x10,0x6D,0x0C,0x00,0x80,0x00,
|
||||
0x30,0x65,0x80,0xA3,0xC2,0x28,0x5B,0xF1,0x9A,0x02,0x04,0xC0,0x0C,0x0B,0x1B,0x58,
|
||||
0x05,0xA2,0x5A,0x40,0x30,0x6D,0x84,0x28,0x45,0x28,0x00,0xAC,0x0B,0xC0,0x2D,0xF3,
|
||||
0x28,0xEC,0x01,0xBC,0xFF,0x97,0x1C,0x9F,0x24,0xF4,0x80,0xA3,0x5B,0xF1,0x24,0xFC,
|
||||
0xED,0xE8,0x00,0xAC,0xF4,0xC1,0x02,0x0B,0x1B,0x58,0x00,0xA2,0x5A,0x40,0xE9,0x87,
|
||||
0x04,0x8D,0x80,0x00,0x30,0x65,0xC2,0x28,0x84,0x28,0x43,0x28,0x09,0x0D,0x12,0xF4,
|
||||
0x10,0xEC,0x18,0x03,0x2A,0xEC,0x21,0xEC,0xFF,0x97,0x16,0x9F,0x28,0xEC,0x21,0xEC,
|
||||
0x00,0x90,0xC4,0x99,0x04,0x0B,0x1B,0x58,0x00,0xA2,0x58,0x20,0x00,0xFC,0x98,0x20,
|
||||
0x5A,0x40,0x30,0x6D,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0xF0,0x65,0x5F,0x06,
|
||||
0x56,0x06,0x4D,0x06,0x44,0x06,0xF0,0x64,0x83,0x28,0x42,0x28,0x04,0xEC,0x19,0xEC,
|
||||
0x38,0x08,0x92,0x06,0x99,0x06,0x00,0x90,0xA9,0x99,0xA3,0x29,0xE2,0x28,0x1B,0xF4,
|
||||
0x9B,0xE8,0x83,0x02,0x09,0xC0,0x34,0x0B,0x1B,0x58,0x03,0xA2,0x5A,0x40,0x3C,0x6C,
|
||||
0x90,0x06,0x99,0x06,0xA2,0x06,0xAB,0x06,0xF0,0x6D,0x54,0x06,0x23,0xF5,0x00,0xAB,
|
||||
0x4E,0xC0,0x00,0xA2,0x91,0x05,0x4F,0xC0,0x80,0xA3,0x5C,0xF0,0x4D,0x06,0x00,0xA7,
|
||||
0xA3,0x06,0x2C,0xEC,0x5D,0x05,0x01,0xC9,0x80,0xA4,0x64,0xF0,0x25,0x0B,0xB8,0x06,
|
||||
0xFE,0xE8,0xD0,0x04,0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xF3,0x9E,0x2D,0xEB,
|
||||
0x40,0x06,0x21,0xEC,0x32,0xEC,0xFF,0x97,0xED,0x9E,0x3F,0xE9,0x00,0xAD,0xE8,0xC1,
|
||||
0x80,0xA7,0x4D,0x06,0x00,0xA6,0x7F,0xF0,0x2C,0xEC,0xBD,0x02,0x01,0xC9,0x80,0xA4,
|
||||
0x64,0xF0,0x1A,0x0B,0x30,0xEC,0xF2,0xE8,0x50,0x04,0x21,0xEC,0x2D,0xEB,0xFF,0x97,
|
||||
0xB3,0x9E,0x36,0xE9,0x00,0xAD,0xEF,0xC1,0x13,0x0B,0x18,0x58,0x11,0x0B,0x45,0x40,
|
||||
0x1A,0x48,0x12,0x0B,0x1B,0x48,0x9A,0x02,0x0F,0xC1,0x00,0xA3,0x07,0x80,0x0D,0x0C,
|
||||
0x19,0xE9,0x0E,0x0C,0x1A,0xE9,0x09,0x48,0x12,0x48,0x91,0x02,0x05,0xC1,0x01,0xB3,
|
||||
0x99,0x05,0xF4,0xC8,0x00,0xA3,0x43,0x20,0xA9,0x87,0x09,0xA3,0x43,0x40,0xA6,0x87,
|
||||
0x50,0x06,0xFF,0x97,0x7D,0x9E,0xAC,0x87,0x03,0x0B,0x18,0x58,0x4A,0x06,0x42,0x40,
|
||||
0xF0,0x87,0xC0,0x46,0x00,0x90,0x80,0x00,0x04,0x8D,0x80,0x00,0x80,0x94,0x80,0x00,
|
||||
0xF0,0x65,0x57,0x06,0x46,0x06,0xC0,0x64,0x80,0xA3,0x07,0xF4,0x00,0xA4,0xDB,0xF0,
|
||||
0x3F,0xFC,0x00,0xA5,0xA0,0x06,0x9A,0x06,0x3E,0xEC,0x57,0x05,0x01,0xC9,0x80,0xA6,
|
||||
0xF6,0xF0,0x36,0xF4,0x36,0xFC,0x40,0x06,0x31,0xEC,0x15,0x0A,0xFF,0x97,0x6C,0x9E,
|
||||
0x00,0xAE,0x19,0xC0,0x70,0xEE,0x13,0x0B,0x00,0xF4,0x00,0xFC,0xC0,0xE8,0x42,0x06,
|
||||
0x01,0xBB,0x19,0x48,0x64,0xE8,0x51,0x03,0x01,0xB2,0x6D,0xE8,0x24,0xF4,0x2D,0xF4,
|
||||
0x12,0xF4,0x01,0xB3,0x24,0xFC,0x2D,0xFC,0x12,0xFC,0x83,0x02,0xF1,0xC1,0x33,0xEC,
|
||||
0x43,0x04,0x1B,0xF4,0x1B,0xFC,0x98,0x06,0xBF,0xEB,0x3F,0xF4,0x3F,0xFC,0x00,0xAF,
|
||||
0xD2,0xC1,0x28,0xF4,0x20,0x03,0x0C,0x6C,0x90,0x06,0x9A,0x06,0xF0,0x6D,0xC0,0x46,
|
||||
0x00,0x90,0x80,0x00,0x01,0x90,0x80,0x00,0xF0,0x65,0x19,0x0C,0x00,0xA0,0x08,0xA1,
|
||||
0x22,0xEC,0xFF,0x97,0x39,0x9E,0x23,0x58,0x01,0xB3,0x1F,0xC0,0x15,0x0B,0x1C,0x28,
|
||||
0x80,0xA3,0x1B,0xF2,0xA3,0x02,0x00,0xC2,0xF0,0x6D,0x13,0x0B,0x1E,0x28,0x13,0x0B,
|
||||
0xF6,0xE8,0x73,0xEE,0x9E,0x01,0x00,0xAE,0xF6,0xC1,0x20,0xEC,0xFF,0x97,0xA0,0x9F,
|
||||
0x0B,0x0D,0x07,0xEC,0x08,0xA1,0x20,0xEC,0x2A,0xEC,0xFF,0x97,0x1D,0x9E,0x2B,0x58,
|
||||
0xBB,0x02,0xE9,0xC1,0x0A,0x0B,0x1B,0x58,0x5E,0x40,0xE5,0x87,0x09,0x0B,0x1B,0x58,
|
||||
0x01,0xB3,0xDB,0xC1,0x06,0x0B,0x1B,0x58,0x08,0xA2,0x5A,0x40,0xDC,0x87,0xC0,0x46,
|
||||
0x00,0x90,0x80,0x00,0x06,0x90,0x80,0x00,0x02,0x90,0x80,0x00,0xCA,0xCA,0xFF,0xFF,
|
||||
0x04,0x8D,0x80,0x00,0x04,0x90,0x80,0x00,0x70,0x65,0x22,0x0D,0x2B,0x58,0x0F,0xA2,
|
||||
0x1A,0x40,0x09,0xA2,0x5A,0x40,0x0C,0xA1,0x04,0xEC,0xFF,0x97,0x59,0x9E,0x23,0x48,
|
||||
0x00,0xA8,0x13,0xC1,0x62,0x48,0xD2,0xE8,0xFF,0xAA,0x0F,0xC1,0x1A,0x0A,0x11,0x48,
|
||||
0x99,0x02,0x2B,0xC0,0x11,0x4A,0x99,0x02,0x2A,0xC0,0x11,0x4C,0x99,0x02,0x11,0xC0,
|
||||
0x11,0x4E,0x03,0xA0,0x99,0x02,0x0E,0xC0,0x28,0x58,0x03,0x80,0x28,0x58,0x03,0xA3,
|
||||
0x43,0x40,0x23,0x48,0x03,0x40,0x06,0xA1,0xFF,0x97,0x3A,0x9E,0x2B,0x58,0x40,0x02,
|
||||
0xD8,0x20,0x70,0x6D,0x02,0xA0,0x0D,0x09,0x00,0xA3,0x0B,0x40,0x80,0xB1,0x0B,0x40,
|
||||
0x0B,0x0E,0xC3,0xF0,0x05,0xA1,0xD2,0xE8,0x53,0x58,0x20,0xEC,0x31,0x40,0x00,0x90,
|
||||
0x73,0x98,0x01,0xA3,0x33,0x40,0x28,0x58,0x23,0x48,0xE3,0x87,0x00,0xA0,0xEA,0x87,
|
||||
0x01,0xA0,0xE8,0x87,0x04,0x8D,0x80,0x00,0x7C,0x00,0x00,0x00,0x00,0x9E,0x80,0x00,
|
||||
0x03,0x00,0x80,0x00,0x30,0x65,0x0D,0x0C,0x63,0x4A,0x35,0xAB,0x00,0xC0,0x30,0x6D,
|
||||
0xFA,0xA0,0x80,0xF0,0xFF,0x97,0xF0,0x9D,0x09,0x0D,0x21,0xEC,0x10,0xA2,0x28,0xEC,
|
||||
0xFF,0x97,0xFA,0x9D,0x28,0xEC,0xFF,0x97,0x9F,0x9F,0x06,0x08,0x06,0x09,0x10,0xA2,
|
||||
0xFF,0x97,0xF2,0x9D,0x30,0xA3,0x63,0x42,0xE9,0x87,0xC0,0x46,0x00,0x9F,0x80,0x00,
|
||||
0x80,0x9F,0x80,0x00,0x40,0x9F,0x80,0x00,0xC0,0x9F,0x80,0x00,0x00,0x65,0x13,0x0B,
|
||||
0x13,0x0A,0x19,0x58,0x0A,0x00,0x1A,0x50,0x12,0x0B,0x55,0xA2,0x1A,0x40,0x12,0x0A,
|
||||
0x12,0x0B,0x1A,0x20,0x12,0x0A,0x13,0x0B,0x1A,0x50,0x13,0x0A,0xFF,0xA3,0x1B,0xF6,
|
||||
0x13,0x50,0x01,0xA3,0x5B,0x02,0x04,0xB2,0x13,0x20,0x10,0x0B,0x00,0xA2,0x10,0x09,
|
||||
0x1A,0x40,0x01,0xA3,0x0B,0x40,0x10,0xB1,0x0A,0x50,0x0E,0x0A,0x13,0x40,0x80,0xA3,
|
||||
0x1B,0xF4,0x1F,0xA2,0x1A,0x40,0xFF,0x97,0xB5,0x9F,0xFC,0x87,0x40,0x06,0x80,0x00,
|
||||
0xFF,0xFF,0xFF,0xFE,0x10,0x04,0x80,0x00,0x00,0x9E,0xFF,0xFF,0x28,0x00,0x80,0x00,
|
||||
0xC0,0x9F,0x80,0x00,0x04,0x8D,0x80,0x00,0x60,0x00,0x80,0x00,0x68,0x00,0x80,0x00,
|
||||
0x20,0x06,0x80,0x00,0x03,0x00,0x80,0x00,0x18,0x07,0xC0,0x46,0x30,0x65,0x0D,0xF4,
|
||||
0x2D,0xFC,0x03,0xEC,0x00,0xA0,0x00,0xAD,0x14,0xC0,0x19,0x48,0x00,0xA4,0x01,0xB3,
|
||||
0x00,0xA2,0x01,0x80,0x19,0x48,0x01,0xB3,0x08,0xE8,0x51,0x03,0x01,0xB2,0x64,0xE8,
|
||||
0x12,0xF4,0x00,0xF4,0x24,0xF4,0x12,0xFC,0x00,0xFC,0x24,0xFC,0x95,0x02,0xF1,0xC8,
|
||||
0x24,0xF4,0x20,0x03,0x30,0x6D,0xC0,0x46
|
||||
};
|
||||
|
||||
#endif
|
935
MCU/components/drivers/bsp/touchpad/driver_chsc5816.c
Normal file
935
MCU/components/drivers/bsp/touchpad/driver_chsc5816.c
Normal file
@ -0,0 +1,935 @@
|
||||
/*===============================================================================================*/
|
||||
/**
|
||||
* @file touch.c
|
||||
*
|
||||
* @version v1.0
|
||||
*/
|
||||
/*=================================================================================================
|
||||
Rootlink Confidential Proprietary
|
||||
Advanced Technology and Software Operations
|
||||
|
||||
(c) Copyright Rootlink 2015 - , All Rights Reserved
|
||||
|
||||
Revision History:
|
||||
|
||||
Modification Tracking
|
||||
Author Date Number Description of Changes
|
||||
-------- -------- ------- ------------------------
|
||||
|
||||
Portability:
|
||||
Indicate if this module is portable to other compilers or
|
||||
platforms. If not, indicate specific reasons why is it not portable.
|
||||
|
||||
===================================================================================================
|
||||
INCLUDE FILES
|
||||
=================================================================================================*/
|
||||
#include <stdint.h>
|
||||
|
||||
#include "fr30xx.h"
|
||||
#include "chsc5816_ctp.h"
|
||||
|
||||
#if 0
|
||||
#define PRINT_DBG printf
|
||||
#else
|
||||
#define PRINT_DBG(...)
|
||||
#endif
|
||||
|
||||
#define RETRY 1000
|
||||
#define _TOUCH_DOWN 0
|
||||
#define _TOUCH_UP 1
|
||||
#define _TOUCH_CONTACT 2
|
||||
#define CHSC5816_ADDRESS (0x2e<<1)
|
||||
|
||||
#define _XSIZE_PHYS 368
|
||||
#define _YSIZE_PHYS 448
|
||||
|
||||
#define __CHSC5816_RESET_SET() touchpad_reset_set()
|
||||
#define __CHSC5816_RESET_CLEAR() touchpad_reset_clear()
|
||||
#define HAL_Delay(counter) touchpad_delay_ms(counter)
|
||||
|
||||
extern I2C_HandleTypeDef i2c_touchpad_handle;
|
||||
|
||||
static struct sm_touch_dev st_dev;
|
||||
static uint8_t counter;
|
||||
|
||||
void touchpad_reset_set(void);
|
||||
void touchpad_reset_clear(void);
|
||||
void touchpad_delay_ms(uint32_t counter);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn i2c_memory_read
|
||||
*
|
||||
* @brief i2c memory read.
|
||||
*/
|
||||
bool i2c_memory_chsc5816_read(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint32_t fu32_MemAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
||||
{
|
||||
uint32_t lu32_RxCount = fu32_Size;
|
||||
|
||||
counter = 0;
|
||||
|
||||
if (fu32_Size == 0)
|
||||
goto _exit_i2c_read;
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
||||
|
||||
__I2C_ENABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 24) & 0xFF;
|
||||
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 16) & 0xFF;
|
||||
|
||||
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
||||
|
||||
/* DevAddress NACK */
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
counter = 1;
|
||||
|
||||
goto _exit_i2c_read;
|
||||
}
|
||||
|
||||
hi2c->I2Cx->DATA_CMD = (fu32_MemAddress >> 8) & 0xFF;
|
||||
hi2c->I2Cx->DATA_CMD = fu32_MemAddress & 0xFF;
|
||||
|
||||
|
||||
if (fu32_Size > 1)
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ;
|
||||
|
||||
while (fu32_Size - 2)
|
||||
{
|
||||
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_READ;
|
||||
|
||||
fu32_Size--;
|
||||
}
|
||||
|
||||
while (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
||||
{
|
||||
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
||||
|
||||
lu32_RxCount--;
|
||||
}
|
||||
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
counter = 2;
|
||||
|
||||
goto _exit_i2c_read;
|
||||
}
|
||||
}
|
||||
|
||||
/* Last byte with stop */
|
||||
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
||||
hi2c->I2Cx->DATA_CMD = CMD_READ | CMD_STOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = CMD_RESTART | CMD_READ | CMD_STOP;
|
||||
}
|
||||
|
||||
while (lu32_RxCount)
|
||||
{
|
||||
if (!__I2C_IS_RxFIFO_EMPTY(hi2c->I2Cx))
|
||||
{
|
||||
*fp_Data++ = hi2c->I2Cx->DATA_CMD & 0xFF;
|
||||
|
||||
lu32_RxCount--;
|
||||
}
|
||||
}
|
||||
|
||||
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
||||
|
||||
return true;
|
||||
|
||||
_exit_i2c_read:
|
||||
PRINT_DBG("I2c r:%d\n",counter);
|
||||
|
||||
__NOP();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
* @fn i2c_memory_write
|
||||
*
|
||||
* @brief i2c memory write.
|
||||
*/
|
||||
bool i2c_memory_chsc5816_write(I2C_HandleTypeDef *hi2c, uint16_t fu16_DevAddress, uint8_t *fp_Data, uint32_t fu32_Size)
|
||||
{
|
||||
counter = 0;
|
||||
|
||||
if (fu32_Size < 2)
|
||||
goto _exit_i2c_write;
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->TAR.TAR = fu16_DevAddress >> 1;
|
||||
|
||||
__I2C_ENABLE(hi2c->I2Cx);
|
||||
|
||||
hi2c->I2Cx->DATA_CMD = *fp_Data++;
|
||||
hi2c->I2Cx->DATA_CMD = *fp_Data++;
|
||||
|
||||
while (!__I2C_IS_TxFIFO_EMPTY(hi2c->I2Cx));
|
||||
|
||||
/* DevAddress NACK */
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
counter = 1;
|
||||
goto _exit_i2c_write;
|
||||
}
|
||||
|
||||
fu32_Size -= 2;
|
||||
|
||||
while (fu32_Size - 1 > 0)
|
||||
{
|
||||
if (!__I2C_IS_TxFIFO_FULL(hi2c->I2Cx))
|
||||
{
|
||||
hi2c->I2Cx->DATA_CMD = *fp_Data++;
|
||||
|
||||
fu32_Size--;
|
||||
}
|
||||
|
||||
if (i2c_get_int_status(hi2c, INT_TX_ABRT))
|
||||
{
|
||||
i2c_clear_int_status(hi2c, INT_TX_ABRT);
|
||||
|
||||
__I2C_DISABLE(hi2c->I2Cx);
|
||||
|
||||
counter = 2;
|
||||
goto _exit_i2c_write;
|
||||
}
|
||||
}
|
||||
|
||||
/* Last byte with stop */
|
||||
while (__I2C_IS_TxFIFO_FULL(hi2c->I2Cx));
|
||||
hi2c->I2Cx->DATA_CMD = *fp_Data | CMD_STOP;
|
||||
|
||||
while(__I2C_IS_BUSY(hi2c->I2Cx));
|
||||
|
||||
//while(i2c_memory_is_busy(hi2c, fu16_DevAddress));
|
||||
|
||||
return true;
|
||||
|
||||
_exit_i2c_write:
|
||||
PRINT_DBG("I2c w:%d\n",counter);
|
||||
|
||||
__NOP();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void semi_touch_power_int(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static void semi_touch_msdelay(uint32_t millisecs)
|
||||
{
|
||||
HAL_Delay(millisecs);
|
||||
}
|
||||
|
||||
static void semi_touch_reset(void)
|
||||
{
|
||||
__CHSC5816_RESET_SET();
|
||||
HAL_Delay(10);
|
||||
__CHSC5816_RESET_CLEAR();
|
||||
HAL_Delay(5);
|
||||
__CHSC5816_RESET_SET();
|
||||
HAL_Delay(200);
|
||||
}
|
||||
|
||||
int32_t semi_touch_iic_write(uint32_t reg, uint8_t* pdata, uint16_t len)
|
||||
{
|
||||
|
||||
if(i2c_memory_chsc5816_write(&i2c_touchpad_handle, (uint16_t)CHSC5816_ADDRESS, pdata, len) == 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return SEMI_DRV_ERR_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
reg : must 4B aligned
|
||||
len : must multiple of 4
|
||||
*/
|
||||
int32_t semi_i2c_read_bytes(uint32_t reg, uint8_t* pdata, uint16_t len)
|
||||
{
|
||||
if(i2c_memory_chsc5816_read(&i2c_touchpad_handle, (uint16_t)CHSC5816_ADDRESS, reg, pdata, len) == 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return SEMI_DRV_ERR_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
reg - register address, must 4B aligned
|
||||
buffer - data buffer
|
||||
len - data length, must 4B aligned
|
||||
|
||||
return:
|
||||
0 - pass
|
||||
others - fail
|
||||
*/
|
||||
int32_t semi_touch_read_bytes(uint32_t reg, uint8_t* buffer, uint16_t len)
|
||||
{
|
||||
int32_t ret = SEMI_DRV_ERR_OK;
|
||||
uint16_t once;
|
||||
uint32_t retry;
|
||||
|
||||
while(len > 0){
|
||||
once = (len>MAX_IO_BUFFER_LEN)?MAX_IO_BUFFER_LEN:len;
|
||||
|
||||
ret = -1;
|
||||
for(retry=0; retry<3; retry++){
|
||||
if(semi_i2c_read_bytes(reg, buffer,once) == SEMI_DRV_ERR_OK){
|
||||
ret = SEMI_DRV_ERR_OK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(ret != SEMI_DRV_ERR_OK){
|
||||
break;
|
||||
}
|
||||
|
||||
reg += once;
|
||||
buffer += once;
|
||||
len -= once;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
reg - register address, must 4B aligned
|
||||
buffer - data buffer
|
||||
len - data length, must 4B aligned
|
||||
|
||||
return:
|
||||
0 - pass
|
||||
others - fail
|
||||
*/
|
||||
int32_t semi_touch_write_bytes(uint32_t reg, uint8_t* buffer, uint16_t len)
|
||||
{
|
||||
int32_t ret = SEMI_DRV_ERR_OK;
|
||||
uint16_t once;
|
||||
uint32_t k, retry;
|
||||
uint8_t writeBuff[MAX_IO_BUFFER_LEN];
|
||||
|
||||
while(len > 0){
|
||||
once = (len<(MAX_IO_BUFFER_LEN-4))?len:(MAX_IO_BUFFER_LEN-4);
|
||||
|
||||
writeBuff[0] = (uint8_t)(reg>>24);
|
||||
writeBuff[1] = (uint8_t)(reg>>16);
|
||||
writeBuff[2] = (uint8_t)(reg>>8);
|
||||
writeBuff[3] = (uint8_t)(reg);
|
||||
for(k=0; k<once; k++){
|
||||
writeBuff[k+4] = buffer[k];
|
||||
}
|
||||
|
||||
ret = -1;
|
||||
for(retry=0; retry<3; retry++){
|
||||
if(semi_touch_iic_write(reg, writeBuff, once+4) == SEMI_DRV_ERR_OK){
|
||||
ret = SEMI_DRV_ERR_OK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(ret != SEMI_DRV_ERR_OK){
|
||||
break;
|
||||
}
|
||||
|
||||
reg += once;
|
||||
buffer += once;
|
||||
len -= once;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int32_t semi_touch_write_and_check(uint32_t addr, uint8_t* buffer, uint16_t len)
|
||||
{
|
||||
int32_t ret = 0, once = 0, index = 0, retry = 0;
|
||||
uint8_t cmp_buffer[MAX_IO_BUFFER_LEN-4];
|
||||
|
||||
while(len > 0){
|
||||
retry = 0;
|
||||
do{
|
||||
ret = SEMI_DRV_ERR_OK;
|
||||
once = (len<(MAX_IO_BUFFER_LEN-4))?len:(MAX_IO_BUFFER_LEN-4);
|
||||
ret = semi_touch_write_bytes(addr, buffer, once);
|
||||
ret = semi_touch_read_bytes(addr, cmp_buffer, once);
|
||||
for(index = 0; index < once; index++){
|
||||
if(cmp_buffer[index] != buffer[index]){
|
||||
ret = -SEMI_DRV_ERR_CHECKSUM;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(SEMI_DRV_ERR_OK == ret){
|
||||
break;
|
||||
}
|
||||
}while(++retry < 3);
|
||||
|
||||
if(SEMI_DRV_ERR_OK != ret){
|
||||
break;
|
||||
}
|
||||
|
||||
addr += once;
|
||||
buffer += once;
|
||||
len -= once;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int32_t semi_touch_run_ram_code(const uint8_t* bin_code, uint16_t len)
|
||||
{
|
||||
int32_t retry;
|
||||
int32_t ret = 0, reg_value = 0;
|
||||
|
||||
for(retry = 0; retry < 5; retry++){
|
||||
//reset mcu
|
||||
semi_touch_reset();
|
||||
|
||||
//hold mcu
|
||||
reg_value = 0x12044000;
|
||||
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)®_value, 4);
|
||||
if(ret != 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
//open auto feed
|
||||
reg_value = 0x0000925a;
|
||||
ret = semi_touch_write_bytes(0x40007010, (uint8_t*)®_value, 4);
|
||||
if(ret != 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
//run ramcode
|
||||
ret = semi_touch_write_and_check(0x20000000, (uint8_t* )bin_code, len);
|
||||
if(ret != 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if(ret != 0){
|
||||
return -1;
|
||||
}
|
||||
|
||||
//remap
|
||||
reg_value = 0x12044002;
|
||||
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)®_value, 4);
|
||||
if(ret != 0){
|
||||
return -1;
|
||||
}
|
||||
|
||||
//release mcu
|
||||
reg_value = 0x12044003;
|
||||
ret = semi_touch_write_bytes(0x40007000, (uint8_t*)®_value, 4);
|
||||
if(ret != 0){
|
||||
return -1;
|
||||
}
|
||||
|
||||
semi_touch_msdelay(30);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint16_t caculate_checksum_u16(uint16_t *buf, uint16_t length)
|
||||
{
|
||||
uint16_t sum, len, i;
|
||||
|
||||
sum = 0;
|
||||
|
||||
len = length >> 1;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
sum += buf[i];
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
static uint32_t caculate_checksum_ex(uint8_t * buf, uint16_t length)
|
||||
{
|
||||
uint32_t combchk = 0;
|
||||
uint16_t k = 0, check = 0, checkex = 0;
|
||||
|
||||
for (k = 0; k < length; k++) {
|
||||
check += buf[k];
|
||||
checkex += (uint16_t)(k * buf[k]);
|
||||
}
|
||||
|
||||
combchk = (checkex<<16) | check;
|
||||
|
||||
return combchk;
|
||||
}
|
||||
|
||||
static int32_t cmd_send_to_tp(struct m_ctp_cmd_std_t *ptr_cmd, struct m_ctp_rsp_std_t *ptr_rsp,
|
||||
int32_t once_delay, int32_t poolgap)
|
||||
{
|
||||
int32_t ret = -SEMI_DRV_ERR_HAL_IO;
|
||||
uint32_t retry = 0;
|
||||
uint32_t cmd_rsp_ok = 0;
|
||||
|
||||
ptr_cmd->tag = 0xE9;
|
||||
ptr_cmd->chk = 1 + ~caculate_checksum_u16((uint16_t*)&ptr_cmd->d0, sizeof(struct m_ctp_cmd_std_t) - 2);
|
||||
ret = semi_touch_write_bytes(0x20000000, (uint8_t*)ptr_cmd, sizeof(struct m_ctp_cmd_std_t));
|
||||
if(ret != 0){ // TODO: need confirm!!!
|
||||
return -1;
|
||||
}
|
||||
|
||||
semi_touch_msdelay(once_delay);
|
||||
while(retry++ < 20){
|
||||
semi_touch_msdelay(poolgap);
|
||||
ret = semi_touch_read_bytes(0x20000000, (uint8_t*)ptr_rsp, sizeof(struct m_ctp_rsp_std_t));
|
||||
if(ret != 0){ // TODO: need confirm!!!
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(ptr_cmd->id != ptr_rsp->id){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!caculate_checksum_u16((uint16_t*)ptr_rsp, sizeof(struct m_ctp_rsp_std_t))){
|
||||
if(0 == ptr_rsp->cc){ //success
|
||||
cmd_rsp_ok = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = -1;
|
||||
if(cmd_rsp_ok == 1){
|
||||
ret = SEMI_DRV_ERR_OK;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
return:
|
||||
0(SEMI_DRV_ERR_OK) ->success
|
||||
others ->fail
|
||||
*/
|
||||
static int32_t semi_touch_nvm_read(uint8_t *pdes, uint32_t adr, uint32_t len)
|
||||
{
|
||||
int32_t ret = -1;
|
||||
uint32_t left = len;
|
||||
uint32_t local_check, retry;
|
||||
struct m_ctp_cmd_std_t cmd_send_tp;
|
||||
struct m_ctp_rsp_std_t ack_from_tp;
|
||||
|
||||
cmd_send_tp.id = CMD_MEM_RD;
|
||||
|
||||
while (left) {
|
||||
len = (left > 1024) ? 1024 : left;
|
||||
|
||||
cmd_send_tp.d0 = adr & 0xffff;
|
||||
cmd_send_tp.d1 = len;
|
||||
cmd_send_tp.d2 = 0;
|
||||
cmd_send_tp.d3 = NVM_R;
|
||||
cmd_send_tp.d5 = (adr >> 16) & 0xffff;
|
||||
|
||||
retry = 0;
|
||||
while (retry++ < 3) {
|
||||
ack_from_tp.id = CMD_NA;
|
||||
ret = cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 10);
|
||||
if(SEMI_DRV_ERR_OK != ret){
|
||||
continue;
|
||||
}
|
||||
|
||||
semi_touch_read_bytes(TP_RD_BUFF_ADDR, pdes, len);
|
||||
|
||||
local_check = caculate_checksum_ex(pdes, len);
|
||||
if ((ack_from_tp.d0 != (uint16_t)local_check) ||
|
||||
(ack_from_tp.d1 != (uint16_t)(local_check >> 16))){
|
||||
ret = -SEMI_DRV_ERR_CHECKSUM;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
adr += len;
|
||||
left -= len;
|
||||
pdes += len;
|
||||
if(ret != SEMI_DRV_ERR_OK){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int32_t semi_touch_nvm_write(uint8_t *psrc, uint32_t adr, uint32_t len)
|
||||
{
|
||||
int32_t ret = -1;
|
||||
uint32_t left = len;
|
||||
uint32_t retry, combChk;
|
||||
struct m_ctp_cmd_std_t cmd_send_tp;
|
||||
struct m_ctp_rsp_std_t ack_from_tp;
|
||||
|
||||
cmd_send_tp.id = CMD_MEM_WR;
|
||||
|
||||
while (left) {
|
||||
len = (left > 1024) ? 1024 : left;
|
||||
combChk = caculate_checksum_ex(psrc, len);
|
||||
|
||||
cmd_send_tp.d0 = adr & 0xffff; /* addrss space[0,64K) */
|
||||
cmd_send_tp.d1 = len;
|
||||
cmd_send_tp.d3 = NVM_W;
|
||||
cmd_send_tp.d2 = (uint16_t) combChk;
|
||||
cmd_send_tp.d4 = (uint16_t) (combChk >> 16);
|
||||
cmd_send_tp.d5 = (adr >> 16) & 0xffff;
|
||||
|
||||
retry = 0;
|
||||
while (++retry <= 3) {
|
||||
ret = semi_touch_write_bytes(TP_WR_BUFF_ADDR, psrc, len);
|
||||
if(SEMI_DRV_ERR_OK != ret) continue;
|
||||
|
||||
ack_from_tp.id = CMD_NA;
|
||||
ret = cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 200, 20);
|
||||
if(SEMI_DRV_ERR_OK != ret) continue;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
left -= len;
|
||||
adr += len;
|
||||
psrc += len;
|
||||
if(ret != SEMI_DRV_ERR_OK){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int32_t semi_touch_burn_erase(void)
|
||||
{
|
||||
struct m_ctp_cmd_std_t cmd_send_tp;
|
||||
struct m_ctp_rsp_std_t ack_from_tp;
|
||||
|
||||
cmd_send_tp.id = CMD_FLASH_ERASE;
|
||||
cmd_send_tp.d0 = 0x01;
|
||||
|
||||
return cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 1000, 40);
|
||||
}
|
||||
|
||||
/*
|
||||
This function push IC into NVM mode, call it carefully and must reset
|
||||
IC to enter normal mode.
|
||||
return:
|
||||
0(SEMI_DRV_ERR_OK) ->success
|
||||
others ->fail
|
||||
*/
|
||||
static int32_t semi_touch_enter_burn_mode(void)
|
||||
{
|
||||
struct m_ctp_cmd_std_t cmd_send_tp;
|
||||
struct m_ctp_rsp_std_t ack_from_tp;
|
||||
|
||||
ack_from_tp.d0 = 0;
|
||||
cmd_send_tp.id = CMD_IDENTITY;
|
||||
cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 5);
|
||||
if((ack_from_tp.d0 == 0xE9A2) && (ack_from_tp.d1 == 0x165d)){
|
||||
return SEMI_DRV_ERR_OK;
|
||||
}
|
||||
|
||||
if(semi_touch_run_ram_code(fw_5816_burn, sizeof(fw_5816_burn)) != 0){
|
||||
return -1;
|
||||
}
|
||||
|
||||
cmd_send_tp.id = CMD_IDENTITY;
|
||||
if(cmd_send_to_tp(&cmd_send_tp, &ack_from_tp, 20, 5) != 0){
|
||||
return -1;
|
||||
}
|
||||
if((ack_from_tp.d0 == 0xE9A2) && (ack_from_tp.d1 == 0x165d)){
|
||||
return SEMI_DRV_ERR_OK;
|
||||
}
|
||||
|
||||
return -SEMI_DRV_ERR_HAL_IO;
|
||||
}
|
||||
|
||||
|
||||
static int32_t semi_get_backup_pid(uint32_t *id)
|
||||
{
|
||||
st_dev.ctp_status = CTP_UPGRAD_RUNING;
|
||||
|
||||
if(semi_touch_enter_burn_mode() != SEMI_DRV_ERR_OK){
|
||||
return -1;
|
||||
}
|
||||
|
||||
return semi_touch_nvm_read((uint8_t *)id, VID_PID_BACKUP_ADDR, 4);
|
||||
}
|
||||
|
||||
static int32_t semi_touch_update_check(void)
|
||||
{
|
||||
uint32_t pvid;
|
||||
uint8_t * pfw;
|
||||
uint32_t * plist;
|
||||
int32_t k, idx_active;
|
||||
uint16_t upd_boot_ver = 0;
|
||||
struct chsc_updfile_header *upd_header;
|
||||
|
||||
st_dev.needUpd = 0;
|
||||
st_dev.updPdata = 0;
|
||||
st_dev.newBootLen = 0;
|
||||
if(st_dev.setup_ok == 0){
|
||||
if(semi_get_backup_pid(&pvid) == 0){
|
||||
st_dev.vid_pid = pvid;
|
||||
}
|
||||
}
|
||||
|
||||
if((uint32_t)chsc_upd_data & 3){
|
||||
PRINT_DBG("chsc::illegal memory buffer, must 4B aliged\n");
|
||||
return -SEMI_DRV_INVALID_PARAM;
|
||||
}
|
||||
|
||||
upd_header = (struct chsc_updfile_header *)chsc_upd_data;
|
||||
|
||||
if((upd_header->sig != 0x43534843) || (upd_header->n_match == 0)) {
|
||||
PRINT_DBG("chsc::illegal upd_header\n");
|
||||
return -SEMI_DRV_ERR_NOT_MATCH;
|
||||
}
|
||||
|
||||
if((upd_header->len_boot <= 15*1024) || (upd_header->len_boot >= 40*1024)) {
|
||||
PRINT_DBG("chsc::illegal upd_header\n");
|
||||
return -SEMI_DRV_ERR_NOT_MATCH;
|
||||
}
|
||||
|
||||
plist = (uint32_t *)((uint8_t *)chsc_upd_data + sizeof(struct chsc_updfile_header));
|
||||
pfw = (uint8_t *)plist + (upd_header->n_match*4) + upd_header->len_cfg;
|
||||
|
||||
if((pfw[0x30] != 0x16) || (pfw[0x31] != 0x58)){
|
||||
PRINT_DBG("chsc:no chsc5816 fw found\n");
|
||||
return -SEMI_DRV_ERR_NOT_MATCH;
|
||||
}
|
||||
|
||||
st_dev.updPdata = pfw;
|
||||
st_dev.newBootLen = upd_header->len_boot;
|
||||
|
||||
idx_active = -1;
|
||||
upd_boot_ver = (pfw[0x3f] << 8) + pfw[0x3e];
|
||||
for (k=0; k<upd_header->n_match; k++) {
|
||||
pvid = plist[k];
|
||||
PRINT_DBG("chsc::pid_vid in list=0x%x\n", pvid);
|
||||
if ((pvid & PID_VID_MASK) == (st_dev.vid_pid & PID_VID_MASK)) {
|
||||
PRINT_DBG("chsc::running_ver=%d, upd_ver=%d\n", st_dev.fw_ver, upd_boot_ver);
|
||||
if((st_dev.fw_ver < upd_boot_ver) || (st_dev.setup_ok == 0)){
|
||||
idx_active = k;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if((st_dev.setup_ok == 0) && (idx_active < 0)){
|
||||
idx_active = 0;
|
||||
}
|
||||
|
||||
if(idx_active >= 0){
|
||||
st_dev.needUpd = 1;
|
||||
}
|
||||
|
||||
return SEMI_DRV_ERR_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
return:
|
||||
0 ->success
|
||||
others ->fail
|
||||
|
||||
*/
|
||||
static int32_t semi_touch_update(uint8_t *pdata, uint32_t len)
|
||||
{
|
||||
if((pdata == NULL) || (len<1024) || (len>0x9f00)){
|
||||
PRINT_DBG("chsc:semi_touch_update, not chsc5816 fw\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((pdata[0x30] != 0x16) || (pdata[0x31] != 0x58)){
|
||||
PRINT_DBG("chsc:semi_touch_update, not chsc5816 fw\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(semi_touch_enter_burn_mode() != 0){
|
||||
//kal_prompt_trace(MOD_WAP,"chsc::semi_touch_enter_burn_mode fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(semi_touch_burn_erase() != 0){
|
||||
PRINT_DBG("chsc::semi_touch_burn_erase fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(semi_touch_nvm_write(pdata, 0x00000000, len) != 0){
|
||||
PRINT_DBG("chsc::semi_touch_nvm_write fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return SEMI_DRV_ERR_OK;
|
||||
}
|
||||
|
||||
static void semi_touch_setup_check(void)
|
||||
{
|
||||
int32_t retry = 0;
|
||||
uint32_t naFlag = 0;
|
||||
img_header_t image_header;
|
||||
img_header_t image_confirm;
|
||||
|
||||
//clean boot status
|
||||
semi_touch_write_bytes(0x20000018, (uint8_t*)&naFlag, 4);
|
||||
|
||||
semi_touch_reset();
|
||||
|
||||
st_dev.fw_ver = 0;
|
||||
st_dev.vid_pid = 0;
|
||||
st_dev.setup_ok = 0;//default error
|
||||
|
||||
image_header.sig = 0;
|
||||
for(retry=0; retry<10; retry++){
|
||||
semi_touch_msdelay(10);
|
||||
|
||||
if(semi_touch_read_bytes(0x20000014, (uint8_t*)&image_header, sizeof(image_header)) != 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(semi_touch_read_bytes(0x20000014, (uint8_t*)&image_confirm, sizeof(image_confirm)) != 0){
|
||||
continue;
|
||||
}
|
||||
if((image_header.sig != image_confirm.sig) ||
|
||||
(image_header.vid_pid != image_confirm.vid_pid) ||
|
||||
(image_header.raw_offet != image_confirm.raw_offet) ||
|
||||
(image_header.dif_offet != image_confirm.dif_offet) ||
|
||||
(image_header.fw_ver != image_confirm.fw_ver)){
|
||||
//kal_prompt_trace(MOD_WAP,"chsc::double check, retry\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if(image_header.sig == 0x43534843){ //"CHSC"
|
||||
st_dev.fw_ver = image_header.fw_ver;
|
||||
st_dev.vid_pid = image_header.vid_pid;
|
||||
st_dev.raw_adr = image_confirm.raw_offet + 0x20000000;
|
||||
st_dev.setup_ok = 1;//pass
|
||||
st_dev.ctp_status = CTP_POINTING_WORK;
|
||||
break;
|
||||
}else if(image_header.sig == 0x4F525245){ //boot self check fail
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t semi_touch_dect(void)
|
||||
{
|
||||
uint32_t u32Data, retry;
|
||||
|
||||
for(retry=0; retry<3; retry++){
|
||||
semi_touch_reset();
|
||||
|
||||
if(!semi_touch_read_bytes(0x20000000, (uint8_t *)&u32Data, 4)){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void semi_touch_irq_handler_imp(void)
|
||||
{
|
||||
#define _UI_MAX_POINTS 1
|
||||
#define GEST_CODE_ACT_LS 0x10 //left
|
||||
#define GEST_CODE_ACT_RS 0x20 //right
|
||||
#define GEST_CODE_ACT_US 0x30 //up
|
||||
#define GEST_CODE_ACT_DS 0x40 //down
|
||||
|
||||
int pointed = 0;
|
||||
union rpt_point_t* ppt;
|
||||
unsigned char gestCode;
|
||||
unsigned char data[8];
|
||||
int x, y;
|
||||
PRINT_DBG("semi_touch_irq_handler_imp\r\n");
|
||||
|
||||
if(semi_touch_read_bytes(0x2000002c, data, 8)){
|
||||
PRINT_DBG("chsc:read pixel data fail\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
PRINT_DBG("imp = %x %x\r\n",data[0], data[1]);
|
||||
|
||||
pointed = 0;
|
||||
ppt = (union rpt_point_t*)&data[2];
|
||||
if((data[0] == 0xff) && (data[1] <= 2)){
|
||||
if(data[1] > 0){
|
||||
pointed = 1;
|
||||
x = (unsigned int)(ppt->rp.x_h4 << 8) | ppt->rp.x_l8;
|
||||
y = (unsigned int)(ppt->rp.y_h4 << 8) | ppt->rp.y_l8;
|
||||
}
|
||||
}else{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
bool semi_touch_read_coordinate(int16_t *x, int16_t *y)
|
||||
{
|
||||
int pointed = 0;
|
||||
union rpt_point_t* ppt;
|
||||
unsigned char data[8];
|
||||
|
||||
if(semi_touch_read_bytes(0x2000002c, data, 8)){
|
||||
PRINT_DBG("chsc:read pixel data fail\n" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
pointed = 0;
|
||||
ppt = (union rpt_point_t*)&data[2];
|
||||
if((data[0] == 0xff) && (data[1] <= 2)){
|
||||
if(data[1] > 0){
|
||||
pointed = 1;
|
||||
*x = (unsigned int)(ppt->rp.x_h4 << 8) | ppt->rp.x_l8;
|
||||
*y = (unsigned int)(ppt->rp.y_h4 << 8) | ppt->rp.y_l8;
|
||||
PRINT_DBG("x = %d y = %d \r\n",*x, *y);
|
||||
}
|
||||
}
|
||||
|
||||
return pointed;
|
||||
}
|
||||
|
||||
int semi_touch_init()
|
||||
{
|
||||
semi_touch_power_int();
|
||||
|
||||
if(semi_touch_dect() != SEMI_DRV_ERR_OK){
|
||||
PRINT_DBG("chsc:no chsc5816\r\n" );
|
||||
return -1;
|
||||
}
|
||||
|
||||
semi_touch_setup_check();
|
||||
|
||||
semi_touch_update_check();
|
||||
|
||||
semi_touch_reset();
|
||||
st_dev.ctp_status = CTP_POINTING_WORK;
|
||||
|
||||
PRINT_DBG("chsc init ok\r\n" );
|
||||
|
||||
return 0;
|
||||
}
|
170
MCU/components/drivers/bsp/touchpad/driver_touchpad.c
Normal file
170
MCU/components/drivers/bsp/touchpad/driver_touchpad.c
Normal file
@ -0,0 +1,170 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "driver_touchpad.h"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
//#define TOUCHPAD_SH8601A
|
||||
//#define TOUCHPAD_ICNA3310
|
||||
//#define TOUCHPAD_CHSC586
|
||||
//#define TOUCHPAD_CHSC6x
|
||||
//#define TOUCHPAD_CTP820
|
||||
#define TOUCHPAD_FT6336U
|
||||
|
||||
#ifdef TOUCHPAD_SH8601A
|
||||
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x2C<<1) // from sh8601a
|
||||
#endif
|
||||
#ifdef TOUCHPAD_ICNA3310
|
||||
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x48 << 1) // from icna3310
|
||||
#endif
|
||||
#ifdef TOUCHPAD_CTP820
|
||||
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x15 << 1) // from ctp820
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_FT6336U
|
||||
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x71) // from ft6336u
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CHSC586
|
||||
extern bool semi_touch_read_coordinate(int16_t *x, int16_t *y);
|
||||
extern int semi_touch_init();
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CHSC6x
|
||||
bool chsc6x_read_touch_info(int16_t *x, int16_t *y);
|
||||
void chsc6x_init(void);
|
||||
#endif
|
||||
|
||||
bool touchpad_read(int16_t *x, int16_t *y)
|
||||
{
|
||||
#ifdef TOUCHPAD_SH8601A
|
||||
uint8_t buffer[8];
|
||||
bool pressed = false;
|
||||
|
||||
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0, buffer, 8);
|
||||
|
||||
if (buffer[2] != 0) {
|
||||
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
|
||||
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
|
||||
pressed = true;
|
||||
}
|
||||
else {
|
||||
pressed = false;
|
||||
}
|
||||
|
||||
return pressed;
|
||||
#endif
|
||||
#ifdef TOUCHPAD_ICNA3310
|
||||
uint8_t buffer[9];
|
||||
bool pressed = false;
|
||||
|
||||
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x1000, buffer, 9);
|
||||
|
||||
if (buffer[1] == 1) {
|
||||
*x = ((buffer[4]&0x0f)<<8) | buffer[3];
|
||||
*y = ((buffer[6]&0x0f)<<8) | buffer[5];
|
||||
pressed = true;
|
||||
}
|
||||
else {
|
||||
pressed = false;
|
||||
}
|
||||
|
||||
return pressed;
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CHSC586
|
||||
return semi_touch_read_coordinate(x, y);
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CHSC6x
|
||||
return chsc6x_read_touch_info(x, y);
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CTP820
|
||||
uint8_t buffer[7];
|
||||
bool pressed = false;
|
||||
|
||||
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
|
||||
|
||||
if (buffer[2] == 1) {
|
||||
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
|
||||
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
|
||||
pressed = true;
|
||||
}
|
||||
else {
|
||||
pressed = false;
|
||||
}
|
||||
|
||||
return pressed;
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_FT6336U
|
||||
uint8_t buffer[7];
|
||||
bool pressed = false;
|
||||
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
|
||||
if (buffer[2] == 1) {
|
||||
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
|
||||
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
|
||||
pressed = true;
|
||||
}
|
||||
else {
|
||||
pressed = false;
|
||||
}
|
||||
|
||||
return pressed;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void touchpad_init(void)
|
||||
{
|
||||
#ifdef TOUCHPAD_ICNA3310
|
||||
/* reset touch pad chip */
|
||||
__TOUCHPAD_RESET_SET();
|
||||
__TOUCHPAD_DELAY_MS(10);
|
||||
__TOUCHPAD_RESET_CLEAR();
|
||||
__TOUCHPAD_DELAY_MS(5);
|
||||
__TOUCHPAD_RESET_SET();
|
||||
__TOUCHPAD_DELAY_MS(200);
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CHSC586
|
||||
semi_touch_init();
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CHSC6x
|
||||
chsc6x_init();
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_CTP820
|
||||
/* reset touch pad chip */
|
||||
__TOUCHPAD_RESET_SET();
|
||||
__TOUCHPAD_DELAY_MS(10);
|
||||
__TOUCHPAD_RESET_CLEAR();
|
||||
__TOUCHPAD_DELAY_MS(10);
|
||||
__TOUCHPAD_RESET_SET();
|
||||
__TOUCHPAD_DELAY_MS(50);
|
||||
#endif
|
||||
|
||||
#ifdef TOUCHPAD_FT6336U
|
||||
/* reset touch pad chip */
|
||||
__TOUCHPAD_RESET_SET();
|
||||
__TOUCHPAD_RESET_CLEAR();
|
||||
vTaskDelay(10);
|
||||
__TOUCHPAD_RESET_SET();
|
||||
vTaskDelay(250);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void touchpad_sleep(void)
|
||||
{
|
||||
|
||||
#ifdef TOUCHPAD_CTP820
|
||||
uint8_t value = 0x03;
|
||||
i2c_memory_write(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0xE5, &value, 1);
|
||||
|
||||
#endif
|
||||
|
||||
}
|
88
MCU/components/drivers/bsp/touchpad/driver_touchpad.h
Normal file
88
MCU/components/drivers/bsp/touchpad/driver_touchpad.h
Normal file
@ -0,0 +1,88 @@
|
||||
#ifndef _DRIVER_TOUCHPAD_H
|
||||
#define _DRIVER_TOUCHPAD_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "driver_i2c.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Macro Variables definitions
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#define __TOUCHPAD_RESET_SET() touchpad_reset_set()
|
||||
#define __TOUCHPAD_RESET_CLEAR() touchpad_reset_clear()
|
||||
#define __TOUCHPAD_DELAY_MS(counter) touchpad_delay_ms(counter)
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Global Variables definitions
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern I2C_HandleTypeDef i2c_touchpad_handle;
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// External function definitions
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
/************************************************************************************
|
||||
* @fn touchpad_reset_set
|
||||
*
|
||||
* @brief Set touchpad driver RESET pin to HIGH, this function should be implemented by user..
|
||||
*/
|
||||
void touchpad_reset_set(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn touchpad_reset_clear
|
||||
*
|
||||
* @brief Set touchpad driver RESET pin to LOW, this function should be implemented by user.
|
||||
*/
|
||||
void touchpad_reset_clear(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn touchpad_delay_ms
|
||||
*
|
||||
* @brief Used in touchpad driver. co_delay_100us or vTaskDelay can be used for implementation
|
||||
* by user.
|
||||
*/
|
||||
void touchpad_delay_ms(uint32_t counter);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn touchpad_read
|
||||
*
|
||||
* @brief used to read data from touchpad, these data are update in interrupt
|
||||
*
|
||||
* @param x: current x position.
|
||||
* y: current y position.
|
||||
*
|
||||
* @return true: pressed and x, y value is valid; false: released
|
||||
*/
|
||||
bool touchpad_read(int16_t *x, int16_t *y);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn touchpad_init
|
||||
*
|
||||
* @brief used to init touchpad
|
||||
*/
|
||||
void touchpad_init(void);
|
||||
|
||||
/************************************************************************************
|
||||
* @fn touchpad_sleep
|
||||
*
|
||||
* @brief touchpad go to sleep
|
||||
*/
|
||||
void touchpad_sleep(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _DRIVER_TOUCHPAD_H
|
Reference in New Issue
Block a user