示例#1
0
文件: sdmmc.c 项目: lewurm/mini
void sdmmc_ipc(volatile ipc_request *req)
{
	int ret;
	switch (req->req) {
	case IPC_SDMMC_ACK:
		ret = sdmmc_ack_card();
		ipc_post(req->code, req->tag, 1, ret);
		break;
	case IPC_SDMMC_READ:
		ret = sdmmc_read(req->args[0], req->args[1], (void *)req->args[2]);
		dc_flushrange((void *)req->args[2],
				req->args[1]*SDMMC_DEFAULT_BLOCKLEN);
		ipc_post(req->code, req->tag, 1, ret);
		break;
	case IPC_SDMMC_WRITE:
		dc_invalidaterange((void *)req->args[2],
				req->args[1]*SDMMC_DEFAULT_BLOCKLEN);
		ret = sdmmc_write(req->args[0],	req->args[1], (void *)req->args[2]);
		ipc_post(req->code, req->tag, 1, ret);
		break;
	case IPC_SDMMC_STATE:
		ipc_post(req->code, req->tag, 1,
				sdmmc_check_card());
		break;
	case IPC_SDMMC_SIZE:
		ipc_post(req->code, req->tag, 1,
				sdmmc_get_sectors());
		break;
	}
}
示例#2
0
void powerpc_ipc(volatile ipc_request *req)
{
	switch (req->req) {
	case IPC_PPC_BOOT:
		if (req->args[0]) {
			// Enqueued from ARM side, do not invalidate mem nor ipc_post
			powerpc_boot_mem((u8 *) req->args[1], req->args[2]);
		} else {
			dc_invalidaterange((void *) req->args[1], req->args[2]);
			int res = powerpc_boot_mem((u8 *) req->args[1], req->args[2]);
			if (res)
				ipc_post(req->code, req->tag, 1, res);
		}

		break;

	case IPC_PPC_BOOT_FILE:
		if (req->args[0]) {
			// Enqueued from ARM side, do not invalidate mem nor ipc_post
			powerpc_boot_file((char *) req->args[1]);
		} else {
			dc_invalidaterange((void *) req->args[1],
								strnlen((char *) req->args[1], 256));
			int res = powerpc_boot_file((char *) req->args[1]);
			if (res)
				ipc_post(req->code, req->tag, 1, res);
		}

		break;

	default:
		gecko_printf("IPC: unknown SLOW PPC request %04X\n", req->req);
	}
}