📄 ivac.h
字号:
/* device present flags */#define H_VAC_DEVICE_LOC P_VA_TYPE (VAC_ADR +0x1700 )#define IOSEL5_PRESENT VA_TYPE 0x0020#define IOSEL4_PRESENT VA_TYPE 0x0010#define IOSEL3_PRESENT VA_TYPE 0x0008#define IOSEL2_PRESENT VA_TYPE 0x0004#define IOSEL1_PRESENT VA_TYPE 0x0002#define IOSEL0_PRESENT VA_TYPE 0x0001/* this reg used to init pio data out values */#define H_VAC_PIO_DATA P_VA_TYPE (VAC_ADR +0x1800 )/* read only - contains login levels of pio pins */#define H_VAC_PIO_PIN P_VA_TYPE (VAC_ADR +0x1900 )/* set up the direction of pio */#define H_VAC_PIO_DIR P_VA_TYPE (VAC_ADR + 0x1a00)/* assign functions to the pio */#define H_VAC_PIO_FUNC P_VA_TYPE (VAC_ADR + 0x1b00)/* pio bit mask defines */#define PIO0 VA_TYPE 0x0001#define PIO1 VA_TYPE 0x0002#define PIO2 VA_TYPE 0x0004#define PIO3 VA_TYPE 0x0008#define PIO4 VA_TYPE 0x0010#define PIO5 VA_TYPE 0x0020#define PIO6 VA_TYPE 0x0040#define PIO7 VA_TYPE 0x0080#define PIO8 VA_TYPE 0x0100#define PIO9 VA_TYPE 0x0200#define PIO10 VA_TYPE 0x0400#define PIO11 VA_TYPE 0x0800#define PIO12 VA_TYPE 0x1000#define PIO13 VA_TYPE 0x2000#define PIO9_DEBOUNCE_ENABLE VA_TYPE 0x4000#define CPU_SPACE_EMULATE VA_TYPE 0x8000#define TXDA_TO_PIO0 VA_TYPE 0x0001#define RXTA_TO_PIO1 VA_TYPE 0x0002#define TXDB_TO_PIO2 VA_TYPE 0x0004#define TXDB_TO_PIO3 VA_TYPE 0x0008#define IORD_TO_PIO4 VA_TYPE 0x0010#define IOWR_TO_PIO5 VA_TYPE 0x0020#define IOSEL3_TO_PIO6 VA_TYPE 0x0040#define PIO7IRQ_TO_PIO7 VA_TYPE 0x0080#define IOSEL4_TO_PIO8 VA_TYPE 0x0100#define IOSEL5_TO_PIO9 VA_TYPE 0x0200#define PIO10IRQ_TO_PIO10 VA_TYPE 0x0400#define PIO11IRQ_TO_PIO10 VA_TYPE 0x0800#define SHRCS_TO_PIO12 VA_TYPE 0x1000#define IOSEL2_TO_PIO13 VA_TYPE 0x2000#define PIO9_DEBOUNCE_DISABLE VA_TYPE 0x4000#define CPU_SPACE_EMULATE_VIA_IOSEL5 VA_TYPE 0x8000/* SIO STUFF *//*Get table for BAUD_PRESCALE_INIT VALS:NOTEThe SIO baud rate divisor is dependent on CPU_CLOCKand is derived from the following formula / CPU clock rate \ divisor = truncate | ---------------------------- + 0.5 | \ 16 * (MAX baud rate desired) /where divisor > 8.This value is loaded into the top byte of the VAC CPUclock divisor.The baud rate selection table will allow selection of8 different baud rates. Each lower than the MAX baud rateby a power of 2. If 9600 baud is the MAX baud rate, thenthe following powers are available:baud select value baud rate 7 76800 don't use 6 19200 5 9600 4 4800 3 2400 2 1200 1 600 0 300*//* max rate cpu clk divisor *//* check these values for roundup */#define BAUD_9600_CLK_20MHz 0x2000#define BAUD_9600_CLK_25MHz 0x2800#define BAUD_9600_CLK_32MHz 0x3400#define BAUD_9600_CLK_33MHz 0x3500#define BAUD_19200_CLK_20MHz 0x0fff /*subtract one from above formula*/#define BAUD_19200_CLK_25MHz 0x1400#define BAUD_19200_CLK_32MHz 0x1a00#define BAUD_19200_CLK_33MHz 0x1a00#define BAUD_19200_CLK_40MHz 0x2000/*Baud Rate Prescaler used on CPU Clk. */#define H_VAC_BAUD_PRESCALE P_VA_TYPE (VAC_ADR + 0x1c00)/* control register */#define H_VAC_SIOA_MODE P_VA_TYPE (VAC_ADR + 0x1d00)/* control bits for both sioa and siob */#define SIO_CTL_ENABLE VA_TYPE 0xfcff#define SIO_CTL_DISABLE VA_TYPE 0x0300/* the following are masks */#define PARITY_ENABLE VA_TYPE 0x8000#define EVEN_PARITY VA_TYPE 0x4000#define EIGHT_BITS VA_TYPE 0x2000#define BAUD_RATE_MASK VA_TYPE 0x1c00#define RESET_RECV VA_TYPE 0x0200#define RESET_XMIT VA_TYPE 0x0100#define XMITER VA_TYPE 0x0080#define RECVER VA_TYPE 0x0040#define SEND_BREAK VA_TYPE 0x0020#define TXDA_TO_RXDA VA_TYPE 0x0010/* NOTE: vac sio data bytes are taken from high 8 bits !! *//* xmit data */#define H_VAC_SIOA_XMIT P_VA_TYPE (VAC_ADR + 0x1e00)/* control register */#define H_VAC_SIOB_MODE P_VA_TYPE (VAC_ADR + 0x1f00)/* rec data */#define H_VAC_SIOA_RECV P_VA_TYPE (VAC_ADR + 0x2000)#define H_VAC_SIOB_RECV P_VA_TYPE (VAC_ADR + 0x2100)/* xmit data */#define H_VAC_SIOB_XMIT P_VA_TYPE (VAC_ADR + 0x2200)/* sio interrupt mask regs */#define H_VAC_SIOA_IRQ_MASK P_VA_TYPE (VAC_ADR + 0x2300)#define H_VAC_SIOB_IRQ_MASK P_VA_TYPE (VAC_ADR + 0x2400)#define SINGLE_CHAR_RECV_MASK VA_TYPE 0x8000#define FIFO_FULL_MASK VA_TYPE 0x4000#define BREAK_CHANGE_MASK VA_TYPE 0x2000#define ERROR_MASK VA_TYPE 0x1000#define XMIT_READY_MASK VA_TYPE 0x0800#define XMIT_EMPTY_MASK VA_TYPE 0x0400#define SIO_MASK_ENABLE VA_TYPE 0xffff#define SIO_MASK_DISABLE VA_TYPE 0x0000/* sio status regs */#define H_VAC_SIOA_STAT P_VA_TYPE (VAC_ADR + 0x2500)#define H_VAC_SIOB_STAT P_VA_TYPE (VAC_ADR + 0x2600)#define CHAR_READY VA_TYPE 0x8000#define FIFO_FULL VA_TYPE 0x4000#define BREAK_CHANGE VA_TYPE 0x2000#define PARITY_ERROR VA_TYPE 0x1000#define FRAMING_ERROR VA_TYPE 0x0800#define OVERRUN_ERROR VA_TYPE 0x0400#define XMIT_READY VA_TYPE 0x0200#define XMIT_EMPTY VA_TYPE 0x0100/* VAC TIMER STUFF */#define H_VAC_TMR_DATA P_VA_TYPE (VAC_ADR + 0x2700)#define H_VAC_TMR_CTL P_VA_TYPE (VAC_ADR + 0x2800)#define PRESCALER_IN_MASK VA_TYPE 0x3f00#define PRESCALER_IN_SHIFT 8/* use this to read the instantaneous count value of prescaler */#define PRESCALER_OUT_MASK VA_TYPE 0x003f#define VAC_20MHZ_CPU_1MHZ_PRESCALER (19 << PRESCALER_IN_SHIFT)#define VAC_25MHZ_CPU_1MHZ_PRESCALER (24 << PRESCALER_IN_SHIFT)#define VAC_33MHZ_CPU_1MHZ_PRESCALER (32 << PRESCALER_IN_SHIFT)#define VAC_40MHZ_CPU_1MHZ_PRESCALER (39 << PRESCALER_IN_SHIFT)/* Load command disables timer and then loads the interal timer registers *//* with the values in the prescaler control bits and the timer data register */#define RUN_LOAD_MASK VA_TYPE 0x4000#define RUN_CMD VA_TYPE 0x4000#define STOP_N_LOAD_CMD VA_TYPE 0x0000/* You can set the timer to only produce a single irq after the time *//* has elapsed or reset the counter for continuous irqs */#define SINGLE_CONT_MASK VA_TYPE 0x8000#define SINGLE_IRQ_CMD VA_TYPE 0x8000#define CONT_IRQ_CMD VA_TYPE 0x0000/************************************************************************** The vac timer rate is calculated as follows:*** / CPU_CLOCK \* | ------------------- |* \ prescaler value + 1 /*timer rate = ------------------------------* (65536 - time data reg. value)*** where prescaler is set to an arbitrary value.***this gives us a time data register value of*** / CPU_CLOCK \* | ------------------- |* \ prescaler value + 1 /*timer data val = 65536 - ----------------------------* reqested timer rate*****PROGRAMING EXAMPLE:***to get a 100Hz time rate with a 25MHz cpu clock** - arbitrarily set prescaler value to 24 which will produce a* 1MHz time period for each count in the time data register*** / 25000000 \* | --------- |* \ 24 + 1 /* time data val = 65536 - ------------- = 55536 = 0xd8f0* 100*** - set prescaler* *H_VAC_TMR_CTL = (*H_VAC_TMR_CTL & ~PRSCALER_IN_MASK) |* VAC_25MHZ_CPU_1MHZ_PRESCALER ;* - set timer data register* *H_VAC_TMR_DATA = 0x8df0 ;** - disable timer and load above values into internal registers* *H_VAC_TMR_CTL = (*H_VAC_TMR_CTL & ~RUN_LOAD_MASK) | STOP_N_LOAD_CMD ;** - set control for continuous operation* *H_VAC_TMR_CTL = (*H_VAC_TMR_CTL & ~SINGLE_CONT_MASK) | CONT_CMD ;** - start timer* *H_VAC_TMR_CTL = (*H_VAC_TMR_CTL & ~RUN_LOAD_MASK) | RUN_CMD ;****************************************************************************//* Vac ID Reg. Read to Startup */#define H_VAC_ID_GO P_VA_TYPE (VAC_ADR + 0x2900)/* now for some generic io Macros *//* These macros are designed so that they can be dropped into a generic *//* serial handler, They are intended to be the basic building blocks used *//* to port any serial handler to use the VAC. */#ifndef _ASMLANGUAGE#define SIOA 0#define SIOB 1/*the following macros expect SIOA or SIOB for u arg-there's no error checking*/#define XMITER_EMPTY(u) ( XMIT_EMPTY & vaRegGet( H_VAC_SIOA_STAT + \ ((u)* ( H_VAC_SIOB_STAT - H_VAC_SIOA_STAT ) ) ) )#define XMITER_READY(u) ( XMIT_READY & vaRegGet( H_VAC_SIOA_STAT + \ ((u)* ( H_VAC_SIOB_STAT - H_VAC_SIOA_STAT ) ) ) )#define RECVER_READY(u) ( CHAR_READY & vaRegGet( H_VAC_SIOA_STAT + \ ((u)* ( H_VAC_SIOB_STAT - H_VAC_SIOA_STAT ) ) ) )#define XMIT_CHAR(u,ch) vaRegSet( H_VAC_SIOA_XMIT + \ ((u)* ( H_VAC_SIOB_XMIT - H_VAC_SIOA_XMIT ) ) , \ (unsigned short)( ((unsigned short)(ch))<<8 ) )#define RECV_CHAR(u,pc) *(pc) = (unsigned char)(0x00ff & \ vaRegGet( H_VAC_SIOA_RECV + \ ((u)* ( H_VAC_SIOB_RECV - H_VAC_SIOA_RECV ) ) ) )#define POLLING/* The following P_GETC and P_PUTC macros are designed for POLLING only!!! *//* NOTE: The delay loops may need to be altered depending on the board rev. */#ifdef POLLING/* P_PUTC(u,ch) - output char "ch" to "u" where "u" is SIOA or SIOB *//* add delay, NOTE: no fifo stuff allowed */#define P_PUTC(u,ch) \ while ( ! XMITER_READY( (u) ) ) ; \ XMIT_CHAR( (u),(ch) ); \ while ( XMITER_READY( (u) ) )/* P_GETC(u,pc) - input char into char pointer "pc" from *//* "u" where "u" is SIOA or SIOB */#define P_GETC(u,pc) \ { \ int x; \ while ( ! RECVER_READY( (u) ) ) \ for(x=0;x<100;x++) ; \ RECV_CHAR( (u), (pc) ) ; \ }#endif /* POLLING */#endif /* _ASMLANGUAGE */#ifdef __cplusplus}#endif#endif /* __INCivach */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -