You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

106 lines
3.0 KiB
C

#include "p_gpio.h"
static void p_weird_delay(void)
{
for(int x = 0; x < 8; x++)
{
asm volatile("nop");
}
}
void p_gpio_init(void)
{
// set data port config
p_port_config data_config;
memset(&data_config, 0, sizeof(data_config));
data_config.direction = GPIO_DIRECTION_OUT;
data_config.pull_mode = GPIO_PULL_OFF;
data_config.function = GPIO_PIN_FUNCTION_OFF;
p_gpio_set_port_group_config(SSD1963_TFT_DATA_PORT, SSD1963_TFT_DATA_MASK, &data_config);
// set lcd control pin configs
// Chip select
gpio_set_pin_direction(SSD1963_TFT_CS, GPIO_DIRECTION_OUT);
gpio_set_pin_pull_mode(SSD1963_TFT_CS, GPIO_PULL_OFF);
gpio_set_pin_function(SSD1963_TFT_CS, GPIO_PIN_FUNCTION_OFF);
// Reset pin
gpio_set_pin_direction(SSD1963_TFT_nRST, GPIO_DIRECTION_OUT);
gpio_set_pin_pull_mode(SSD1963_TFT_nRST, GPIO_PULL_OFF);
gpio_set_pin_function(SSD1963_TFT_nRST, GPIO_PIN_FUNCTION_OFF);
// Read pin
gpio_set_pin_direction(SSD1963_TFT_RD, GPIO_DIRECTION_OUT);
gpio_set_pin_pull_mode(SSD1963_TFT_RD, GPIO_PULL_OFF);
gpio_set_pin_function(SSD1963_TFT_RD, GPIO_PIN_FUNCTION_OFF);
// RSDC pin, aka Read/Send Data/Command pin
gpio_set_pin_direction(SSD1963_TFT_RSDC, GPIO_DIRECTION_OUT);
gpio_set_pin_pull_mode(SSD1963_TFT_RSDC, GPIO_PULL_OFF);
gpio_set_pin_function(SSD1963_TFT_RSDC, GPIO_PIN_FUNCTION_OFF);
// Write Pin
gpio_set_pin_direction(SSD1963_TFT_WR, GPIO_DIRECTION_OUT);
gpio_set_pin_pull_mode(SSD1963_TFT_WR, GPIO_PULL_OFF);
gpio_set_pin_function(SSD1963_TFT_WR, GPIO_PIN_FUNCTION_OFF);
// TE, tear enable, aka frame sync
gpio_set_pin_direction(SSD1963_TFT_TE, GPIO_DIRECTION_IN);
gpio_set_pin_pull_mode(SSD1963_TFT_TE, GPIO_PULL_DOWN);
gpio_set_pin_function(SSD1963_TFT_TE, GPIO_PIN_FUNCTION_OFF);
gpio_set_pin_level(SSD1963_TFT_CS, 1);
gpio_set_pin_level(SSD1963_TFT_nRST, 1);
gpio_set_pin_level(SSD1963_TFT_RD, 1);
gpio_set_pin_level(SSD1963_TFT_WR, 1);
}
void p_gpio_parallel_write(PortGroup* group, uint32_t mask, uint16_t data)
{
gpio_set_pin_level(SSD1963_TFT_CS, 0);
p_gpio_set_port_data(group, mask, (uint32_t)data);
p_weird_delay();
gpio_set_pin_level(SSD1963_TFT_WR, 0);
p_weird_delay();
gpio_set_pin_level(SSD1963_TFT_WR, 1);
gpio_set_pin_level(SSD1963_TFT_CS, 1);
}
void p_gpio_parallel_write_arr(PortGroup* group, uint32_t mask, uint16_t* data, uint16_t len)
{
for(int ind = 0; ind < len; ind++)
{
p_gpio_parallel_write(group, mask, data[ind]);
}
}
void p_gpio_set_port_data(PortGroup* const port, const uint32_t mask, const uint32_t data)
{
uint32_t dword = (uint32_t)(SSD1963_TFT_DATA_FIX(data));
port->OUTSET.reg = (mask & dword);
port->OUTCLR.reg = (mask & ~dword);
}
void p_gpio_set_port_group_config(enum gpio_port port, const uint32_t mask, p_port_config* config)
{
for(uint8_t i = 0; i < 32; i++)
{
if(mask & (1UL << i))
{
uint32_t _gpio_pin = GPIO(port, i);
gpio_set_pin_direction(_gpio_pin, config->direction);
gpio_set_pin_pull_mode(_gpio_pin, config->pull_mode);
gpio_set_pin_function(_gpio_pin, config->function);
gpio_set_pin_level(_gpio_pin, 0);
}
}
}