static int kurobox_pro_miconsend(const unsigned char *data, int count) { int i; unsigned char checksum = 0; unsigned char recv_buf[40]; unsigned char send_buf[40]; unsigned char correct_ack[3]; int retry = 2; for (i = 0; i < count; i++) checksum -= data[i]; do { kurobox_pro_miconwrite(data, count); kurobox_pro_miconwrite(&checksum, 1); if (kurobox_pro_miconread(recv_buf, sizeof(recv_buf)) <= 3) { printk(KERN_ERR ">%s: receive failed.\n", __func__); memset(&send_buf, 0xff, sizeof(send_buf)); kurobox_pro_miconwrite(send_buf, sizeof(send_buf)); mdelay(100); kurobox_pro_miconread(recv_buf, sizeof(recv_buf)); } else { correct_ack[0] = 0x01; correct_ack[1] = data[1]; correct_ack[2] = 0x00; if ((recv_buf[0] + recv_buf[1] + recv_buf[2] + recv_buf[3]) & 0xFF) { printk(KERN_ERR ">%s: Checksum Error : " "Received data[%02x, %02x, %02x, %02x]" "\n", __func__, recv_buf[0], recv_buf[1], recv_buf[2], recv_buf[3]); } else { if (correct_ack[0] == recv_buf[0] && correct_ack[1] == recv_buf[1] && correct_ack[2] == recv_buf[2]) { mdelay(10); return 0; } } printk(KERN_ERR ">%s: Error : NAK or Illegal Data " "Received\n", __func__); } } while (retry--); mdelay(10); return -1; }
static int kurobox_pro_miconsend(const unsigned char *data, int count) { int i; unsigned char checksum = 0; unsigned char recv_buf[40]; unsigned char send_buf[40]; unsigned char correct_ack[3]; int retry = 2; /* Generate checksum */ for (i = 0; i < count; i++) checksum -= data[i]; do { /* Send data */ kurobox_pro_miconwrite(data, count); /* send checksum */ kurobox_pro_miconwrite(&checksum, 1); if (kurobox_pro_miconread(recv_buf, sizeof(recv_buf)) <= 3) { printk(KERN_ERR ">%s: receive failed.\n", __func__); /* send preamble to clear the receive buffer */ memset(&send_buf, 0xff, sizeof(send_buf)); kurobox_pro_miconwrite(send_buf, sizeof(send_buf)); /* make dummy reads */ mdelay(100); kurobox_pro_miconread(recv_buf, sizeof(recv_buf)); } else { /* Generate expected ack */ correct_ack[0] = 0x01; correct_ack[1] = data[1]; correct_ack[2] = 0x00; /* checksum Check */ if ((recv_buf[0] + recv_buf[1] + recv_buf[2] + recv_buf[3]) & 0xFF) { printk(KERN_ERR ">%s: Checksum Error : " "Received data[%02x, %02x, %02x, %02x]" "\n", __func__, recv_buf[0], recv_buf[1], recv_buf[2], recv_buf[3]); } else { /* Check Received Data */ if (correct_ack[0] == recv_buf[0] && correct_ack[1] == recv_buf[1] && correct_ack[2] == recv_buf[2]) { /* Interval for next command */ mdelay(10); /* Receive ACK */ return 0; } } /* Received NAK or illegal Data */ printk(KERN_ERR ">%s: Error : NAK or Illegal Data " "Received\n", __func__); } } while (retry--); /* Interval for next command */ mdelay(10); return -1; }