configs/z8f64200100kit/ostest at same level as ez80 configurations; nuttx/arch/arm/src/lpc17xx/lpc17_i2c.cuninitialization fix

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5392 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-11-27 15:09:12 +00:00
parent d839ba4338
commit 97c584ad91
5 changed files with 489 additions and 312 deletions

View File

@ -3692,3 +3692,8 @@
* confgs/ez80f910200zco/ostest: Now used Kconfig/mconfig configuration
tool. Updated to build in native Windows environment. Other ez80f910200zco
build scripts also updated.
* configs/z8f64200100kit/ostest: Update to same level as ez80 configurations.
* nuttx/configs/z8f64200100kit/scripts/setenv.bat: Add support for native
Windows build.
* nuttx/arch/arm/src/lpc17xx/lpc17_i2c.c: Resources not being released when
I2C is uninitialized.

View File

@ -67,7 +67,6 @@
#include "up_internal.h"
#include "os_internal.h"
#include "lpc17_internal.h"
#include "lpc17_syscon.h"
#include "lpc17_pinconn.h"
@ -79,12 +78,15 @@
#define GPIO_I2C1_SCL GPIO_I2C1_SCL_1
#define GPIO_I2C1_SDA GPIO_I2C1_SDA_1
#endif
#ifndef CONFIG_I2C0_FREQ
#define CONFIG_I2C0_FREQ 100000
#endif
#ifndef CONFIG_I2C1_FREQ
#define CONFIG_I2C1_FREQ 100000
#endif
#ifndef CONFIG_I2C2_FREQ
#define CONFIG_I2C2_FREQ 100000
#endif
@ -93,44 +95,46 @@
* Definitions
*******************************************************************************/
/****************************************************************************
/*******************************************************************************
* Pre-processor Definitions
****************************************************************************/
*******************************************************************************/
#define I2C_TIMEOUT ((20 * CLK_TCK) / 1000) /* 20 mS */
/****************************************************************************
/*******************************************************************************
* Private Data
****************************************************************************/
*******************************************************************************/
struct lpc17_i2cdev_s
{
struct i2c_dev_s dev; /* Generic I2C device */
struct i2c_msg_s msg; /* a single message for legacy read/write */
unsigned int base; /* Base address of registers */
uint16_t irqid; /* IRQ for this device */
struct i2c_dev_s dev; /* Generic I2C device */
struct i2c_msg_s msg; /* a single message for legacy read/write */
unsigned int base; /* Base address of registers */
uint16_t irqid; /* IRQ for this device */
sem_t mutex; /* Only one thread can access at a time */
sem_t wait; /* Place to wait for state machine completion */
volatile uint8_t state; /* State of state machine */
WDOG_ID timeout; /* watchdog to timeout when bus hung */
sem_t mutex; /* Only one thread can access at a time */
sem_t wait; /* Place to wait for state machine completion */
volatile uint8_t state; /* State of state machine */
WDOG_ID timeout; /* watchdog to timeout when bus hung */
uint16_t wrcnt; /* number of bytes sent to tx fifo */
uint16_t rdcnt; /* number of bytes read from rx fifo */
uint16_t wrcnt; /* number of bytes sent to tx fifo */
uint16_t rdcnt; /* number of bytes read from rx fifo */
};
static struct lpc17_i2cdev_s i2cdevices[3];
/****************************************************************************
/*******************************************************************************
* Private Functions
****************************************************************************/
static int i2c_start (struct lpc17_i2cdev_s *priv);
static void i2c_stop (struct lpc17_i2cdev_s *priv);
static int i2c_interrupt (int irq, FAR void *context);
static void i2c_timeout (int argc, uint32_t arg, ...);
*******************************************************************************/
/****************************************************************************
static int i2c_start(struct lpc17_i2cdev_s *priv);
static void i2c_stop(struct lpc17_i2cdev_s *priv);
static int i2c_interrupt(int irq, FAR void *context);
static void i2c_timeout(int argc, uint32_t arg, ...);
/*******************************************************************************
* I2C device operations
****************************************************************************/
*******************************************************************************/
static uint32_t i2c_setfrequency(FAR struct i2c_dev_s *dev, uint32_t frequency);
static int i2c_setaddress(FAR struct i2c_dev_s *dev, int addr, int nbits);
@ -140,12 +144,12 @@ static int i2c_transfer(FAR struct i2c_dev_s *dev, FAR struct i2c_msg_s *ms
struct i2c_ops_s lpc17_i2c_ops =
{
.setfrequency = i2c_setfrequency,
.setaddress = i2c_setaddress,
.write = i2c_write,
.read = i2c_read,
.setfrequency = i2c_setfrequency,
.setaddress = i2c_setaddress,
.write = i2c_write,
.read = i2c_read,
#ifdef CONFIG_I2C_TRANSFER
.transfer = i2c_transfer
.transfer = i2c_transfer
#endif
};
@ -159,23 +163,26 @@ struct i2c_ops_s lpc17_i2c_ops =
static uint32_t i2c_setfrequency(FAR struct i2c_dev_s *dev, uint32_t frequency)
{
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
if (frequency > 100000)
if (frequency > 100000)
{
/* asymetric per 400Khz I2C spec */
putreg32 ( LPC17_CCLK / (83 + 47) * 47 / frequency, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32 ( LPC17_CCLK / (83 + 47) * 83 / frequency, priv->base + LPC17_I2C_SCLL_OFFSET);
/* asymetric per 400Khz I2C spec */
putreg32(LPC17_CCLK / (83 + 47) * 47 / frequency, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32(LPC17_CCLK / (83 + 47) * 83 / frequency, priv->base + LPC17_I2C_SCLL_OFFSET);
}
else
else
{
/* 50/50 mark space ratio */
putreg32 (LPC17_CCLK / 100 * 50 / frequency, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32 (LPC17_CCLK / 100 * 50 / frequency, priv->base + LPC17_I2C_SCLL_OFFSET);
/* 50/50 mark space ratio */
putreg32(LPC17_CCLK / 100 * 50 / frequency, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32(LPC17_CCLK / 100 * 50 / frequency, priv->base + LPC17_I2C_SCLL_OFFSET);
}
/* FIXME: This function should return the actual selected frequency */
return frequency;
/* FIXME: This function should return the actual selected frequency */
return frequency;
}
/*******************************************************************************
@ -185,17 +192,18 @@ static uint32_t i2c_setfrequency(FAR struct i2c_dev_s *dev, uint32_t frequency)
* Set the I2C slave address for a subsequent read/write
*
*******************************************************************************/
static int i2c_setaddress(FAR struct i2c_dev_s *dev, int addr, int nbits)
{
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
DEBUGASSERT(dev != NULL);
DEBUGASSERT(nbits == 7 );
DEBUGASSERT(dev != NULL);
DEBUGASSERT(nbits == 7 );
priv->msg.addr = addr<<1;
priv->msg.flags = 0 ;
priv->msg.addr = addr<<1;
priv->msg.flags = 0 ;
return OK;
return OK;
}
/*******************************************************************************
@ -206,22 +214,23 @@ static int i2c_setaddress(FAR struct i2c_dev_s *dev, int addr, int nbits)
* frequency and slave address.
*
*******************************************************************************/
static int i2c_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer, int buflen)
{
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
int ret;
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
int ret;
DEBUGASSERT (dev != NULL);
DEBUGASSERT(dev != NULL);
priv->wrcnt=0;
priv->rdcnt=0;
priv->msg.addr &= ~0x01;
priv->msg.buffer = (uint8_t*)buffer;
priv->msg.length = buflen;
ret = i2c_start (priv);
priv->wrcnt = 0;
priv->rdcnt = 0;
priv->msg.addr &= ~0x01;
priv->msg.buffer = (uint8_t*)buffer;
priv->msg.length = buflen;
ret = i2c_start(priv);
return ret >0 ? OK : -ETIMEDOUT;
return ret > 0 ? OK : -ETIMEDOUT;
}
/*******************************************************************************
@ -232,22 +241,23 @@ static int i2c_write(FAR struct i2c_dev_s *dev, const uint8_t *buffer, int bufle
* frequency and slave address.
*
*******************************************************************************/
static int i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen)
{
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
int ret;
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
int ret;
DEBUGASSERT (dev != NULL);
DEBUGASSERT(dev != NULL);
priv->wrcnt=0;
priv->rdcnt=0;
priv->msg.addr |= 0x01;
priv->msg.buffer = buffer;
priv->msg.length = buflen;
priv->wrcnt = 0;
priv->rdcnt = 0;
priv->msg.addr |= 0x01;
priv->msg.buffer = buffer;
priv->msg.length = buflen;
ret = i2c_start (priv);
ret = i2c_start(priv);
return ret >0 ? OK : -ETIMEDOUT;
return ret > 0 ? OK : -ETIMEDOUT;
}
/*******************************************************************************
@ -257,24 +267,31 @@ static int i2c_read(FAR struct i2c_dev_s *dev, uint8_t *buffer, int buflen)
* Perform a I2C transfer start
*
*******************************************************************************/
static int i2c_start (struct lpc17_i2cdev_s *priv)
static int i2c_start(struct lpc17_i2cdev_s *priv)
{
int ret=-1;
sem_wait (&priv->mutex);
int ret = -1;
putreg32(I2C_CONCLR_STAC|I2C_CONCLR_SIC,priv->base+LPC17_I2C_CONCLR_OFFSET);
putreg32(I2C_CONSET_STA,priv->base+LPC17_I2C_CONSET_OFFSET);
sem_wait(&priv->mutex);
wd_start (priv->timeout, I2C_TIMEOUT, i2c_timeout, 1, (uint32_t)priv);
sem_wait(&priv->wait);
wd_cancel (priv->timeout);
sem_post (&priv->mutex);
putreg32(I2C_CONCLR_STAC|I2C_CONCLR_SIC, priv->base+LPC17_I2C_CONCLR_OFFSET);
putreg32(I2C_CONSET_STA, priv->base+LPC17_I2C_CONSET_OFFSET);
if( priv-> state == 0x18 || priv->state == 0x28)
ret=priv->wrcnt;
else if( priv-> state == 0x50 || priv->state == 0x58)
ret=priv->rdcnt;
return ret;
wd_start(priv->timeout, I2C_TIMEOUT, i2c_timeout, 1, (uint32_t)priv);
sem_wait(&priv->wait);
wd_cancel(priv->timeout);
sem_post(&priv->mutex);
if (priv-> state == 0x18 || priv->state == 0x28)
{
ret = priv->wrcnt;
}
else if (priv-> state == 0x50 || priv->state == 0x58)
{
ret = priv->rdcnt;
}
return ret;
}
/*******************************************************************************
@ -284,11 +301,15 @@ static int i2c_start (struct lpc17_i2cdev_s *priv)
* Perform a I2C transfer stop
*
*******************************************************************************/
static void i2c_stop (struct lpc17_i2cdev_s *priv)
static void i2c_stop(struct lpc17_i2cdev_s *priv)
{
if(priv->state!=0x38)
putreg32(I2C_CONSET_STO|I2C_CONSET_AA,priv->base+LPC17_I2C_CONSET_OFFSET);
sem_post (&priv->wait);
if (priv->state != 0x38)
{
putreg32(I2C_CONSET_STO|I2C_CONSET_AA,priv->base+LPC17_I2C_CONSET_OFFSET);
}
sem_post(&priv->wait);
}
/*******************************************************************************
@ -299,14 +320,14 @@ static void i2c_stop (struct lpc17_i2cdev_s *priv)
*
*******************************************************************************/
static void i2c_timeout (int argc, uint32_t arg, ...)
static void i2c_timeout(int argc, uint32_t arg, ...)
{
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) arg;
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) arg;
irqstate_t flags = irqsave();
priv->state = 0xff;
sem_post (&priv->wait);
irqrestore (flags);
irqstate_t flags = irqsave();
priv->state = 0xff;
sem_post(&priv->wait);
irqrestore(flags);
}
/*******************************************************************************
@ -317,90 +338,109 @@ static void i2c_timeout (int argc, uint32_t arg, ...)
*
*******************************************************************************/
static int i2c_interrupt (int irq, FAR void *context)
static int i2c_interrupt(int irq, FAR void *context)
{
struct lpc17_i2cdev_s *priv;
struct lpc17_i2cdev_s *priv;
uint32_t state;
#ifdef CONFIG_LPC17_I2C0
if (irq == LPC17_IRQ_I2C0)
if (irq == LPC17_IRQ_I2C0)
{
priv=&i2cdevices[0];
priv=&i2cdevices[0];
}
else
else
#endif
#ifdef CONFIG_LPC17_I2C1
if (irq == LPC17_IRQ_I2C1)
if (irq == LPC17_IRQ_I2C1)
{
priv=&i2cdevices[1];
priv=&i2cdevices[1];
}
else
else
#endif
#ifdef CONFIG_LPC17_I2C2
if (irq == LPC17_IRQ_I2C2)
if (irq == LPC17_IRQ_I2C2)
{
priv=&i2cdevices[2];
priv=&i2cdevices[2];
}
else
#endif
{
PANIC(OSERR_INTERNAL);
}
/*
* refrence UM10360 19.10.5
*/
uint32_t state = getreg32(priv->base+LPC17_I2C_STAT_OFFSET);
putreg32(I2C_CONCLR_SIC,priv->base+LPC17_I2C_CONCLR_OFFSET);
priv->state=state;
state &=0xf8;
switch (state)
{
case 0x00: //Bus Error
case 0x20:
case 0x30:
case 0x38:
case 0x48:
i2c_stop(priv);
break;
case 0x08: //START
case 0x10: //Repeat START
putreg32(priv->msg.addr,priv->base+LPC17_I2C_DAT_OFFSET);
putreg32(I2C_CONCLR_STAC,priv->base+LPC17_I2C_CONCLR_OFFSET);
break;
case 0x18:
priv->wrcnt=0;
putreg32(priv->msg.buffer[0],priv->base+LPC17_I2C_DAT_OFFSET);
break;
case 0x28:
priv->wrcnt++;
if(priv->wrcnt<priv->msg.length)
putreg32(priv->msg.buffer[priv->wrcnt],priv->base+LPC17_I2C_DAT_OFFSET);
else
i2c_stop(priv);
break;
case 0x40:
priv->rdcnt=-1;
putreg32(I2C_CONSET_AA,priv->base+LPC17_I2C_CONSET_OFFSET);
break;
case 0x50:
priv->rdcnt++;
if(priv->rdcnt<priv->msg.length)
priv->msg.buffer[priv->rdcnt]=getreg32(priv->base+LPC17_I2C_BUFR_OFFSET);
if(priv->rdcnt>=priv->msg.length-1)
putreg32(I2C_CONCLR_AAC|I2C_CONCLR_SIC,priv->base+LPC17_I2C_CONCLR_OFFSET);
break;
case 0x58:
i2c_stop(priv);
break;
default:
i2c_stop(priv);
break;
}
return OK;
/* Reference UM10360 19.10.5 */
state = getreg32(priv->base+LPC17_I2C_STAT_OFFSET);
putreg32(I2C_CONCLR_SIC, priv->base+LPC17_I2C_CONCLR_OFFSET);
priv->state = state;
state &= 0xf8;
switch (state)
{
case 0x00: // Bus Error
case 0x20:
case 0x30:
case 0x38:
case 0x48:
i2c_stop(priv);
break;
case 0x08: // START
case 0x10: // Repeat START
putreg32(priv->msg.addr, priv->base+LPC17_I2C_DAT_OFFSET);
putreg32(I2C_CONCLR_STAC, priv->base+LPC17_I2C_CONCLR_OFFSET);
break;
case 0x18:
priv->wrcnt = 0;
putreg32(priv->msg.buffer[0], priv->base+LPC17_I2C_DAT_OFFSET);
break;
case 0x28:
priv->wrcnt++;
if (priv->wrcnt<priv->msg.length)
{
putreg32(priv->msg.buffer[priv->wrcnt],priv->base+LPC17_I2C_DAT_OFFSET);
}
else
{
i2c_stop(priv);
}
break;
case 0x40:
priv->rdcnt = -1;
putreg32(I2C_CONSET_AA, priv->base+LPC17_I2C_CONSET_OFFSET);
break;
case 0x50:
priv->rdcnt++;
if (priv->rdcnt < priv->msg.length)
{
priv->msg.buffer[priv->rdcnt] = getreg32(priv->base+LPC17_I2C_BUFR_OFFSET);
}
if (priv->rdcnt>=priv->msg.length-1)
{
putreg32(I2C_CONCLR_AAC|I2C_CONCLR_SIC, priv->base+LPC17_I2C_CONCLR_OFFSET);
}
break;
case 0x58:
i2c_stop(priv);
break;
default:
i2c_stop(priv);
break;
}
return OK;
}
/****************************************************************************
/*******************************************************************************
* Public Functions
****************************************************************************/
*******************************************************************************/
/*******************************************************************************
* Name: up_i2cinitialize
@ -412,116 +452,117 @@ static int i2c_interrupt (int irq, FAR void *context)
struct i2c_dev_s *up_i2cinitialize(int port)
{
struct lpc17_i2cdev_s *priv;
struct lpc17_i2cdev_s *priv;
irqstate_t flags;
uint32_t regval;
if (port>2)
if (port > 2)
{
dbg("lpc I2C Only support 0,1,2\n");
return NULL;
dbg("lpc I2C Only support 0,1,2\n");
return NULL;
}
irqstate_t flags;
uint32_t regval;
flags = irqsave();
flags = irqsave();
priv= &i2cdevices[port];
priv= &i2cdevices[port];
#ifdef CONFIG_LPC17_I2C0
if (port==0)
if (port == 0)
{
priv= (FAR struct lpc17_i2cdev_s *)&i2cdevices[0];
priv->base = LPC17_I2C0_BASE;
priv->irqid = LPC17_IRQ_I2C0;
priv= (FAR struct lpc17_i2cdev_s *)&i2cdevices[0];
priv->base = LPC17_I2C0_BASE;
priv->irqid = LPC17_IRQ_I2C0;
regval = getreg32(LPC17_SYSCON_PCONP);
regval |= SYSCON_PCONP_PCI2C0;
putreg32(regval, LPC17_SYSCON_PCONP);
regval = getreg32(LPC17_SYSCON_PCONP);
regval |= SYSCON_PCONP_PCI2C0;
putreg32(regval, LPC17_SYSCON_PCONP);
regval = getreg32(LPC17_SYSCON_PCLKSEL0);
regval &= ~SYSCON_PCLKSEL0_I2C0_MASK;
regval |= (SYSCON_PCLKSEL_CCLK << SYSCON_PCLKSEL0_I2C0_SHIFT);
putreg32(regval, LPC17_SYSCON_PCLKSEL0);
regval = getreg32(LPC17_SYSCON_PCLKSEL0);
regval &= ~SYSCON_PCLKSEL0_I2C0_MASK;
regval |= (SYSCON_PCLKSEL_CCLK << SYSCON_PCLKSEL0_I2C0_SHIFT);
putreg32(regval, LPC17_SYSCON_PCLKSEL0);
lpc17_configgpio(GPIO_I2C0_SCL);
lpc17_configgpio(GPIO_I2C0_SDA);
lpc17_configgpio(GPIO_I2C0_SCL);
lpc17_configgpio(GPIO_I2C0_SDA);
putreg32 (LPC17_CCLK/CONFIG_I2C0_FREQ/2, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32 (LPC17_CCLK/CONFIG_I2C0_FREQ/2, priv->base + LPC17_I2C_SCLL_OFFSET);
putreg32(LPC17_CCLK/CONFIG_I2C0_FREQ/2, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32(LPC17_CCLK/CONFIG_I2C0_FREQ/2, priv->base + LPC17_I2C_SCLL_OFFSET);
}
else
else
#endif
#ifdef CONFIG_LPC17_I2C1
if(port==1)
if (port == 1)
{
priv= (FAR struct lpc17_i2cdev_s *)&i2cdevices[1];
priv->base = LPC17_I2C1_BASE;
priv->irqid = LPC17_IRQ_I2C1;
priv= (FAR struct lpc17_i2cdev_s *)&i2cdevices[1];
priv->base = LPC17_I2C1_BASE;
priv->irqid = LPC17_IRQ_I2C1;
regval = getreg32(LPC17_SYSCON_PCONP);
regval |= SYSCON_PCONP_PCI2C1;
putreg32(regval, LPC17_SYSCON_PCONP);
regval = getreg32(LPC17_SYSCON_PCONP);
regval |= SYSCON_PCONP_PCI2C1;
putreg32(regval, LPC17_SYSCON_PCONP);
regval = getreg32(LPC17_SYSCON_PCLKSEL1);
regval &= ~SYSCON_PCLKSEL1_I2C1_MASK;
regval |= (SYSCON_PCLKSEL_CCLK << SYSCON_PCLKSEL1_I2C1_SHIFT);
putreg32(regval, LPC17_SYSCON_PCLKSEL1);
regval = getreg32(LPC17_SYSCON_PCLKSEL1);
regval &= ~SYSCON_PCLKSEL1_I2C1_MASK;
regval |= (SYSCON_PCLKSEL_CCLK << SYSCON_PCLKSEL1_I2C1_SHIFT);
putreg32(regval, LPC17_SYSCON_PCLKSEL1);
lpc17_configgpio(GPIO_I2C1_SCL);
lpc17_configgpio(GPIO_I2C1_SDA);
lpc17_configgpio(GPIO_I2C1_SCL);
lpc17_configgpio(GPIO_I2C1_SDA);
putreg32 (LPC17_CCLK/CONFIG_I2C1_FREQ/2, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32 (LPC17_CCLK/CONFIG_I2C1_FREQ/2, priv->base + LPC17_I2C_SCLL_OFFSET);
putreg32(LPC17_CCLK/CONFIG_I2C1_FREQ/2, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32(LPC17_CCLK/CONFIG_I2C1_FREQ/2, priv->base + LPC17_I2C_SCLL_OFFSET);
}
else
else
#endif
#ifdef CONFIG_LPC17_I2C2
if(port==2)
if (port == 2)
{
priv= (FAR struct lpc17_i2cdev_s *)&i2cdevices[2];
priv->base = LPC17_I2C2_BASE;
priv->irqid = LPC17_IRQ_I2C2;
priv= (FAR struct lpc17_i2cdev_s *)&i2cdevices[2];
priv->base = LPC17_I2C2_BASE;
priv->irqid = LPC17_IRQ_I2C2;
regval = getreg32(LPC17_SYSCON_PCONP);
regval |= SYSCON_PCONP_PCI2C2;
putreg32(regval, LPC17_SYSCON_PCONP);
regval = getreg32(LPC17_SYSCON_PCONP);
regval |= SYSCON_PCONP_PCI2C2;
putreg32(regval, LPC17_SYSCON_PCONP);
regval = getreg32(LPC17_SYSCON_PCLKSEL1);
regval &= ~SYSCON_PCLKSEL1_I2C2_MASK;
regval |= (SYSCON_PCLKSEL_CCLK << SYSCON_PCLKSEL1_I2C2_SHIFT);
putreg32(regval, LPC17_SYSCON_PCLKSEL1);
regval = getreg32(LPC17_SYSCON_PCLKSEL1);
regval &= ~SYSCON_PCLKSEL1_I2C2_MASK;
regval |= (SYSCON_PCLKSEL_CCLK << SYSCON_PCLKSEL1_I2C2_SHIFT);
putreg32(regval, LPC17_SYSCON_PCLKSEL1);
lpc17_configgpio(GPIO_I2C2_SCL);
lpc17_configgpio(GPIO_I2C2_SDA);
lpc17_configgpio(GPIO_I2C2_SCL);
lpc17_configgpio(GPIO_I2C2_SDA);
putreg32 (LPC17_CCLK/CONFIG_I2C2_FREQ/2, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32 (LPC17_CCLK/CONFIG_I2C2_FREQ/2, priv->base + LPC17_I2C_SCLL_OFFSET);
putreg32(LPC17_CCLK/CONFIG_I2C2_FREQ/2, priv->base + LPC17_I2C_SCLH_OFFSET);
putreg32(LPC17_CCLK/CONFIG_I2C2_FREQ/2, priv->base + LPC17_I2C_SCLL_OFFSET);
}
else
else
#endif
{
return NULL;
return NULL;
}
putreg32(I2C_CONSET_I2EN,priv->base+LPC17_I2C_CONSET_OFFSET);
sem_init (&priv->mutex, 0, 1);
sem_init (&priv->wait, 0, 0);
putreg32(I2C_CONSET_I2EN, priv->base+LPC17_I2C_CONSET_OFFSET);
/* Allocate a watchdog timer */
priv->timeout = wd_create();
sem_init(&priv->mutex, 0, 1);
sem_init(&priv->wait, 0, 0);
DEBUGASSERT(priv->timeout != 0);
/* Allocate a watchdog timer */
/* Attach Interrupt Handler */
irq_attach (priv->irqid, i2c_interrupt);
priv->timeout = wd_create();
DEBUGASSERT(priv->timeout != 0);
/* Enable Interrupt Handler */
up_enable_irq(priv->irqid);
/* Attach Interrupt Handler */
/* Install our operations */
priv->dev.ops = &lpc17_i2c_ops;
irq_attach(priv->irqid, i2c_interrupt);
return &priv->dev;
/* Enable Interrupt Handler */
up_enable_irq(priv->irqid);
/* Install our operations */
priv->dev.ops = &lpc17_i2c_ops;
return &priv->dev;
}
/*******************************************************************************
@ -534,12 +575,30 @@ struct i2c_dev_s *up_i2cinitialize(int port)
int up_i2cuninitialize(FAR struct i2c_dev_s * dev)
{
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
putreg32(I2C_CONCLRT_I2ENC,priv->base+LPC17_I2C_CONCLR_OFFSET);
up_disable_irq(priv->irqid);
irq_detach (priv->irqid);
return OK;
struct lpc17_i2cdev_s *priv = (struct lpc17_i2cdev_s *) dev;
/* Disable I2C */
putreg32(I2C_CONCLRT_I2ENC, priv->base+LPC17_I2C_CONCLR_OFFSET);
/* Reset data structures */
sem_destroy(&priv->mutex);
sem_destroy(&priv->wait);
/* Free the watchdog timer */
wd_delete(priv->timeout);
priv->timeout = NULL;
/* Disable interrupts */
up_disable_irq(priv->irqid);
/* Detach Interrupt Handler */
irq_detach(priv->irqid);
return OK;
}
#endif

View File

@ -1,7 +1,7 @@
############################################################################
# configs/z8f64200100kit/ostest/Make.defs
#
# Copyright (C) 2008 Gregory Nutt. All rights reserved.
# Copyright (C) 2008, 2012 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
@ -33,27 +33,37 @@
#
############################################################################
include ${TOPDIR}/.config
include ${TOPDIR}/tools/Config.mk
include $(TOPDIR)/.config
include $(TOPDIR)/tools/Config.mk
# These are the directories where the ZDS-II toolchain is installed
ZDSINSTALLDIR := C:/Program Files (x86)/ZiLOG/ZDSII_Z8Encore!_4.10.1
ZDSVERSION := 5.0.0
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
ZDSBINDIR := $(ZDSINSTALLDIR)\bin
ZDSSTDINCDIR := $(ZDSINSTALLDIR)\include\std
ZDSZILOGINCDIR := $(ZDSINSTALLDIR)\include\zilog
ZDSINSTALLDIR := C:/PROGRA~2/ZiLOG/ZZDSII_Z8Encore!_$(ZDSVERSION)
INSTALLDIR = ${shell echo $(ZDSINSTALLDIR)| sed -e "s/\//\\/g"}
ZDSBINDIR := $(INSTALLDIR)\bin
ZDSSTDINCDIR := $(INSTALLDIR)\include\std
ZDSZILOGINCDIR := $(INSTALLDIR)\include\zilog
ifeq ($(CONFIG_ARCH_CHIP_Z8F642X),y)
ZDSDEVINCDIR := $(ZDSZILOGINCDIR)\Z8Encore_F642X
ZDSDEVINCDIR := $(INSTALLDIR)\Z8Encore_F642X
endif
ifeq ($(CONFIG_ARCH_CHIP_Z8F640X),y)
ZDSDEVINCDIR := $(ZDSZILOGINCDIR)\Z8Encore_F640X
ZDSDEVINCDIR := $(INSTALLDIR)\Z8Encore_F640X
endif
ZDSSTDLIBDIR := $(ZDSINSTALLDIR)\lib\std
ZDSZILOGLIBDIR := $(ZDSINSTALLDIR)\lib\zilog
ZDSSTDLIBDIR := $(INSTALLDIR)\lib\std
ZDSZILOGLIBDIR := $(INSTALLDIR)\lib\zilog
# CFLAGs
ARCHASMINCLUDES = -include:$(TOPDIR)\include;$(ZDSSTDINCDIR);$(ZDSZILOGINCDIR)
EARCHASMINCLUDES = -include:$(TOPDIR)\include;$(ZDSSTDINCDIR);$(ZDSZILOGINCDIR)
ARCHSTDINCLUDES = -stdinc:$(TOPDIR)\include;$(ZDSSTDINCDIR);$(ZDSZILOGINCDIR)
ARCHUSRINCLUDES = -usrinc:.
else
WINTOOL := y
ZDSINSTALLDIR := C:/Program Files (x86)/ZiLOG/ZZDSII_Z8Encore!_$(ZDSVERSION)
INSTALLDIR = ${shell cygpath -u "$(ZDSINSTALLDIR)"}
ZDSBINDIR := $(INSTALLDIR)/bin
ZDSSTDINCDIR := $(INSTALLDIR)/include/std
@ -66,43 +76,50 @@ ifeq ($(CONFIG_ARCH_CHIP_Z8F640X),y)
endif
ZDSSTDLIBDIR := $(INSTALLDIR)/lib/std
ZDSZILOGLIBDIR := $(INSTALLDIR)/lib/zilog
# These are the same directories but with the directory separator
# character swapped as needed by the ZDS-II compiler
WTOPDIR := ${shell cygpath -w "$(TOPDIR)"}
WZDSSTDINCDIR := ${shell cygpath -w "$(ZDSSTDINCDIR)"}
WZDSZILOGINCDIR := ${shell cygpath -w "$(ZDSZILOGINCDIR)"}
WZDSDEVINCDIR := ${shell cygpath -w "$(ZDSDEVINCDIR)"}
WZDSSTDLIBDIR := ${shell cygpath -w "$(ZDSSTDLIBDIR)"}
WZDSZILOGLIBDIR := ${shell cygpath -w "$(ZDSZILOGLIBDIR)"}
# Escaped versions
ETOPDIR := ${shell echo "$(WTOPDIR)" | sed -e "s/ /%20/g"}
EZDSSTDINCDIR := ${shell echo "$(WZDSSTDINCDIR)" | sed -e "s/ /%20/g"}
EZDSZILOGINCDIR := ${shell echo "$(WZDSZILOGINCDIR)" | sed -e "s/ /%20/g"}
# CFLAGs
ARCHASMINCLUDES = -include:'$(WTOPDIR)\include;$(WZDSSTDINCDIR);$(WZDSZILOGINCDIR)'
EARCHASMINCLUDES = -include:'$(ETOPDIR)\include;$(EZDSSTDINCDIR);$(EZDSZILOGINCDIR)'
ARCHSTDINCLUDES = -stdinc:'$(WTOPDIR)\include;$(WZDSSTDINCDIR);$(WZDSZILOGINCDIR)'
ARCHUSRINCLUDES = -usrinc:'.'
endif
# These are the same directories but with the directory separator
# character swapped as needed by the ZDS-II compiler
WTOPDIR := ${shell cygpath -w "$(TOPDIR)"}
WZDSSTDINCDIR := ${shell cygpath -w "$(ZDSSTDINCDIR)"}
WZDSZILOGINCDIR := ${shell cygpath -w "$(ZDSZILOGINCDIR)"}
WZDSDEVINCDIR := ${shell cygpath -w "$(ZDSDEVINCDIR)"}
WZDSSTDLIBDIR := ${shell cygpath -w "$(ZDSSTDLIBDIR)"}
WZDSZILOGLIBDIR := ${shell cygpath -w "$(ZDSZILOGLIBDIR)"}
# Escaped versions
ETOPDIR := ${shell echo "$(WTOPDIR)" | sed -e "s/ /%20/g"}
EZDSSTDINCDIR := ${shell echo "$(WZDSSTDINCDIR)" | sed -e "s/ /%20/g"}
EZDSZILOGINCDIR := ${shell echo "$(WZDSZILOGINCDIR)" | sed -e "s/ /%20/g"}
# Assembler definitions
ifeq ($(CONFIG_ARCH_CHIP_Z8F642X),y)
ARCHFAMILYDEF = _Z8ENCORE_F642X
ARCHSERIESDEF = _Z8ENCORE_64K_SERIES
ARCHREVAA = -NOrevaa
ARCHFAMILYDEF = _Z8ENCORE_F642X
ARCHSERIESDEF = _Z8ENCORE_64K_SERIES
ARCHREVAA = -NOrevaa
ifeq ($(CONFIG_ARCH_CHIP_Z8F6423),y)
ARCHCPU = Z8F6423
ARCHCPUDEF = _Z8F6423
ARCHCPU = Z8F6423
ARCHCPUDEF = _Z8F6423
endif
endif
ifeq ($(CONFIG_ARCH_CHIP_Z8F640X),y)
ARCHFAMILYDEF = _Z8ENCORE_F640X
ARCHSERIESDEF = _Z8ENCORE_640_FAMILY
ARCHREVAA = -revaa
ARCHFAMILYDEF = _Z8ENCORE_F640X
ARCHSERIESDEF = _Z8ENCORE_640_FAMILY
ARCHREVAA = -revaa
ifeq ($(CONFIG_ARCH_CHIP_Z8F6403),y)
ARCHCPU = Z8F6403
ARCHCPUDEF = _Z8F6403
ARCHCPU = Z8F6403
ARCHCPUDEF = _Z8F6403
endif
endif
@ -116,8 +133,6 @@ ARCHASMCPUFLAGS = -cpu:$(ARCHCPU) -NOigcase $(ARCHREVAA)
ARCHASMLIST = -list -NOlistmac -name -pagelen:56 -pagewidth:80 -quiet
ARCHASMWARNINGS = -warn
ARCHASMDEFINES = -define:$(ARCHCPUDEF)=1 -define:$(ARCHSERIESDEF)=1 -define:$(ARCHFAMILYDEF)=1 -define:__ASSEMBLY__
ARCHASMINCLUDES = -include:'$(WTOPDIR)\include;$(WZDSSTDINCDIR);$(WZDSZILOGINCDIR)'
EARCHASMINCLUDES = -include:'$(ETOPDIR)\include;$(EZDSSTDINCDIR);$(EZDSZILOGINCDIR)'
AFLAGS = $(ARCHASMCPUFLAGS) $(ARCHASMINCLUDES) $(ARCHASMLIST) $(ARCHASMWARNINGS) $(ARCHASMOPTIMIZATION)
# Compiler definitions
@ -135,12 +150,11 @@ ARCHPICFLAGS =
ARCHWARNINGS = -warn
ARCHDEFINES = -define:$(ARCHFAMILYDEF) -define:$(ARCHCPUDEF) -define:$(ARCHSERIESDEF)
ARCHSTDINCLUDES = -stdinc:'$(WTOPDIR)\include;$(WZDSSTDINCDIR);$(WZDSZILOGINCDIR);$(WZDSDEVINCDIR)'
ARCHUSRINCLUDES = -usrinc:'.'
ARCHINCLUDES = $(ARCHSTDINCLUDES) $(ARCHUSRINCLUDES)
CFLAGS = $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHLIST) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
CPPDEFINES = -D$(ARCHFAMILYDEF) -D$(ARCHCPUDEF) -D$(ARCHSERIESDEF) -D__ASSEMBLY__
CPPINCLUDES = -I$(TOPDIR)/include
CPPINCLUDES = -I$(TOPDIR)$(DELIM)include
CPPFLAGS = $(CPPDEFINES) $(CPPINCLUDES)
# Librarian definitions
@ -149,73 +163,111 @@ ARFLAGS = -quiet -warn
# Linker definitions
LINKCMDTEMPLATE = $(TOPDIR)/configs/z8f64200100kit/ostest/ostest.linkcmd
LINKCMDTEMPLATE = $(TOPDIR)$(DELIM)configs$(DELIM)z8f64200100kit$(DELIM)ostest$(DELIM)ostest.linkcmd
# Tool names/pathes
CROSSDEV =
CC = $(ZDSBINDIR)/ez8cc.exe
CC = ez8cc.exe
CPP = gcc -E
LD = $(ZDSBINDIR)/ez8link.exe
AS = $(ZDSBINDIR)/ez8asm.exe
AR = $(ZDSBINDIR)/ez8lib.exe
LD = ez8link.exe
AS = ez8asm.exe
AR = ez8lib.exe
# File extensions
ASMEXT = .asm
OBJEXT = .obj
LIBEXT = .lib
EXEEXT = .hex
EXEXT = .hex
# These are the macros that will be used in the NuttX make system
# to compile and assembly source files and to insert the resulting
# object files into an archive
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
define PREPROCESS
@echo CPP: $1->$2
$(Q) "$(CPP)" $(CPPFLAGS) $1 -o $2
endef
define COMPILE
$(Q) "$(CC)" $(CFLAGS) ${shell echo $1 | sed -e "s/\//\\/g"}
endef
define ASSEMBLE
$(Q) "$(AS)" $(AFLAGS) ${shell echo $1 | sed -e "s/\//\\/g"}
endef
define ARCHIVE
echo AR: $2
$(Q) for %%G in ($(2)) do ( "$(AR)" $(ARFLAGS) $1=-+%%G )
endef
define CLEAN
$(Q) if exist *.obj (del /f /q *.obj)
$(Q) if exist *.src (del /f /q *.src)
$(Q) if exist *.lib (del /f /q *.lib)
$(Q) if exist *.hex (del /f /q *.hex)
$(Q) if exist *.lod (del /f /q *.lod)
$(Q) if exist *.lst (del /f /q *.lst)
endef
else
define PREPROCESS
@echo "CPP: $1->$2"
$(Q) "$(CPP)" $(CPPFLAGS) $1 -o $2
endef
define COMPILE
@#echo "CC: $1"
$(Q) (wfile=`cygpath -w "$1"`; "$(CC)" $(CFLAGS) $$wfile)
endef
define ASSEMBLE
@#echo "AS: $1"
$(Q) (wfile=`cygpath -w "$1"`; "$(AS)" $(AFLAGS) $$wfile)
endef
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
define ARCHIVE
echo "AR: $2";
$(Q) for %%G in ($(2)) do ( "$(AR)" $(ARFLAGS) $1=-+%%G )
endef
else
define ARCHIVE
$(Q) for __obj in $(2) ; do \
echo "AR: $$__obj"; \
"$(AR)" $(ARFLAGS) $1=-+$$__obj || { echo "$(AR) $1=-+$$__obj FAILED!" ; exit 1 ; } \
done
endef
endif
define CLEAN
$(Q) rm -f *.obj *.src *.lib *.hex *.lst
$(Q) rm -f *.obj *.src *.lib *.hex *.lod *.lst
endef
endif
# This is the tool to use for dependencies (i.e., none)
# Windows native host tool definitions
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
HOSTCC = mingw32-gcc.exe
HOSTINCLUDES = -I.
HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -g -pipe
HOSTLDFLAGS =
HOSTEXEEXT = .exe
# ZDS-II cannot follow Cygwin soft links, so we will have to use directory copies
# Windows-native host tools
DIRLINK = $(TOPDIR)/tools/winlink.sh
DIRUNLINK = $(TOPDIR)/tools/unlink.sh
MKDEP = $(TOPDIR)\tools\mkdeps.exe --winnative
else
# Linux/Cygwin host tool definitions
HOSTCC = gcc
HOSTINCLUDES = -I.
HOSTCFLAGS = -Wall -wstrict-prototypes -Wshadow -g -pipe
HOSTLDFLAGS =
HOSTCC = gcc
HOSTINCLUDES = -I.
HOSTCFLAGS = -Wall -wstrict-prototypes -Wshadow -g -pipe
HOSTLDFLAGS =
# This is the tool to use for dependencies (i.e., none)
MKDEP = $(TOPDIR)$(DELIM)tools$(DELIM)mknulldeps.sh
# ZDS-II cannot follow Cygwin soft links, so we will have to use directory copies
DIRLINK = $(TOPDIR)$(DELIM)tools$(DELIM)winlink.sh
DIRUNLINK = $(TOPDIR)$(DELIM)tools$(DELIM)unlink.sh
endif

View File

@ -1,7 +1,7 @@
#!/bin/bash
# configs/z8f64200100kit/ostest/setenv.sh
# configs/ez80f910200kitg/ostest/setenv.sh
#
# Copyright (C) 2008 Gregory Nutt. All rights reserved.
# Copyright (C) 2008, 2009 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
@ -33,20 +33,31 @@
#
# Check how we were executed
#
if [ "$(basename $0)" = "setenv.sh" ] ; then
if [ "$_" = "$0" ] ; then
echo "You must source this script, not run it!" 1>&2
exit 1
fi
#
# The ZDS-II toolchain lies outside of the Cygwin "sandbox" and
# attempts to set the PATH variable do not have the desired effect.
# Instead, alias are provided for all of the ZDS-II command line tools.
# Version 4.10.1 installed in the default location is assumed here.
#
ZDSBINDIR="C:/Program\ Files/ZiLOG/ZDSII_Z8Encore!_4.10.1/bin"
alias ez8asm="${ZDSBINDIR}/ez8asm.exe"
alias ez8cc="${ZDSBINDIR}/ez8cc.exe"
alias ez8lib="${ZDSBINDIR}/ez8lib.exe"
alias ez8link="${ZDSBINDIR}/ez8link.exe"
WD=`pwd`
if [ ! -x "setenv.sh" ]; then
echo "This script must be executed from the top-level NuttX build directory"
exit 1
fi
if [ -z "${PATH_ORIG}" ]; then
export PATH_ORIG="${PATH}"
fi
#
# This is the Cygwin path to location where the XDS-II tools were installed
#
TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/ZiLOG/ZDSII_Z8Encore!_5.0.0/bin"
#
# Add the path to the toolchain to the PATH varialble. NOTE that /bin and /usr/bin
# preceded the toolchain bin directory. This is because the ZDSII bin directory
# includes binaries like make.exe that will interfere with the normal build process
# if we do not give priority to the versions at /bin and /usr/bin.
#
export PATH="/bin:/usr/bin:${TOOLCHAIN_BIN}:/sbin:/usr/sbin:${PATH_ORIG}"
echo "PATH : ${PATH}"

View File

@ -0,0 +1,50 @@
@echo off
rem configs/z8f64200100kit/scripts/setenv.bat
rem
rem Copyright (C) 2012 Gregory Nutt. All rights reserved.
rem Author: Gregory Nutt <gnutt@nuttx.org>
rem
rem Redistribution and use in source and binary forms, with or without
rem modification, are permitted provided that the following conditions
rem are met:
rem
rem 1. Redistributions of source code must retain the above copyright
rem notice, this list of conditions and the following disclaimer.
rem 2. Redistributions in binary form must reproduce the above copyright
rem notice, this list of conditions and the following disclaimer in
rem the documentation and/or other materials provided with the
rem distribution.
rem 3. Neither the name NuttX nor the names of its contributors may be
rem used to endorse or promote products derived from this software
rem without specific prior written permission.
rem
rem THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
rem "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
rem LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
rem FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
rem COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
rem INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
rem BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
rem OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
rem AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
rem LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
rem ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
rem POSSIBILITY OF SUCH DAMAGE.
rem This is the location where I installed in the MinGW compiler. With
rem this configuration, it is recommended that you do NOT install the
rem MSYS tools; they conflict with the GNUWin32 tools. See
rem http://www.mingw.org/ for further info.
set PATH=C:\MinGW\bin;%PATH%
rem This is the location where I installed the ZDS-II toolchain.
set PATH=C:\Program Files (x86)\ZiLOG\ZZDSII_Z8Encore!_5.0.0\bin;%PATH%
rem This is the location where I installed the GNUWin32 tools. See
rem http://gnuwin32.sourceforge.net/.
set PATH=C:\gnuwin32\bin;%PATH%
echo %PATH%