107 lines
2.4 KiB
C
107 lines
2.4 KiB
C
|
|
|
||
|
|
#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,
|
||
|
|
};
|
||
|
|
|