/** * Userspace process handling the get version event. */ void run_gprot_get_version_process(void) { if (gprot_get_version_triggered) { gprot_get_version_triggered = false; gpc_send_string(FIRMWARE_VERSION, sizeof(FIRMWARE_VERSION)); gpc_send_string(FIRMWARE_COPYRIGHT, sizeof(FIRMWARE_COPYRIGHT)); gpc_send_string(FIRMWARE_LICENSE, sizeof(FIRMWARE_LICENSE)); } }
END_TEST START_TEST(test_gprot_send_long_string) { int i; int string_size = (('z' - 'a') + 1) * ((('9' - '0') + 1) + 1); char string[string_size]; /* Generate string. */ { int gi, gj, gk = 0; for(gi=0; gi<(('z' - 'a') + 1); gi++) { string[gk++] = 'a'+gi; for(gj=0; gj<(('9' - '0') + 1); gj++){ string[gk++] = '0'+gj; } } string[gk] = '\0'; } fail_unless(string_size == gpc_send_string(string, string_size)); fail_unless(string_size == gpm_string_received_len); fail_unless(1 == gpm_string_received); for (i=0; i<string_size; i++) { fail_unless(string[i] == gpm_string_received_string[i]); } fail_unless(0 == gpm_string_received_string[i]); }
END_TEST START_TEST(test_gprotc_send_short_string) { int i; char *string = "Hello World!"; int string_size = strlen(string); fail_unless(string_size == gpc_send_string(string, string_size)); fail_unless((GP_MODE_STRING | string_size) == gpc_pickup_byte()); for (i=0; i<string_size; i++) { fail_unless(string[i] == gpc_pickup_byte()); } fail_unless(-1 == gpc_pickup_byte()); }
END_TEST START_TEST(test_gprotc_send_long_string) { int i,j; int string_size = (('z' - 'a') + 1) * ((('9' - '0') + 1) + 1); char string[string_size]; /* Generate string. */ { int gi, gj, gk = 0; for(gi=0; gi<(('z' - 'a') + 1); gi++) { string[gk++] = 'a'+gi; for(gj=0; gj<(('9' - '0') + 1); gj++){ string[gk++] = '0'+gj; } } string[gk] = '\0'; } /* Run test. */ fail_unless(string_size == gpc_send_string(string, string_size)); for (j=0; j<(string_size / GP_STR_PAK_MAX_LEN); j++) { fail_unless((GP_MODE_STRING | GP_STR_PAK_MAX_LEN) == gpc_pickup_byte()); for (i=0; i<GP_STR_PAK_MAX_LEN; i++) { fail_unless(string[i + (j * GP_STR_PAK_MAX_LEN)] == gpc_pickup_byte()); } } fail_unless((GP_MODE_STRING | (string_size % GP_STR_PAK_MAX_LEN)) == gpc_pickup_byte()); for (i=0; i<(string_size % GP_STR_PAK_MAX_LEN); i++) { fail_unless(string[i + (j * GP_STR_PAK_MAX_LEN)] == gpc_pickup_byte()); } fail_unless(-1 == gpc_pickup_byte()); }
END_TEST START_TEST(test_gprot_send_short_string) { int i; char *string = "Hello World!"; int string_size = strlen(string); fail_unless(string_size == gpc_send_string(string, string_size)); fail_unless(string_size == gpm_string_received_len); fail_unless(1 == gpm_string_received); for (i=0; i<string_size; i++) { fail_unless(string[i] == gpm_string_received_string[i]); } fail_unless(0 == gpm_string_received_string[i]); }
END_TEST START_TEST(test_gprot_send_arbitrary_string) { int i, j; int string_size = (('z' - 'a') + 1) * ((('9' - '0') + 1) + 1); char string[string_size]; /* Generate string. */ { int gi, gj, gk = 0; for(gi=0; gi<(('z' - 'a') + 1); gi++) { string[gk++] = 'a'+gi; for(gj=0; gj<(('9' - '0') + 1); gj++){ string[gk++] = '0'+gj; } } string[gk] = '\0'; } for (j=0; j<=string_size; j++) { fail_unless(j == gpc_send_string(string, j)); fail_unless(j == gpm_string_received_len); fail_unless(1 == gpm_string_received); for (i=0; i<j; i++) { fail_unless(string[i] == gpm_string_received_string[i]); } fail_unless(0 == gpm_string_received_string[i]); gpm_string_received_len = 0; gpm_string_received = 0; memset(gpm_string_received_string, 0, sizeof(gpm_string_received_string)); } }
int gpc_handle_byte(u8 byte) { DEBUG("got byte %04X ", byte); switch (gpc_state) { case GPCS_IDLE: if (byte & GP_MODE_STRING) { if (byte == GP_MODE_STRING) { gpc_send_string(GPC_VERSION, sizeof(GPC_VERSION) - 1); gpc_send_string(GPC_COPYRIGHT, sizeof(GPC_COPYRIGHT) - 1); gpc_send_string(GPC_LICENSE, sizeof(GPC_LICENSE) - 1); if (gpc_hooks.get_version) gpc_hooks.get_version(gpc_hooks.get_version_data); return 0; } DEBUG("not handled\n"); return 1; } if ((byte & GP_MODE_MASK) == (GP_MODE_WRITE)) { DEBUG("write "); gpc_addr = byte & GP_ADDR_MASK; gpc_state = GPCS_DATA_LSB; } else if ((byte & GP_MODE_MASK) == (GP_MODE_READ | GP_MODE_PEEK)) { DEBUG("read "); gpc_send_reg(byte & GP_ADDR_MASK); } else if ((byte & GP_MODE_MASK) == (GP_MODE_READ | GP_MODE_CONT)) { DEBUG("read cont "); gpc_monitor_map ^= 1 << (byte & GP_ADDR_MASK); } else { DEBUG("unimplemented\n"); return 1; } break; case GPCS_DATA_LSB: DEBUG("lsb "); gpc_data = byte; gpc_state = GPCS_DATA_MSB; break; case GPCS_DATA_MSB: DEBUG("msb "); gpc_data |= byte << 8; gpc_state = GPCS_IDLE; if (!gpc_register_map[gpc_addr]) { DEBUG("addr %02X with pointer %p not set up\n", gpc_addr, gpc_register_map[gpc_addr]); return 1; } *gpc_register_map[gpc_addr] = gpc_data; if (gpc_hooks.register_changed) gpc_hooks.register_changed(gpc_hooks. register_changed_data, gpc_addr); break; default: return 1; } DEBUG("\n"); return 0; }