You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					142 lines
				
				3.1 KiB
			
		
		
			
		
	
	
					142 lines
				
				3.1 KiB
			| 
								 
											8 years ago
										 
									 | 
							
								#ifndef PANDA_DRIVERS_H
							 | 
						||
| 
								 | 
							
								#define PANDA_DRIVERS_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* LLGPIO *********************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define MODE_INPUT 0
							 | 
						||
| 
								 | 
							
								#define MODE_OUTPUT 1
							 | 
						||
| 
								 | 
							
								#define MODE_ALTERNATE 2
							 | 
						||
| 
								 | 
							
								#define MODE_ANALOG 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define PULL_NONE 0
							 | 
						||
| 
								 | 
							
								#define PULL_UP 1
							 | 
						||
| 
								 | 
							
								#define PULL_DOWN 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void set_gpio_mode(GPIO_TypeDef *GPIO, int pin, int mode);
							 | 
						||
| 
								 | 
							
								void set_gpio_output(GPIO_TypeDef *GPIO, int pin, int val);
							 | 
						||
| 
								 | 
							
								void set_gpio_alternate(GPIO_TypeDef *GPIO, int pin, int mode);
							 | 
						||
| 
								 | 
							
								void set_gpio_pullup(GPIO_TypeDef *GPIO, int pin, int mode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int get_gpio_input(GPIO_TypeDef *GPIO, int pin);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* USB *********************
							 | 
						||
| 
								 | 
							
								// IRQs: OTG_FS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef union {
							 | 
						||
| 
								 | 
							
								  uint16_t w;
							 | 
						||
| 
								 | 
							
								  struct BW {
							 | 
						||
| 
								 | 
							
								    uint8_t msb;
							 | 
						||
| 
								 | 
							
								    uint8_t lsb;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  bw;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								uint16_t_uint8_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef union _USB_Setup {
							 | 
						||
| 
								 | 
							
								  uint32_t d8[2];
							 | 
						||
| 
								 | 
							
								  struct _SetupPkt_Struc
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    uint8_t           bmRequestType;
							 | 
						||
| 
								 | 
							
								    uint8_t           bRequest;
							 | 
						||
| 
								 | 
							
								    uint16_t_uint8_t  wValue;
							 | 
						||
| 
								 | 
							
								    uint16_t_uint8_t  wIndex;
							 | 
						||
| 
								 | 
							
								    uint16_t_uint8_t  wLength;
							 | 
						||
| 
								 | 
							
								  } b;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								USB_Setup_TypeDef;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void usb_init();
							 | 
						||
| 
								 | 
							
								int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, int hardwired);
							 | 
						||
| 
								 | 
							
								int usb_cb_ep1_in(uint8_t *usbdata, int len, int hardwired);
							 | 
						||
| 
								 | 
							
								void usb_cb_ep2_out(uint8_t *usbdata, int len, int hardwired);
							 | 
						||
| 
								 | 
							
								void usb_cb_ep3_out(uint8_t *usbdata, int len, int hardwired);
							 | 
						||
| 
								 | 
							
								void usb_cb_enumeration_complete();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* UART *********************
							 | 
						||
| 
								 | 
							
								// IRQs: USART1, USART2, USART3, UART5
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											8 years ago
										 
									 | 
							
								#define FIFO_SIZE 0x400
							 | 
						||
| 
								 
											8 years ago
										 
									 | 
							
								typedef struct uart_ring {
							 | 
						||
| 
								 
											8 years ago
										 
									 | 
							
								  uint16_t w_ptr_tx;
							 | 
						||
| 
								 | 
							
								  uint16_t r_ptr_tx;
							 | 
						||
| 
								 
											8 years ago
										 
									 | 
							
								  uint8_t elems_tx[FIFO_SIZE];
							 | 
						||
| 
								 
											8 years ago
										 
									 | 
							
								  uint16_t w_ptr_rx;
							 | 
						||
| 
								 | 
							
								  uint16_t r_ptr_rx;
							 | 
						||
| 
								 
											8 years ago
										 
									 | 
							
								  uint8_t elems_rx[FIFO_SIZE];
							 | 
						||
| 
								 | 
							
								  USART_TypeDef *uart;
							 | 
						||
| 
								 | 
							
								  void (*callback)(struct uart_ring*);
							 | 
						||
| 
								 | 
							
								} uart_ring;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void uart_init(USART_TypeDef *u, int baud);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int getc(uart_ring *q, char *elem);
							 | 
						||
| 
								 | 
							
								int putc(uart_ring *q, char elem);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int puts(const char *a);
							 | 
						||
| 
								 | 
							
								void puth(unsigned int i);
							 | 
						||
| 
								 | 
							
								void hexdump(const void *a, int l);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* ADC *********************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void adc_init();
							 | 
						||
| 
								 | 
							
								uint32_t adc_get(int channel);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* DAC *********************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void dac_init();
							 | 
						||
| 
								 | 
							
								uint32_t dac_set(int channel, uint32_t value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* TIMER *********************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void timer_init(TIM_TypeDef *TIM, int psc);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* SPI *********************
							 | 
						||
| 
								 | 
							
								// IRQs: DMA2_Stream2, DMA2_Stream3, EXTI4
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void spi_init();
							 | 
						||
| 
								 | 
							
								int spi_cb_rx(uint8_t *data, int len, uint8_t *data_out);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ********************* CAN *********************
							 | 
						||
| 
								 | 
							
								// IRQs: CAN1_TX, CAN1_RX0, CAN1_SCE
							 | 
						||
| 
								 | 
							
								//       CAN2_TX, CAN2_RX0, CAN2_SCE
							 | 
						||
| 
								 | 
							
								//       CAN3_TX, CAN3_RX0, CAN3_SCE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								  uint32_t w_ptr;
							 | 
						||
| 
								 | 
							
								  uint32_t r_ptr;
							 | 
						||
| 
								 | 
							
								  uint32_t fifo_size;
							 | 
						||
| 
								 | 
							
								  CAN_FIFOMailBox_TypeDef *elems;
							 | 
						||
| 
								 | 
							
								} can_ring;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define CAN_BUS_RET_FLAG 0x80
							 | 
						||
| 
								 | 
							
								#define CAN_BUS_NUM_MASK 0x7F
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef PANDA
							 | 
						||
| 
								 | 
							
								  #define BUS_MAX 4
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								  #define BUS_MAX 2
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern int can_live, pending_can_live;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// must reinit after changing these
							 | 
						||
| 
								 | 
							
								extern int can_loopback, can_silent;
							 | 
						||
| 
								 | 
							
								extern uint32_t can_speed[];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void can_set_forwarding(int from, int to);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void can_init(uint8_t can_number);
							 | 
						||
| 
								 | 
							
								void can_init_all();
							 | 
						||
| 
								 | 
							
								void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number);
							 | 
						||
| 
								 | 
							
								int can_pop(can_ring *q, CAN_FIFOMailBox_TypeDef *elem);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 |