From: Albert H. <he...@us...> - 2008-03-26 19:45:11
|
Update of /cvsroot/gc-linux/linux/arch/powerpc/boot In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv798/arch/powerpc/boot Added Files: ugecon.c ugecon.h Log Message: Added USB Gecko based bootwrapper console. --- NEW FILE: ugecon.h --- /* * arch/powerpc/boot/ugecon.h * * USB Gecko early bootwrapper console. * Copyright (C) 2008 The GameCube Linux Team * Copyright (C) 2008 Albert Herranz * * 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. * */ #ifndef __UGECON_H #define __UGECON_H extern int ug_grab_io_base(void); extern int ug_is_adapter_present(void); extern void ug_putc(char ch); #endif /* __UGECON_H */ --- NEW FILE: ugecon.c --- /* * arch/powerpc/boot/ugecon.c * * USB Gecko early bootwrapper console. * Copyright (C) 2008 The GameCube Linux Team * Copyright (C) 2008 Albert Herranz * * 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. * */ #include <stddef.h> #include "stdio.h" #include "types.h" #include "io.h" #include "ops.h" #define EXI_CLK_32MHZ 5 #define EXI_CSR 0x00 #define EXI_CSR_CLKMASK (0x7<<4) #define EXI_CSR_CLK_32MHZ (EXI_CLK_32MHZ<<4) #define EXI_CSR_CSMASK (0x7<<7) #define EXI_CSR_CS_0 (0x1<<7) /* Chip Select 001 */ #define EXI_CR 0x0c #define EXI_CR_TSTART (1<<0) #define EXI_CR_WRITE (1<<2) #define EXI_CR_READ_WRITE (2<<2) #define EXI_CR_TLEN(len) (((len)-1)<<4) #define EXI_DATA 0x10 /* virtual address base for input/output, retrieved from device tree */ static void *ug_io_base; static u32 ug_io_transaction(u32 in) { u32 *csr_reg = ug_io_base + EXI_CSR; u32 *data_reg = ug_io_base + EXI_DATA; u32 *cr_reg = ug_io_base + EXI_CR; u32 csr, data, cr; /* select */ csr = EXI_CSR_CLK_32MHZ | EXI_CSR_CS_0; out_be32(csr_reg, csr); /* read/write */ data = in; out_be32(data_reg, data); cr = EXI_CR_TLEN(2) | EXI_CR_READ_WRITE | EXI_CR_TSTART; out_be32(cr_reg, cr); while(in_be32(cr_reg) & EXI_CR_TSTART) barrier(); /* deselect */ out_be32(csr_reg, 0); data = in_be32(data_reg); return data; } static int ug_is_txfifo_ready(void) { return (ug_io_transaction(0xc0000000) & 0x04000000); } static void ug_raw_putc(char ch) { ug_io_transaction(0xb0000000 | (ch << 20)); } void ug_putc(char ch) { int count = 16; if (!ug_io_base) return; while(!ug_is_txfifo_ready() && count--) barrier(); if (count) ug_raw_putc(ch); } int ug_is_adapter_present(void) { if (!ug_io_base) return 0; return (ug_io_transaction(0x90000000) == 0x04700000); } int ug_grab_io_base(void) { u32 v; void *devp; devp = finddevice("/exi/usbgecko"); if (devp == NULL) goto err_out; if (getprop(devp, "virtual-reg", &v, sizeof(v)) != sizeof(v)) goto err_out; ug_io_base = (u8 *)v; return 0; err_out: return -1; } |