forked from mfulz_github/qmk_firmware
		
	Add LED feature to Sun converter
This commit is contained in:
		
							parent
							
								
									454f7bc716
								
							
						
					
					
						commit
						edce1d19a6
					
				| @ -555,6 +555,7 @@ void keyboard_init(void) | ||||
| void keyboard_task(void) | ||||
| { | ||||
|     static matrix_row_t matrix_prev[MATRIX_ROWS]; | ||||
|     static uint8_t led_status = 0; | ||||
|     matrix_row_t matrix_row = 0; | ||||
|     matrix_row_t matrix_change = 0; | ||||
| 
 | ||||
| @ -617,6 +618,12 @@ void keyboard_task(void) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // update LED
 | ||||
|     if (led_status != host_keyboard_leds()) { | ||||
|         led_status = host_keyboard_leds(); | ||||
|         keyboard_set_leds(led_status); | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -43,8 +43,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  *     asynchronous, negative logic, 1200baud, no flow control | ||||
|  *     1-start bit, 8-data bit, non parity, 1-stop bit | ||||
|  */ | ||||
| #define SERIAL_NEGATIVE_LOGIC | ||||
| #define SERIAL_BAUD 1200 | ||||
| 
 | ||||
| #define SERIAL_RXD_DDR  DDRD | ||||
| #define SERIAL_RXD_PORT PORTD | ||||
| #define SERIAL_RXD_PIN  PIND | ||||
| @ -63,5 +63,20 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|     /* clear interrupt  flag */     \ | ||||
|     EIFR = (1<<INTF2);              \ | ||||
| } while (0) | ||||
| #define SERIAL_RXD_READ()    (~SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) | ||||
| 
 | ||||
| #define SERIAL_TXD_DDR  DDRD | ||||
| #define SERIAL_TXD_PORT PORTD | ||||
| #define SERIAL_TXD_PIN  PIND | ||||
| #define SERIAL_TXD_BIT  3 | ||||
| /* negative logic */ | ||||
| #define SERIAL_TXD_ON()     do { SERIAL_TXD_PORT &= ~(1<<SERIAL_TXD_BIT); } while (0) | ||||
| #define SERIAL_TXD_OFF()    do { SERIAL_TXD_PORT |=  (1<<SERIAL_TXD_BIT); } while (0) | ||||
| #define SERIAL_TXD_INIT()   do { \ | ||||
|     /* pin configuration: output */         \ | ||||
|     SERIAL_TXD_DDR |= (1<<SERIAL_TXD_BIT);  \ | ||||
|     /* idle */                              \ | ||||
|     SERIAL_TXD_ON();                        \ | ||||
| } while (0) | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -16,10 +16,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| */ | ||||
| 
 | ||||
| #include "stdint.h" | ||||
| #include "serial.h" | ||||
| #include "led.h" | ||||
| 
 | ||||
| 
 | ||||
| void led_set(uint8_t usb_led) | ||||
| { | ||||
|     // not supported now
 | ||||
|     uint8_t sun_led = 0; | ||||
|     if (usb_led & (1<<USB_LED_NUM_LOCK))    sun_led |= (1<<0); | ||||
|     if (usb_led & (1<<USB_LED_COMPOSE))     sun_led |= (1<<1); | ||||
|     if (usb_led & (1<<USB_LED_SCROLL_LOCK)) sun_led |= (1<<2); | ||||
|     if (usb_led & (1<<USB_LED_CAPS_LOCK))   sun_led |= (1<<3); | ||||
| 
 | ||||
|     serial_send(0x0E); | ||||
|     serial_send(sun_led); | ||||
| } | ||||
|  | ||||
| @ -41,5 +41,6 @@ POSSIBILITY OF SUCH DAMAGE. | ||||
| /* host role */ | ||||
| void serial_init(void); | ||||
| uint8_t serial_recv(void); | ||||
| void serial_send(uint8_t data); | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -51,9 +51,10 @@ POSSIBILITY OF SUCH DAMAGE. | ||||
| void serial_init(void) | ||||
| { | ||||
|     SERIAL_RXD_INIT(); | ||||
|     SERIAL_TXD_INIT(); | ||||
| } | ||||
| 
 | ||||
| // RX ring buffer
 | ||||
| /* RX ring buffer */ | ||||
| #define RBUF_SIZE   8 | ||||
| static uint8_t rbuf[RBUF_SIZE]; | ||||
| static uint8_t rbuf_head = 0; | ||||
| @ -71,39 +72,63 @@ uint8_t serial_recv(void) | ||||
|     return data; | ||||
| } | ||||
| 
 | ||||
| //ISR(INT2_vect)
 | ||||
| void serial_send(uint8_t data) | ||||
| { | ||||
|     /* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */ | ||||
|     /* start bit */ | ||||
|     SERIAL_TXD_OFF(); | ||||
|     _delay_us(WAIT_US); | ||||
| 
 | ||||
| #ifdef SERIAL_BIT_ORDER_MSB | ||||
|     uint8_t mask = 0x80; | ||||
| #else | ||||
|     uint8_t mask = 0x01; | ||||
| #endif | ||||
|     while (mask) { | ||||
|         if (data&mask) { SERIAL_TXD_ON(); } else { SERIAL_TXD_OFF(); } | ||||
|         _delay_us(WAIT_US); | ||||
| 
 | ||||
| #ifdef SERIAL_BIT_ORDER_MSB | ||||
|         mask >>= 1; | ||||
| #else | ||||
|         mask <<= 1; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     /* stop bit */ | ||||
|     SERIAL_TXD_ON(); | ||||
|     _delay_us(WAIT_US); | ||||
| } | ||||
| 
 | ||||
| /* detect edge of start bit */ | ||||
| ISR(SERIAL_RXD_VECT) | ||||
| { | ||||
|     SERIAL_RXD_INT_ENTER() | ||||
| 
 | ||||
|     uint8_t data = 0; | ||||
| #ifdef SERIAL_BIT_ORDER_MSB | ||||
|     uint8_t pos = 0x80; | ||||
|     uint8_t mask = 0x80; | ||||
| #else | ||||
|     uint8_t pos = 0x01; | ||||
|     uint8_t mask = 0x01; | ||||
| #endif | ||||
|     // to center of start bit
 | ||||
|     /* to center of start bit */ | ||||
|     _delay_us(WAIT_US/2); | ||||
|     do { | ||||
|         // to center of next bit
 | ||||
|         /* to center of next bit */ | ||||
|         _delay_us(WAIT_US); | ||||
| 
 | ||||
|         if (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) { | ||||
|             data |= pos; | ||||
|         if (SERIAL_RXD_READ()) { | ||||
|             data |= mask; | ||||
|         } | ||||
| #ifdef SERIAL_BIT_ORDER_MSB | ||||
|         pos >>= 1; | ||||
|         mask >>= 1; | ||||
| #else | ||||
|         pos <<= 1; | ||||
|         mask <<= 1; | ||||
| #endif | ||||
|     } while (pos); | ||||
|     // to center of stop bit
 | ||||
|     } while (mask); | ||||
|     /* to center of stop bit */ | ||||
|     _delay_us(WAIT_US); | ||||
| 
 | ||||
| #ifdef SERIAL_NEGATIVE_LOGIC | ||||
|     data = ~data; | ||||
| #endif | ||||
| 
 | ||||
|     uint8_t next = (rbuf_head + 1) % RBUF_SIZE; | ||||
|     if (next != rbuf_tail) { | ||||
|         rbuf[rbuf_head] = data; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 tmk
						tmk