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();
 | ||
| 
											8 years ago
										 | void dac_set(int channel, uint32_t value);
 | ||
| 
											8 years ago
										 | 
 | ||
|  | 
 | ||
|  | // ********************* 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
 | ||
|  | 
 |