#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, };