blob: 41e1cb6c9a6ac0bce1eb58d821a814112eb68749 [file] [log] [blame]
#include "n5_regs.h"
#include "n5_drv.h"
/* GPIO */
void gpio_set_dir(unsigned int d) {
*GPIO_DIR = d;
}
void gpio_write(unsigned int d) {
*GPIO_DOUT = d;
}
unsigned int gpio_read() {
return *GPIO_DIN;
}
void gpio_pull (unsigned char d){
*GPIO_PD = 0;
*GPIO_PU = 0;
if(d==0) *GPIO_PD = 1;
else *GPIO_PU = 1;
}
void gpio_im(unsigned int im){
*GPIO_IM = im;
}
/* UART */
int uart_init(unsigned int n, unsigned int prescaler){
if(n>1) return -1;
if(n==1){
*UART1_PRESCALER = prescaler;
*UART1_IM = 0;
*UART1_CTRL = 1;
}
else {
*UART0_PRESCALER = prescaler;
*UART0_IM = 0;
*UART0_CTRL = 1;
}
}
int uart_puts(unsigned int n, unsigned char *msg, unsigned int len){
int i;
if(n>1) return -1;
if(n==0){
for(i=0; i<len; i++){
while(*UART0_STATUS&1); // TX Not Full
*UART0_DATA = msg[i];
}
} else {
for(i=0; i<len; i++){
while(*UART1_STATUS&1); // TX Not Full
*UART1_DATA = msg[i];
}
}
return 0;
}
int uart_gets(unsigned int n, unsigned char *msg, unsigned int len){
int i;
if(n>1) return -1;
if(n==0){
for(i=0; i<len; i++){
while(*UART0_STATUS&8); // RX Not Empty
msg[i] = *UART0_DATA;
}
} else {
for(i=0; i<len; i++){
while(*UART1_STATUS&8); // RX Not Empty
msg[i] = *UART1_DATA;
}
}
return 0;
}
/* SPI */
int spi_init(unsigned int n, unsigned char cpol, unsigned char cpha, unsigned char clkdiv){
unsigned int cfg_value = 0;
cfg_value |= cpol;
cfg_value |= (cpha << 1);
cfg_value |= ((unsigned int)clkdiv << 2);
if(n>1) return -1;
if(n==0) *SPI0_CFG = cfg_value;
else *SPI1_CFG = cfg_value;
}
unsigned int spi_status(unsigned int n){
if(n>1) return -1;
if(n==0)
return *SPI0_STATUS & 1;
else
return *SPI1_STATUS & 1;
}
unsigned char spi_read(unsigned int n){
if(n>1) return -1;
if(n==0)
return *SPI0_DATA;
else
return *SPI1_DATA;
}
int spi_write(unsigned int n, unsigned char data){
if(n>1) return -1;
if(n==0) {
*SPI0_DATA = data;
SET_BIT(*SPI0_CTRL, SPI_GO_BIT);
CLR_BIT(*SPI0_CTRL, SPI_GO_BIT);
while(!spi_status(n));
} else{
*SPI1_DATA = data;
SET_BIT(*SPI1_CTRL, SPI_GO_BIT);
CLR_BIT(*SPI1_CTRL, SPI_GO_BIT);
while(!spi_status(n));
}
return 0;
}
int spi_start(unsigned int n){
if(n>1) return -1;
if(n==0) {
SET_BIT(*SPI0_CTRL, SPI_SS_BIT);
} else {
SET_BIT(*SPI1_CTRL, SPI_SS_BIT);
}
return 0;
}
int spi_end(unsigned int n){
if(n>1) return -1;
if(n==0)
CLR_BIT(*SPI0_CTRL, SPI_SS_BIT);
else
CLR_BIT(*SPI1_CTRL, SPI_SS_BIT);
return 0;
}
/* i2c */
int i2c_init(unsigned int n, unsigned int pre){
if(n>1) return -1;
if(n==0) {
*(I2C0_PRE_LO) = pre & 0xff;
*(I2C0_PRE_HI) = pre & 0xff00;
*(I2C0_CTRL) = I2C_CTRL_EN | I2C_CTRL_IEN;
} else {
*(I2C1_PRE_LO) = pre & 0xff;
*(I2C1_PRE_HI) = pre & 0xff00;
*(I2C1_CTRL) = I2C_CTRL_EN | I2C_CTRL_IEN;
}
}
int i2c_start(unsigned int n, unsigned char control)
{
if(n>1) return -1;
if(n==0) {
*(I2C0_TX) = control;
*(I2C0_CMD) = I2C_CMD_STA | I2C_CMD_WR;
while( ((*I2C0_STAT) & I2C_STAT_TIP) != 0 );
if( ((*I2C0_STAT) & I2C_STAT_RXACK)) {
*(I2C0_CMD) = I2C_CMD_STO;
return 0;
}
return 1;
} else {
*(I2C1_TX) = control;
*(I2C1_CMD) = I2C_CMD_STA | I2C_CMD_WR;
while( ((*I2C1_STAT) & I2C_STAT_TIP) != 0 );
if( ((*I2C1_STAT) & I2C_STAT_RXACK)) {
*(I2C1_CMD) = I2C_CMD_STO;
return 0;
}
return 1;
}
}
int i2c_sendByte(unsigned char b){
*(I2C0_TX) = b;
*(I2C0_CMD) = I2C_CMD_WR;
while( (*I2C0_STAT) & I2C_STAT_TIP );
if( ((*I2C0_STAT) & I2C_STAT_RXACK )){
*(I2C0_CMD) = I2C_CMD_STO;
return 0;
}
return 1;
}
int i2c_sendHWord(unsigned int hw){
if(i2c_sendByte(hw>>8) == 0)
return 0;
return i2c_sendByte(hw&0xFF);
}
int i2c_readByte(){
*(I2C0_CMD) = I2C_CMD_RD;
while( ((*I2C0_STAT) & I2C_STAT_TIP) != 0 );
return *(I2C0_RX);
}
int i2c_stop(){
*(I2C0_CMD) = I2C_CMD_STO;
}
int i2c_send(unsigned int n, unsigned char saddr, unsigned char sdata){
if(n>1) return -1;
if(n==0) {
*(I2C0_TX) = saddr;
*(I2C0_CMD) = I2C_CMD_STA | I2C_CMD_WR;
while( ((*I2C0_STAT) & I2C_STAT_TIP) != 0 );
//(*I2C_STAT) & I2C_STAT_TIP ;
if( ((*I2C0_STAT) & I2C_STAT_RXACK)) {
*(I2C0_CMD) = I2C_CMD_STO;
return 0;
}
*(I2C0_TX) = sdata;
*(I2C0_CMD) = I2C_CMD_WR;
while( (*I2C0_STAT) & I2C_STAT_TIP );
*(I2C0_CMD) = I2C_CMD_STO;
if( ((*I2C0_STAT) & I2C_STAT_RXACK ))
return 0;
else
return 1;
} else {
*(I2C1_TX) = saddr;
*(I2C1_CMD) = I2C_CMD_STA | I2C_CMD_WR;
while( ((*I2C1_STAT) & I2C_STAT_TIP) != 0 );
//(*I2C_STAT) & I2C_STAT_TIP ;
if( ((*I2C1_STAT) & I2C_STAT_RXACK)) {
*(I2C1_CMD) = I2C_CMD_STO;
return 0;
}
*(I2C1_TX) = sdata;
*(I2C1_CMD) = I2C_CMD_WR;
while( (*I2C1_STAT) & I2C_STAT_TIP );
*(I2C1_CMD) = I2C_CMD_STO;
if( ((*I2C1_STAT) & I2C_STAT_RXACK ))
return 0;
else
return 1;
}
}
/* PWM */
int pwm_init(unsigned int n, unsigned int cmp1, unsigned int cmp2, unsigned int pre){
if(n>1) return -1;
if(n==0) {
*PWM0_CMP1 = cmp1;
*PWM0_CMP2 = cmp2;
*PWM0_PRE = pre;
} else {
*PWM1_CMP1 = cmp1;
*PWM1_CMP2 = cmp2;
*PWM1_PRE = pre;
}
return 0;
}
int pwm_enable(unsigned int n){
if(n>1) return -1;
if(n==0)
*PWM0_CTRL = 0x1;
else
*PWM0_CTRL = 0x1;
return 0;
}
int pwm_disable(unsigned int n){
if(n>1) return -1;
if(n==0)
*PWM0_CTRL = 0x0;
else
*PWM0_CTRL = 0x0;
return 0;
}
/* Timers */
int tmr_init(unsigned int n, unsigned int pre, unsigned int cmp){
if(n>1) return -1;
if(n==0) {
*TMR0_CMP = cmp;
*TMR0_PRE = pre;
*TMR0_OVCLR = 1;
*TMR0_OVCLR = 0;
} else {
*TMR1_CMP = cmp;
*TMR1_PRE = pre;
*TMR1_OVCLR = 1;
*TMR1_OVCLR = 0;
}
return 0;
}
int tmr_enable(unsigned int n){
if(n>1) return -1;
if(n==0)
*TMR0_EN = 0x1;
else
*TMR1_EN = 0x1;
return 0;
}
int tmr_disable(unsigned int n){
if(n>1) return -1;
if(n==0)
*TMR0_EN = 0x0;
else
*TMR1_EN = 0x0;
return 0;
}
int tmr_wait(unsigned int n){
if(n>1) return -1;
if(n==0)
while(*TMR0_STATUS == 0);
else
while(*TMR1_STATUS == 0);
return 0;
}
int tmr_ei(unsigned int n){
if(n>1) return -1;
if(n==0)
*TMR0_IM == 1;
else
*TMR1_IM == 1;
return 0;
}
int tmr_di(unsigned int n){
if(n>1) return -1;
if(n==0)
*TMR0_IM == 0;
else
*TMR1_IM == 0;
return 0;
}
int tmr_clrov(unsigned int n){
if(n>1) return -1;
if(n==0) {
*TMR0_OVCLR == 1;
*TMR0_OVCLR == 0;
}
else{
*TMR1_OVCLR == 1;
*TMR1_OVCLR == 0;
}
return 0;
}
int tmr_read(unsigned int n){
if(n>1) return -1;
if(n==0)
return *TMR0;
else
return *TMR1;
return 0;
}
/* Watch dog Timers */
int wdt_init(unsigned int n){
if(n>1) return -1;
if(n==0) {
*WDT0_OVCLR = 1;
*WDT0_OVCLR = 0;
} else {
*WDT1_OVCLR = 1;
*WDT1_OVCLR = 0;
}
return 0;
}
int wdt_enable(unsigned int n){
if(n>1) return -1;
if(n==0)
*WDT0_EN = 0x1;
else
*WDT1_EN = 0x1;
return 0;
}
int wdt_load(unsigned int n, unsigned int val) {
if(n>1) return -1;
if(n==0) {
*WDT0_LOAD = val;
} else {
*WDT1_LOAD = val;
}
return 0;
}
int wdt_read(unsigned int n){
if(n>1) return -1;
if(n==0) {
return *WDT0_TMR;
} else {
return *WDT1_TMR;
}
return 0;
}
int wdt_disable(unsigned int n){
if(n>1) return -1;
if(n==0)
*WDT0_EN = 0x0;
else
*WDT1_EN = 0x0;
return 0;
}