示例#1
0
/*
 * 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;
}
示例#2
0
文件: package.c 项目: bee-master/sckd
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;
}