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
 | 
