forked from mirrors/qmk_userspace
		
	Add LED feature to Sun converter
This commit is contained in:
		
					parent
					
						
							
								454f7bc716
							
						
					
				
			
			
				commit
				
					
						edce1d19a6
					
				
			
		
					 5 changed files with 74 additions and 18 deletions
				
			
		| 
						 | 
					@ -555,6 +555,7 @@ void keyboard_init(void)
 | 
				
			||||||
void keyboard_task(void)
 | 
					void keyboard_task(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    static matrix_row_t matrix_prev[MATRIX_ROWS];
 | 
					    static matrix_row_t matrix_prev[MATRIX_ROWS];
 | 
				
			||||||
 | 
					    static uint8_t led_status = 0;
 | 
				
			||||||
    matrix_row_t matrix_row = 0;
 | 
					    matrix_row_t matrix_row = 0;
 | 
				
			||||||
    matrix_row_t matrix_change = 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;
 | 
					    return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,8 +43,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 *     asynchronous, negative logic, 1200baud, no flow control
 | 
					 *     asynchronous, negative logic, 1200baud, no flow control
 | 
				
			||||||
 *     1-start bit, 8-data bit, non parity, 1-stop bit
 | 
					 *     1-start bit, 8-data bit, non parity, 1-stop bit
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define SERIAL_NEGATIVE_LOGIC
 | 
					 | 
				
			||||||
#define SERIAL_BAUD 1200
 | 
					#define SERIAL_BAUD 1200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERIAL_RXD_DDR  DDRD
 | 
					#define SERIAL_RXD_DDR  DDRD
 | 
				
			||||||
#define SERIAL_RXD_PORT PORTD
 | 
					#define SERIAL_RXD_PORT PORTD
 | 
				
			||||||
#define SERIAL_RXD_PIN  PIND
 | 
					#define SERIAL_RXD_PIN  PIND
 | 
				
			||||||
| 
						 | 
					@ -63,5 +63,20 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
    /* clear interrupt  flag */     \
 | 
					    /* clear interrupt  flag */     \
 | 
				
			||||||
    EIFR = (1<<INTF2);              \
 | 
					    EIFR = (1<<INTF2);              \
 | 
				
			||||||
} while (0)
 | 
					} 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
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,10 +16,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "stdint.h"
 | 
					#include "stdint.h"
 | 
				
			||||||
 | 
					#include "serial.h"
 | 
				
			||||||
#include "led.h"
 | 
					#include "led.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void led_set(uint8_t usb_led)
 | 
					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 */
 | 
					/* host role */
 | 
				
			||||||
void serial_init(void);
 | 
					void serial_init(void);
 | 
				
			||||||
uint8_t serial_recv(void);
 | 
					uint8_t serial_recv(void);
 | 
				
			||||||
 | 
					void serial_send(uint8_t data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,9 +51,10 @@ POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
void serial_init(void)
 | 
					void serial_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SERIAL_RXD_INIT();
 | 
					    SERIAL_RXD_INIT();
 | 
				
			||||||
 | 
					    SERIAL_TXD_INIT();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RX ring buffer
 | 
					/* RX ring buffer */
 | 
				
			||||||
#define RBUF_SIZE   8
 | 
					#define RBUF_SIZE   8
 | 
				
			||||||
static uint8_t rbuf[RBUF_SIZE];
 | 
					static uint8_t rbuf[RBUF_SIZE];
 | 
				
			||||||
static uint8_t rbuf_head = 0;
 | 
					static uint8_t rbuf_head = 0;
 | 
				
			||||||
| 
						 | 
					@ -71,39 +72,63 @@ uint8_t serial_recv(void)
 | 
				
			||||||
    return data;
 | 
					    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)
 | 
					ISR(SERIAL_RXD_VECT)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SERIAL_RXD_INT_ENTER()
 | 
					    SERIAL_RXD_INT_ENTER()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint8_t data = 0;
 | 
					    uint8_t data = 0;
 | 
				
			||||||
#ifdef SERIAL_BIT_ORDER_MSB
 | 
					#ifdef SERIAL_BIT_ORDER_MSB
 | 
				
			||||||
    uint8_t pos = 0x80;
 | 
					    uint8_t mask = 0x80;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    uint8_t pos = 0x01;
 | 
					    uint8_t mask = 0x01;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    // to center of start bit
 | 
					    /* to center of start bit */
 | 
				
			||||||
    _delay_us(WAIT_US/2);
 | 
					    _delay_us(WAIT_US/2);
 | 
				
			||||||
    do {
 | 
					    do {
 | 
				
			||||||
        // to center of next bit
 | 
					        /* to center of next bit */
 | 
				
			||||||
        _delay_us(WAIT_US);
 | 
					        _delay_us(WAIT_US);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) {
 | 
					        if (SERIAL_RXD_READ()) {
 | 
				
			||||||
            data |= pos;
 | 
					            data |= mask;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
#ifdef SERIAL_BIT_ORDER_MSB
 | 
					#ifdef SERIAL_BIT_ORDER_MSB
 | 
				
			||||||
        pos >>= 1;
 | 
					        mask >>= 1;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        pos <<= 1;
 | 
					        mask <<= 1;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    } while (pos);
 | 
					    } while (mask);
 | 
				
			||||||
    // to center of stop bit
 | 
					    /* to center of stop bit */
 | 
				
			||||||
    _delay_us(WAIT_US);
 | 
					    _delay_us(WAIT_US);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef SERIAL_NEGATIVE_LOGIC
 | 
					 | 
				
			||||||
    data = ~data;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
 | 
					    uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
 | 
				
			||||||
    if (next != rbuf_tail) {
 | 
					    if (next != rbuf_tail) {
 | 
				
			||||||
        rbuf[rbuf_head] = data;
 | 
					        rbuf[rbuf_head] = data;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue