diff options
| m--------- | laks | 0 | ||||
| -rw-r--r-- | main.cpp | 220 | 
2 files changed, 16 insertions, 204 deletions
diff --git a/laks b/laks -Subproject e586c178073b9a0fee90d5fc8e795d266ebd7b7 +Subproject c09be56d30e5a99ab0451a53d0fc0df0aa0dee8 @@ -31,6 +31,16 @@ static Pin& i2c_sda = PB11;  static Pin& cs_pressure = PB4;  static Pin& cs_gyro = PB5; +USB_otg usb(OTG_HS); + +bool i2c_read(uint16_t wValue, uint16_t wIndex, uint16_t wLength) { +	uint8_t buf[wLength]; +	I2C2.read_reg(wValue, wIndex, wLength, buf); +	 +	usb.write(0, (uint32_t*)buf, wLength); +	return true; +} +  bool jtag_tick(bool tdi, bool tms) {  	bool tdo = jtag_tdo.get();  	jtag_tdi.set(tdi); @@ -46,70 +56,6 @@ bool jtag_tick(bool tdi, bool tms) {  	return tdo;  } -void usb_write(uint32_t ep, uint32_t* bufp, uint32_t len) { -	OTG_HS.dev_iep_reg[ep].DIEPTSIZ = (1 << 19) | len; -	//                               PKTCNT -	OTG_HS.dev_iep_reg[ep].DIEPCTL |= (1 << 31) | (1 << 26); -	//                               EPENA       CNAK -	 -	len = (len + 3) >> 2; -	 -	while(len--) { -		OTG_HS.fifo[ep].reg = *bufp++; -	} -} - -bool usb_ep_ready(uint32_t ep) { -	return (OTG_HS.dev_iep_reg[1].DIEPCTL & 0x80008000) == 0x8000; -} - -uint8_t dev_desc[] = { -	0x12, 0x01, 0x00, 0x02, 0xff, 0x00, 0x00, 0x40, 0x34, 0x12, 0x78, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -}; - -uint8_t conf_desc[] = { -	0x09, 0x02, 0x19, 0x00, 0x01, 0x01, 0x00, 0xc0, 0x00, -	0x09, 0x04, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, -	0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, -}; - -bool get_descriptor(uint16_t wValue, uint16_t wIndex, uint16_t wLength) { -	switch(wValue) { -		case 0x100: -			usb_write(0, (uint32_t*)dev_desc, wLength > sizeof(dev_desc) ? sizeof(dev_desc) : wLength); -			return true; -		case 0x200: -			usb_write(0, (uint32_t*)conf_desc, wLength > sizeof(conf_desc) ? sizeof(conf_desc) : wLength); -			return true; -		default: -			return false; -	} -} - -bool set_address(uint16_t wValue, uint16_t wIndex, uint16_t wLength) { -	OTG_HS.dev_reg.DCFG |= wValue << 4; -	usb_write(0, 0, 0); -	return true; -} - -bool set_configuration(uint16_t wValue, uint16_t wIndex, uint16_t wLength) { -	switch(wValue) { -		case 0: -			OTG_HS.dev_iep_reg[1].DIEPCTL = 0; -			break; -		 -		case 1: -			OTG_HS.dev_iep_reg[1].DIEPCTL = (2 << 18) | (1 << 15) | 64; -			break; -		 -		default: -			return false; -	} -	 -	usb_write(0, 0, 0); -	return true; -} -  bool jtag_shift(uint16_t wValue, uint16_t wIndex, uint16_t wLength) {  	if(wLength > 16) {  		return false; @@ -123,117 +69,13 @@ bool jtag_shift(uint16_t wValue, uint16_t wIndex, uint16_t wLength) {  		wIndex >>= 1;  	} -	usb_write(0, &tdo, (wLength + 7) >> 3); +	usb.write(0, &tdo, (wLength + 7) >> 3);  	return true;  } -bool i2c_read(uint16_t wValue, uint16_t wIndex, uint16_t wLength) { -	uint8_t buf[wLength]; -	I2C2.read_reg(wValue, wIndex, wLength, buf); -	 -	usb_write(0, (uint32_t*)buf, wLength); -	return true; -} - -void handle_setup(const uint32_t* bufp) { -	led_error.toggle(); -	 -	uint8_t bmRequestType = bufp[0] & 0xff; -	uint8_t bRequest = (bufp[0] >> 8) & 0xff; -	uint16_t wValue = (bufp[0] >> 16) & 0xffff; -	uint16_t wIndex = bufp[1] & 0xffff; -	uint16_t wLength = (bufp[1] >> 16) & 0xffff; -	 -	// GET_DESCRIPTOR -	if(bmRequestType == 0x80 && bRequest == 0x06) { -		if(get_descriptor(wValue, wIndex, wLength)) { -			return; -		} -	} -	 -	// SET_ADDRESS -	if(bmRequestType == 0x00 && bRequest == 0x05) { -		if(set_address(wValue, wIndex, wLength)) { -			return; -		} -	} -	 -	// SET_CONFIGURATION -	if(bmRequestType == 0x00 && bRequest == 0x09) { -		if(set_configuration(wValue, wIndex, wLength)) { -			return; -		} -	} -	 -	// I2C_READ -	if(bmRequestType == 0xc0 && bRequest == 0xf0) { -		if(i2c_read(wValue, wIndex, wLength)) { -			return; -		} -	} -	 -	// JTAG_SHIFT -	if(bmRequestType == 0xc0 && bRequest == 0xff) { -		if(jtag_shift(wValue, wIndex, wLength)) { -			return; -		} -	} -	 -	OTG_HS.dev_iep_reg[0].DIEPCTL |= (1 << 21); -} - -static uint32_t buf[16]; - -void handle_rxfifo() { -	led_status.toggle(); -	 -	uint32_t status = OTG_HS.reg.GRXSTSP; -	 -	uint32_t len = (status & 0x7ff0) >> 6; -	 -	for(uint32_t i = 0; i < len; i++) { -		buf[i] = OTG_HS.fifo[0].reg; -	} -	 -	//if(status == 0x000c0080) { -	if((status & (0xf << 17)) == (0x4 << 17)) { -		handle_setup(buf); -		OTG_HS.dev_oep_reg[0].DOEPCTL |= (1 << 26); -	} -} - -void usb_process() { -	// USB reset. -	if(OTG_HS.reg.GINTSTS & (1 << 12)) { -		//led_yellow.toggle(); -		OTG_HS.dev_oep_reg[0].DOEPCTL = (1 << 27); -		OTG_HS.dev_reg.DAINTMSK = (1 << 16) | 1; -		OTG_HS.dev_reg.DOEPMSK = (1 << 3) | 1; -		OTG_HS.dev_reg.DIEPEMPMSK = (1 << 3) | 1; -		OTG_HS.reg.GRXFSIZ = 256; -		OTG_HS.reg.DIEPTXF0 = (64 << 16) | 256; -		OTG_HS.reg.DIEPTXF1 = (64 << 16) | 320; -		OTG_HS.dev_oep_reg[0].DOEPTSIZ = (3 << 29); -	} -	 -	// OTG interrupt. -	if(OTG_HS.reg.GINTSTS & (1 << 2)) { -		led_status.toggle(); -		 -		OTG_HS.reg.GOTGINT = (1 << 2); // SEDET -	} -	 -	// RxFIFO non-empty. -	if(OTG_HS.reg.GINTSTS & (1 << 4)) { -		handle_rxfifo(); -	} -	 -	OTG_HS.reg.GINTSTS = 0xffffffff; -} -  template<>  void interrupt<(Interrupt::IRQ)77>() { -	usb_process(); +	usb.process();  }  void usb_main() { @@ -248,36 +90,10 @@ void usb_main() {  	RCC.enable(RCC.OTGHS);  	//Interrupt::enable((Interrupt::IRQ)77); -	// Set PHYSEL. -	OTG_HS.reg.GUSBCFG |= (1 << 6); -	 -	Time::sleep(10); -	 -	while(!(OTG_HS.reg.GRSTCTL & (1 << 31))); -	OTG_HS.reg.GRSTCTL |= 1; -	while(OTG_HS.reg.GRSTCTL & 1); -	 -	OTG_HS.reg.GAHBCFG = 0; -	 -	// USB configuration -	OTG_HS.reg.GUSBCFG = (1 << 30) | (0xf << 10) | (0 << 9) | (0 << 8) | (1 << 6); -	//                   FDMOD       TRDT          HNPCAP     SRPCAP     PHYSEL -	 -	// interrupt mask -	OTG_HS.reg.GINTMSK = (1 << 13) | (1 << 12) | (1 << 11) | (1 << 10) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 4); -	//                   ENUMDNEM    USBRST      USBSUSPM    ESUSPM      SOFM       OTGINT     MMISM -	 -	// device configuration -	OTG_HS.dev_reg.DCFG = (1 << 2) | 3; -	//                    NZLSOHSK   DSPD -	 -	// core configuration -	OTG_HS.reg.GCCFG = (1 << 19) | (1 << 16); -	//                 VBUSBSEN    PWRDWN -	 +	usb.init();  	while(1) { -		usb_process(); +		usb.process();  		Thread::yield();  	}  } @@ -363,12 +179,8 @@ int main() {  			magn.z,  		}; -		if(usb_ep_ready(1)) { -			usb_write(1, (uint32_t*)buf, sizeof(buf)); -		} -		 -		if(usb_ep_ready(1)) { -			usb_write(1, (uint32_t*)ppmsum.channels, sizeof(ppmsum.channels)); +		if(usb.ep_ready(1)) { +			usb.write(1, (uint32_t*)buf, sizeof(buf));  		}  	}  }  | 
