KT26-0607_AC695n-BTE-SDK312/cpu/br23/sh50_ssi.c

107 lines
2.4 KiB
C
Raw Normal View History

2026-06-07 11:38:16 +00:00
#define SH50_BIT_OFFSET 14
#define SH50_SFR_BASE 0x2800L
#define SSI_CS_IO ISPKEY_DI_IO
#define SSI_CLK_IO ISPKEY_CLK_IO
#define SSI_DODI_IO ISPKEY_DO_IO
#define ssi_udelay isp_udelay
static void ssi_init()
{
gpio_set_die(SSI_CLK_IO, 1);
gpio_set_pull_up(SSI_CLK_IO, 0);
gpio_set_pull_down(SSI_CLK_IO, 0);
gpio_write(SSI_CLK_IO, 0);
gpio_set_direction(SSI_CLK_IO, 0);
gpio_set_die(SSI_DODI_IO, 1);
gpio_set_pull_up(SSI_DODI_IO, 0);
gpio_set_pull_down(SSI_DODI_IO, 0);
gpio_write(SSI_DODI_IO, 0);
gpio_set_direction(SSI_DODI_IO, 0);
gpio_set_die(SSI_CS_IO, 1);
gpio_set_pull_up(SSI_CS_IO, 1);
gpio_set_pull_down(SSI_CS_IO, 0);
gpio_write(SSI_CS_IO, 0);
gpio_set_direction(SSI_CS_IO, 0);
}
static void ssi_close()
{
gpio_set_die(SSI_CLK_IO, 0);
gpio_set_pull_up(SSI_CLK_IO, 0);
gpio_set_pull_down(SSI_CLK_IO, 0);
gpio_set_direction(SSI_CLK_IO, 1);
gpio_set_die(SSI_DODI_IO, 0);
gpio_set_pull_up(SSI_DODI_IO, 0);
gpio_set_pull_down(SSI_DODI_IO, 0);
gpio_set_direction(SSI_DODI_IO, 1);
gpio_set_die(SSI_CS_IO, 0);
gpio_set_pull_up(SSI_CS_IO, 1);
gpio_set_pull_down(SSI_CS_IO, 0);
gpio_set_direction(SSI_CS_IO, 1);
}
static u8 ssi_rx_byte(void)
{
u8 i, byte = 0;
gpio_set_direction(SSI_DODI_IO, 1);
for (i = 0; i < 8; i++) {
gpio_write(SSI_CLK_IO, 1);
ssi_udelay(10);
byte = byte << 1;
if (gpio_read(SSI_DODI_IO)) {
byte ++;
}
gpio_write(SSI_CLK_IO, 0);
ssi_udelay(10);
}
ssi_udelay(20);
return byte;
}
static void ssi_tx_byte(u8 byte)
{
gpio_set_direction(SSI_DODI_IO, 0);
for (u8 i = 0; i < 8; i++) {
if (byte & BIT(7)) {
gpio_write(SSI_DODI_IO, 1);
} else {
gpio_write(SSI_DODI_IO, 0);
}
byte = byte << 1;
gpio_write(SSI_CLK_IO, 1);
ssi_udelay(10);
gpio_write(SSI_CLK_IO, 0);
ssi_udelay(10);
}
gpio_write(SSI_DODI_IO, 0);
ssi_udelay(20);
}
static void ssi_cs(u8 cs)
{
if (cs) {
gpio_set_direction(SSI_CS_IO, 1);
} else {
gpio_set_direction(SSI_CS_IO, 0);
}
ssi_udelay(20);
}
const struct ssi_fd_t ssi_fd = {
.chip_sfr_base = SH50_SFR_BASE,
.chip_bit_offset = SH50_BIT_OFFSET,
.ssi_rx_byte = ssi_rx_byte,
.ssi_tx_byte = ssi_tx_byte,
.ssi_cs = ssi_cs,
.udelay = ssi_udelay,
};