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.
		
		
		
		
		
			
		
			
				
					111 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					111 lines
				
				2.7 KiB
			|   
											11 years ago
										 | /*
 | ||
|  | Copyright 2014 Jun WAKO <wakojun@gmail.com> | ||
|  | */ | ||
|  | #ifndef IBM4704_H
 | ||
|  | #define IBM4704_H
 | ||
|  | 
 | ||
|  | #define IBM4704_ERR_NONE        0
 | ||
|  | #define IBM4704_ERR_PARITY      0x70
 | ||
|  | 
 | ||
|  | 
 | ||
|  | void ibm4704_init(void); | ||
|  | uint8_t ibm4704_send(uint8_t data); | ||
|  | uint8_t ibm4704_recv_response(void); | ||
|  | uint8_t ibm4704_recv(void); | ||
|  | 
 | ||
|  | 
 | ||
|  | /* Check pin configuration */ | ||
|  | #if !(defined(IBM4704_CLOCK_PORT) && \
 | ||
|  |       defined(IBM4704_CLOCK_PIN) && \ | ||
|  |       defined(IBM4704_CLOCK_DDR) && \ | ||
|  |       defined(IBM4704_CLOCK_BIT)) | ||
|  | #   error "ibm4704 clock pin configuration is required in config.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if !(defined(IBM4704_DATA_PORT) && \
 | ||
|  |       defined(IBM4704_DATA_PIN) && \ | ||
|  |       defined(IBM4704_DATA_DDR) && \ | ||
|  |       defined(IBM4704_DATA_BIT)) | ||
|  | #   error "ibm4704 data pin configuration is required in config.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*--------------------------------------------------------------------
 | ||
|  |  * static functions | ||
|  |  *------------------------------------------------------------------*/ | ||
|  | static inline void clock_lo(void) | ||
|  | { | ||
|  |     IBM4704_CLOCK_PORT &= ~(1<<IBM4704_CLOCK_BIT); | ||
|  |     IBM4704_CLOCK_DDR  |=  (1<<IBM4704_CLOCK_BIT); | ||
|  | } | ||
|  | static inline void clock_hi(void) | ||
|  | { | ||
|  |     /* input with pull up */ | ||
|  |     IBM4704_CLOCK_DDR  &= ~(1<<IBM4704_CLOCK_BIT); | ||
|  |     IBM4704_CLOCK_PORT |=  (1<<IBM4704_CLOCK_BIT); | ||
|  | } | ||
|  | static inline bool clock_in(void) | ||
|  | { | ||
|  |     IBM4704_CLOCK_DDR  &= ~(1<<IBM4704_CLOCK_BIT); | ||
|  |     IBM4704_CLOCK_PORT |=  (1<<IBM4704_CLOCK_BIT); | ||
|  |     _delay_us(1); | ||
|  |     return IBM4704_CLOCK_PIN&(1<<IBM4704_CLOCK_BIT); | ||
|  | } | ||
|  | static inline void data_lo(void) | ||
|  | { | ||
|  |     IBM4704_DATA_PORT &= ~(1<<IBM4704_DATA_BIT); | ||
|  |     IBM4704_DATA_DDR  |=  (1<<IBM4704_DATA_BIT); | ||
|  | } | ||
|  | static inline void data_hi(void) | ||
|  | { | ||
|  |     /* input with pull up */ | ||
|  |     IBM4704_DATA_DDR  &= ~(1<<IBM4704_DATA_BIT); | ||
|  |     IBM4704_DATA_PORT |=  (1<<IBM4704_DATA_BIT); | ||
|  | } | ||
|  | static inline bool data_in(void) | ||
|  | { | ||
|  |     IBM4704_DATA_DDR  &= ~(1<<IBM4704_DATA_BIT); | ||
|  |     IBM4704_DATA_PORT |=  (1<<IBM4704_DATA_BIT); | ||
|  |     _delay_us(1); | ||
|  |     return IBM4704_DATA_PIN&(1<<IBM4704_DATA_BIT); | ||
|  | } | ||
|  | 
 | ||
|  | static inline uint16_t wait_clock_lo(uint16_t us) | ||
|  | { | ||
|  |     while (clock_in()  && us) { asm(""); _delay_us(1); us--; } | ||
|  |     return us; | ||
|  | } | ||
|  | static inline uint16_t wait_clock_hi(uint16_t us) | ||
|  | { | ||
|  |     while (!clock_in() && us) { asm(""); _delay_us(1); us--; } | ||
|  |     return us; | ||
|  | } | ||
|  | static inline uint16_t wait_data_lo(uint16_t us) | ||
|  | { | ||
|  |     while (data_in() && us)  { asm(""); _delay_us(1); us--; } | ||
|  |     return us; | ||
|  | } | ||
|  | static inline uint16_t wait_data_hi(uint16_t us) | ||
|  | { | ||
|  |     while (!data_in() && us)  { asm(""); _delay_us(1); us--; } | ||
|  |     return us; | ||
|  | } | ||
|  | 
 | ||
|  | /* idle state that device can send */ | ||
|  | static inline void idle(void) | ||
|  | { | ||
|  |     clock_hi(); | ||
|  |     data_hi(); | ||
|  | } | ||
|  | 
 | ||
|  | /* inhibit device to send 
 | ||
|  |  * keyboard checks Data line on start bit(Data:hi) and it stops sending if Data line is low. | ||
|  |  */ | ||
|  | static inline void inhibit(void) | ||
|  | { | ||
|  |     clock_hi(); | ||
|  |     data_lo(); | ||
|  | } | ||
|  | 
 | ||
|  | #endif
 |