/* * Loads and program into SRAM, then tells the DCM to run it, and then waits * for it to finish. */ static int run_program(struct fsl_dcm_data *dcm, u8 addr, unsigned int len, ...) { u8 v, n; va_list args; if (addr + len > 0xff) { dev_err(dcm->dev, "address/length of %u/%u is out of bounds\n", addr, len); return 0; } /* load the program into SRAM */ va_start(args, len); for (n = addr; n < addr + len; n++) { v = va_arg(args, int); write_sram(dcm, n, v); } va_end(args); /* start the DCM */ out_8(dcm->omsg, addr); out_8(dcm->ocmd, PX_OCMD_MSG); /* wait for ack or error */ v = spin_event_timeout(in_8(dcm->mack) & (PX_OACK_ERR | PX_OACK_ACK), 50000, 1000); if ((!v) || (v & PX_OACK_ERR)) { dev_err(dcm->dev, "timeout or error waiting for start ack\n"); return 0; } /* 4. allow the host to read SRAM */ out_8(dcm->ocmd, 0); /* 5. wait for DCM to stop (ack == 0) or error (err == 1) */ spin_event_timeout( ((v = in_8(dcm->mack)) & (PX_OACK_ERR | PX_OACK_ACK)) != PX_OACK_ACK, 50000, 1000); /* 6. check for error or timeout */ if (v & (PX_OACK_ERR | PX_OACK_ACK)) { dev_err(dcm->dev, "timeout or error waiting for stop ack\n"); return 0; } return 1; }
int recieve_string (void) { unsigned char start, stop; unsigned char buff; unsigned int i = 0; unsigned short kol_vo_not; unsigned char good_or_bad; unsigned char num_page; start = read_max(2, 0x102); stop = read_max(2, 0x103); buff = SBUF; RI = 0; if (!if_ri()) return 0; buff = SBUF; RI = 0; if (!(buff & 0x80)) { good_or_bad = buff & 0x40; kol_vo_not = (buff & 0x3f) << 8; if (!if_ri()) return 0; buff = SBUF; RI = 0; kol_vo_not += buff; while (kol_vo_not) { if (!if_ri()) return 0; buff = SBUF; RI = 0; if ((buff != start) && (buff != stop)) { write_max(4, 0x102+i, buff); i++; kol_vo_not--; } } write_max(4, 0x102+i, 0); if (good_or_bad) { num_page = 5; is_good_melody = 1; } else { num_page = 6; is_bad_melody = 1; } init_timer(); str_to_notes (num_page); play_melody (num_page); init_uart(); } else { init_timer(); if (buff & 0x40) { write_sram(2, 0x00, "Оки-доки! "); read_sram_to_lsd(2); if (is_good_melody) play_melody (5); else delay(65535); } else { write_sram(2, 0x00, "Фигня какая-то... "); read_sram_to_lsd(2); if (is_bad_melody) play_melody (6); else delay(65535); } write_sram(2, 0x00, "Введите пароль: "); read_sram_to_lsd(2); goto_x(0x40); init_uart(); } return 0; }