view arch/cons.c @ 96:a480d02a10c8

merge
author Jonathan Pevarnek <pevarnj@gmail.com>
date Sat, 14 May 2011 12:54:47 -0400
parents c75be274ce23
children
line wrap: on
line source

#include "channel.h"
#include "ebcdic.h"

#include <die.h>

#define CON_LEN 132

static u32 consch;

int putline(char *buf, int len)
{
	char data[CON_LEN];
	struct orb orb;
	struct ccw ccw;

	if ((len <= 0) || (len > CON_LEN))
		return -1;

	__builtin_memcpy(data, buf, len);
	ascii2ebcdic((u8*) data, len);

	ccw.cmd   = 0x01;
	ccw.flags = 0;
	ccw.count = len;
	ccw.addr  = (u32) (u64) data;

	__builtin_memset(&orb, 0, sizeof(struct orb));
	orb.lpm   = 0xff;
	orb.addr  = (u32) (u64) &ccw;
	orb.f     = 1;

	if (start_sch(consch, &orb))
		die();

	wait_for_io_int();

	return len;
}

int getline(char *buf, int len)
{
	struct orb orb;
	struct ccw ccw;
	int i;

	if ((len <= 0) || (len > CON_LEN))
		return -1;

	wait_for_io_int();

	__builtin_memset(buf, 0, len);
	ccw.cmd   = 0x0a;
	ccw.flags = 0x20;
	ccw.count = len;
	ccw.addr  = (u32) (u64) buf;

	__builtin_memset(&orb, 0, sizeof(struct orb));
	orb.lpm   = 0xff;
	orb.addr  = (u32) (u64) &ccw;
	orb.f     = 1;

	if (start_sch(consch, &orb))
		die();

	wait_for_io_int();

	for(i=0; i<len; i++)
		if (!buf[i])
			break;

	if (i)
		ebcdic2ascii((u8*) buf, i);

	return i;
}

void init_console()
{
	u32 sch;

	sch = find_dev(CON_DEV);

	if (!sch)
		die();

	consch = sch;
}