84 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
#include "kernel/kernel.h"
 | 
						|
 | 
						|
#if CONFIG_OXPCIE
 | 
						|
 | 
						|
/* Documentation is at http://www.plxtech.com/products/uart/oxpcie952 */
 | 
						|
 | 
						|
#include "oxpcie.h"
 | 
						|
#include "serial.h"
 | 
						|
 | 
						|
static unsigned char *oxpcie_vaddr = NULL;
 | 
						|
 | 
						|
void oxpcie_set_vaddr(unsigned char *vaddr)
 | 
						|
{
 | 
						|
	oxpcie_vaddr = vaddr;
 | 
						|
}
 | 
						|
 | 
						|
static void oxpcie_init(void)
 | 
						|
{
 | 
						|
	printf("oxpcie_init\n");
 | 
						|
	/* Enable access to EFR and DLM+DLL */
 | 
						|
	OXPCIE_LCR = 0xBF;
 | 
						|
 | 
						|
	/* Set FICR[1] to increase FIFO */
 | 
						|
	OXPCIE_FICR = 0x01;
 | 
						|
 | 
						|
	/* Set enhanced mode [4]
 | 
						|
	 * no RTS/CTS [7:6]
 | 
						|
	 * no special char detection [5]
 | 
						|
	 * no in-band receive flow control [1:0]
 | 
						|
	 * no in-band transmit flow control [3:2]
 | 
						|
	 */
 | 
						|
	OXPCIE_EFR  = 0x10; 
 | 
						|
 | 
						|
	/* Set divisor register to 115200 baud. */
 | 
						|
	OXPCIE_DLM = 0x00;
 | 
						|
	OXPCIE_DLL = 0x22;
 | 
						|
 | 
						|
	/* Forget DLM and DLL, set LCR to config. */
 | 
						|
	OXPCIE_LCR = LCR_CONFIG;
 | 
						|
	OXPCIE_LCR = LCR_CONFIG;
 | 
						|
 | 
						|
	OXPCIE_TCR = 0x01;
 | 
						|
	OXPCIE_CPR = 0x20;
 | 
						|
	OXPCIE_CPR2 = 0;
 | 
						|
}
 | 
						|
 | 
						|
void oxpcie_putc(char c)
 | 
						|
{
 | 
						|
	static int inuse = 0;
 | 
						|
 | 
						|
	if(vm_running && oxpcie_vaddr && !inuse) {
 | 
						|
        	int i;
 | 
						|
		static int init_done;
 | 
						|
		inuse = 1;
 | 
						|
 | 
						|
		if(!init_done) {
 | 
						|
			oxpcie_init();
 | 
						|
			init_done = 1;
 | 
						|
		}
 | 
						|
 | 
						|
        	for (i= 0; i<100000; i++) {
 | 
						|
			if(OXPCIE_LSR & LSR_THRE)
 | 
						|
                       		break;
 | 
						|
		}
 | 
						|
		OXPCIE_THR = c;
 | 
						|
		inuse = 0;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
int oxpcie_in(void)
 | 
						|
{
 | 
						|
	if(vm_running && oxpcie_vaddr) {
 | 
						|
		int lsr;
 | 
						|
		lsr = OXPCIE_LSR;
 | 
						|
		if(lsr & LSR_DR)
 | 
						|
			return (int) OXPCIE_RBR;
 | 
						|
	}
 | 
						|
 | 
						|
	return -1;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |