int gpio_clock_cycle(GPIO* gpio, int num_clks) { g_assert (gpio != NULL); int i=0; int r=GPIO_OK; for (i=0;i<num_clks;i++) { if (gpio_writec(gpio,'0') == -1) { r = GPIO_WRITE_ERROR; break; } if (gpio_writec(gpio,'1') == -1) { r = GPIO_WRITE_ERROR; break; } } return r; }
int fsi_bitbang(const char* pattern) { int rc=GPIO_OK; int i; for(i=0;i<strlen(pattern);i++) { rc = gpio_writec(&fsi_data,pattern[i]); if(rc!=GPIO_OK) { break; } rc = gpio_clock_cycle(&fsi_clk,1); if(rc!=GPIO_OK) { break; } } return rc; }
static gboolean on_boot (ControlHost *host, GDBusMethodInvocation *invocation, gpointer user_data) { // TODO: Add error checking g_print("Do Boot\n"); int rc = GPIO_OK; Control* control = object_get_control((Object*)user_data); control_host_complete_boot(host,invocation); do { rc |= gpio_open(&fsi_clk); rc |= gpio_open(&fsi_data); rc |= gpio_open(&fsi_enable); rc |= gpio_open(&cronus_sel); if (rc!=GPIO_OK) { break; } rc = gpio_write(&cronus_sel,1); //putcfam pu 281c 30000000 -p0 char a[] = "000011111111110101111000111001100111111111111111111111111111101111111111"; //putcfam pu 281c B0000000 -p0 char b[] = "000011111111110101111000111000100111111111111111111111111111101101111111"; gpio_write(&fsi_enable,1); gpio_write(&fsi_clk,1); gpio_write(&fsi_data,1); gpio_clock_cycle(&fsi_clk,5000); gpio_write(&fsi_data,0); gpio_clock_cycle(&fsi_clk,256); gpio_write(&fsi_data,1); gpio_clock_cycle(&fsi_clk,50); uint16_t i=0; for(i=0;i<strlen(a);i++) { gpio_writec(&fsi_data,a[i]); gpio_clock_cycle(&fsi_clk,1); } gpio_write(&fsi_data,1); /* Data standby state */ gpio_clock_cycle(&fsi_clk,5000); for(i=0;i<strlen(b);i++) { gpio_writec(&fsi_data,b[i]); gpio_clock_cycle(&fsi_clk,1); } gpio_write(&fsi_data,1); /* Data standby state */ gpio_clock_cycle(&fsi_clk,2); gpio_write(&fsi_clk,0); /* hold clk low for clock mux */ gpio_write(&fsi_enable,0); gpio_clock_cycle(&fsi_clk,16); gpio_write(&fsi_clk,0); /* Data standby state */ } while(0); if (rc != GPIO_OK) { printf("ERROR HostControl: GPIO sequence failed (rc=%d)\n",rc); } gpio_close(&fsi_clk); gpio_close(&fsi_data); gpio_close(&fsi_enable); gpio_close(&cronus_sel); control_emit_goto_system_state(control,"HOST_BOOTING"); control_host_emit_booted(host); return TRUE; }