remsim_client: Move body of main() loop to separate function
I rally don't like the existing spaghetti-style code. Change-Id: I85c166e8aa95bb3f2e5d60d14f60caa94f3116fb
This commit is contained in:
parent
f918748208
commit
a86e6b73d8
|
@ -992,10 +992,120 @@ static void handle_options(struct client_config *cfg, int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void main_body(struct client_config *cfg)
|
||||||
|
{
|
||||||
|
struct st_transport *transp = ci->slot->transp;
|
||||||
|
struct usb_interface_match _ifm, *ifm = &_ifm;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
ifm->vendor = cfg->usb.vendor_id;
|
||||||
|
ifm->product = cfg->usb.product_id;
|
||||||
|
ifm->configuration = cfg->usb.config_id;
|
||||||
|
ifm->interface = cfg->usb.if_num;
|
||||||
|
ifm->altsetting = cfg->usb.altsetting;
|
||||||
|
ifm->addr = cfg->usb.addr;
|
||||||
|
if (cfg->usb.path)
|
||||||
|
osmo_strlcpy(ifm->path, cfg->usb.path, sizeof(ifm->path));
|
||||||
|
transp->usb_devh = osmo_libusb_open_claim_interface(NULL, NULL, ifm);
|
||||||
|
if (!transp->usb_devh) {
|
||||||
|
fprintf(stderr, "can't open USB device\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = libusb_claim_interface(transp->usb_devh, cfg->usb.if_num);
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "can't claim interface %d; rc=%d\n", cfg->usb.if_num, rc);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = osmo_libusb_get_ep_addrs(transp->usb_devh, cfg->usb.if_num, &transp->usb_ep.out,
|
||||||
|
&transp->usb_ep.in, &transp->usb_ep.irq_in);
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// switch modem SIM port to emulated SIM on OWHW
|
||||||
|
if (USB_VENDOR_OPENMOKO == ifm->vendor && USB_PRODUCT_OWHW_SAM3 == ifm->product) { // we are on the OWHW
|
||||||
|
int modem = -1;
|
||||||
|
switch (ifm->interface) { // the USB interface indicates for which modem we want to emulate the SIM
|
||||||
|
case 0:
|
||||||
|
modem = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
modem = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "unknown GPIO for SIMtrace interface %d\n", ifm->interface);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
char gpio_path[PATH_MAX];
|
||||||
|
snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/connect_st_usim%d/value", modem);
|
||||||
|
int connec_st_usim = open(gpio_path, O_WRONLY);
|
||||||
|
if (-1 == connec_st_usim) {
|
||||||
|
fprintf(stderr, "can't open GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
if (1 != write(connec_st_usim, "1", 1)) {
|
||||||
|
fprintf(stderr, "can't write GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
printf("switched modem %d to emulated USIM\n", modem);
|
||||||
|
|
||||||
|
snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/mdm%d_rst/value", modem);
|
||||||
|
int mdm_rst = open(gpio_path, O_WRONLY);
|
||||||
|
if (-1 == mdm_rst) {
|
||||||
|
fprintf(stderr, "can't open GPIO %s to reset modem %d\n", gpio_path, modem);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
if (1 != write(mdm_rst, "1", 1)) {
|
||||||
|
fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
sleep(1); // wait a bit to ensure reset is effective
|
||||||
|
if (1 != write(mdm_rst, "0", 1)) {
|
||||||
|
fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);
|
||||||
|
goto close_exit;
|
||||||
|
}
|
||||||
|
printf("modem %d reset\n", modem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* request firmware to generate STATUS on IRQ endpoint */
|
||||||
|
cardem_request_config(ci, CEMU_FEAT_F_STATUS_IRQ);
|
||||||
|
|
||||||
|
/* simulate card-insert to modem (owhw, not qmod) */
|
||||||
|
cardem_request_card_insert(ci, true);
|
||||||
|
|
||||||
|
/* select remote (forwarded) SIM */
|
||||||
|
st_modem_sim_select_remote(ci->slot);
|
||||||
|
|
||||||
|
/* set the ATR */
|
||||||
|
//atr_update_csum(real_atr, sizeof(real_atr));
|
||||||
|
cardem_request_set_atr(ci, cfg->atr.data, cfg->atr.len);
|
||||||
|
|
||||||
|
/* select remote (forwarded) SIM */
|
||||||
|
st_modem_reset_pulse(ci->slot, 300);
|
||||||
|
|
||||||
|
printf("Entering main loop\n");
|
||||||
|
|
||||||
|
allocate_and_submit_irq(ci);
|
||||||
|
allocate_and_submit_in(ci);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
osmo_select_main(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
libusb_release_interface(transp->usb_devh, 0);
|
||||||
|
|
||||||
|
close_exit:
|
||||||
|
if (transp->usb_devh)
|
||||||
|
libusb_close(transp-> usb_devh);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct rspro_server_conn *srvc, *bankdc;
|
struct rspro_server_conn *srvc, *bankdc;
|
||||||
struct st_transport *transp = ci->slot->transp;
|
|
||||||
struct client_config *cfg;
|
struct client_config *cfg;
|
||||||
int rc;
|
int rc;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
@ -1082,116 +1192,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
// connect to SIMtrace2 cardem
|
// connect to SIMtrace2 cardem
|
||||||
do {
|
do {
|
||||||
struct usb_interface_match _ifm, *ifm = &_ifm;
|
main_body(cfg);
|
||||||
ifm->vendor = cfg->usb.vendor_id;
|
sleep(1);
|
||||||
ifm->product = cfg->usb.product_id;
|
|
||||||
ifm->configuration = cfg->usb.config_id;
|
|
||||||
ifm->interface = cfg->usb.if_num;
|
|
||||||
ifm->altsetting = cfg->usb.altsetting;
|
|
||||||
ifm->addr = cfg->usb.addr;
|
|
||||||
if (cfg->usb.path)
|
|
||||||
osmo_strlcpy(ifm->path, cfg->usb.path, sizeof(ifm->path));
|
|
||||||
transp->usb_devh = osmo_libusb_open_claim_interface(NULL, NULL, ifm);
|
|
||||||
if (!transp->usb_devh) {
|
|
||||||
fprintf(stderr, "can't open USB device\n");
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = libusb_claim_interface(transp->usb_devh, cfg->usb.if_num);
|
|
||||||
if (rc < 0) {
|
|
||||||
fprintf(stderr, "can't claim interface %d; rc=%d\n", cfg->usb.if_num, rc);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = osmo_libusb_get_ep_addrs(transp->usb_devh, cfg->usb.if_num, &transp->usb_ep.out,
|
|
||||||
&transp->usb_ep.in, &transp->usb_ep.irq_in);
|
|
||||||
if (rc < 0) {
|
|
||||||
fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// switch modem SIM port to emulated SIM on OWHW
|
|
||||||
if (USB_VENDOR_OPENMOKO == ifm->vendor && USB_PRODUCT_OWHW_SAM3 == ifm->product) { // we are on the OWHW
|
|
||||||
int modem = -1;
|
|
||||||
switch (ifm->interface) { // the USB interface indicates for which modem we want to emulate the SIM
|
|
||||||
case 0:
|
|
||||||
modem = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
modem = 2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "unknown GPIO for SIMtrace interface %d\n", ifm->interface);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
char gpio_path[PATH_MAX];
|
|
||||||
snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/connect_st_usim%d/value", modem);
|
|
||||||
int connec_st_usim = open(gpio_path, O_WRONLY);
|
|
||||||
if (-1 == connec_st_usim) {
|
|
||||||
fprintf(stderr, "can't open GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
if (1 != write(connec_st_usim, "1", 1)) {
|
|
||||||
fprintf(stderr, "can't write GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
printf("switched modem %d to emulated USIM\n", modem);
|
|
||||||
|
|
||||||
snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/mdm%d_rst/value", modem);
|
|
||||||
int mdm_rst = open(gpio_path, O_WRONLY);
|
|
||||||
if (-1 == mdm_rst) {
|
|
||||||
fprintf(stderr, "can't open GPIO %s to reset modem %d\n", gpio_path, modem);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
if (1 != write(mdm_rst, "1", 1)) {
|
|
||||||
fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
sleep(1); // wait a bit to ensure reset is effective
|
|
||||||
if (1 != write(mdm_rst, "0", 1)) {
|
|
||||||
fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);
|
|
||||||
goto close_exit;
|
|
||||||
}
|
|
||||||
printf("modem %d reset\n", modem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* request firmware to generate STATUS on IRQ endpoint */
|
|
||||||
cardem_request_config(ci, CEMU_FEAT_F_STATUS_IRQ);
|
|
||||||
|
|
||||||
/* simulate card-insert to modem (owhw, not qmod) */
|
|
||||||
cardem_request_card_insert(ci, true);
|
|
||||||
|
|
||||||
/* select remote (forwarded) SIM */
|
|
||||||
st_modem_sim_select_remote(ci->slot);
|
|
||||||
|
|
||||||
/* set the ATR */
|
|
||||||
//atr_update_csum(real_atr, sizeof(real_atr));
|
|
||||||
cardem_request_set_atr(ci, cfg->atr.data, cfg->atr.len);
|
|
||||||
|
|
||||||
/* select remote (forwarded) SIM */
|
|
||||||
st_modem_reset_pulse(ci->slot, 300);
|
|
||||||
|
|
||||||
printf("Entering main loop\n");
|
|
||||||
|
|
||||||
allocate_and_submit_irq(ci);
|
|
||||||
allocate_and_submit_in(ci);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
osmo_select_main(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
libusb_release_interface(transp->usb_devh, 0);
|
|
||||||
close_exit:
|
|
||||||
if (transp->usb_devh)
|
|
||||||
libusb_close(transp->usb_devh);
|
|
||||||
if (cfg->keep_running)
|
|
||||||
sleep(1);
|
|
||||||
} while (cfg->keep_running);
|
} while (cfg->keep_running);
|
||||||
|
|
||||||
libusb_exit(NULL);
|
close_exit:
|
||||||
|
osmo_libusb_exit(NULL);
|
||||||
do_exit:
|
do_exit:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue