diff options
Diffstat (limited to 'cctools/lib/ccdbg-io.c')
| -rw-r--r-- | cctools/lib/ccdbg-io.c | 137 | 
1 files changed, 137 insertions, 0 deletions
| diff --git a/cctools/lib/ccdbg-io.c b/cctools/lib/ccdbg-io.c new file mode 100644 index 00000000..9c6693cd --- /dev/null +++ b/cctools/lib/ccdbg-io.c @@ -0,0 +1,137 @@ +/* + * Copyright © 2008 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ccdbg.h" +#include <time.h> +#include "cc-usb.h" +#include "cc-bitbang.h" + +struct ccdbg * +ccdbg_open(void) +{ +	struct ccdbg *dbg; +	char *tty; + +	dbg = calloc(sizeof (struct ccdbg), 1); +	if (!dbg) { +		perror("calloc"); +		return NULL; +	} +	tty = getenv("CCDBG_TTY"); +	if (!tty || tty[0] == '/') +		dbg->usb = cc_usb_open(tty); +	if (!dbg->usb) { +		dbg->bb = cc_bitbang_open(); +		if (!dbg->bb) { +			free(dbg); +			return NULL; +		} +	} +	return dbg; +} + +void +ccdbg_close(struct ccdbg *dbg) +{ +	if (dbg->usb) +		cc_usb_close(dbg->usb); +	if (dbg->bb) +		cc_bitbang_close(dbg->bb); +	free (dbg); +} + +void +ccdbg_debug_mode(struct ccdbg *dbg) +{ +	if (dbg->usb) +		cc_usb_debug_mode(dbg->usb); +	else if (dbg->bb) +		cc_bitbang_debug_mode(dbg->bb); +} + +void +ccdbg_reset(struct ccdbg *dbg) +{ +	if (dbg->usb) +		cc_usb_reset(dbg->usb); +	else if (dbg->bb) +		cc_bitbang_reset(dbg->bb); +} + +void +ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes) +{ +	if (dbg->usb) +		cc_usb_send_bytes(dbg->usb, bytes, nbytes); +	else if (dbg->bb) +		cc_bitbang_send_bytes(dbg->bb, bytes, nbytes); +} + +void +ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes) +{ +	if (dbg->usb) +		cc_usb_recv_bytes(dbg->usb, bytes, nbytes); +	else if (dbg->bb) +		cc_bitbang_recv_bytes(dbg->bb, bytes, nbytes); +} + +void +ccdbg_sync(struct ccdbg *dbg) +{ +	if (dbg->usb) +		cc_usb_sync(dbg->usb); +	else if (dbg->bb) +		cc_bitbang_sync(dbg->bb); +} + +void +ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) +{ +	ccdbg_send_bytes(dbg, &cmd, 1); +	ccdbg_send_bytes(dbg, data, len); +} + +uint8_t +ccdbg_cmd_write_read8(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) +{ +	uint8_t	byte[1]; +	ccdbg_cmd_write(dbg, cmd, data, len); +	ccdbg_recv_bytes(dbg, byte, 1); +	ccdbg_sync(dbg); +	return byte[0]; +} + +uint16_t +ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) +{ +	uint8_t	byte[2]; +	ccdbg_cmd_write(dbg, cmd, data, len); +	ccdbg_recv_bytes(dbg, byte, 2); +	ccdbg_sync(dbg); +	return (byte[0] << 8) | byte[1]; +} + +void +ccdbg_cmd_write_queue8(struct ccdbg *dbg, uint8_t cmd, +		       uint8_t *data, int len, +		       uint8_t *reply) +{ +	ccdbg_cmd_write(dbg, cmd, data, len); +	ccdbg_recv_bytes(dbg, reply, 1); +} | 
