diff options
-rw-r--r-- | apps/examples/i2schar/i2schar_main.c | 7 | ||||
-rw-r--r-- | apps/examples/i2schar/i2schar_receiver.c | 9 | ||||
-rw-r--r-- | apps/examples/i2schar/i2schar_transmitter.c | 11 | ||||
-rw-r--r-- | nuttx/ChangeLog | 3 | ||||
-rw-r--r-- | nuttx/arch/arm/src/sama5/sam_ssc.c | 52 | ||||
-rw-r--r-- | nuttx/drivers/audio/i2schar.c | 12 | ||||
-rw-r--r-- | nuttx/include/nuttx/audio/i2s.h | 25 |
7 files changed, 84 insertions, 35 deletions
diff --git a/apps/examples/i2schar/i2schar_main.c b/apps/examples/i2schar/i2schar_main.c index 2d5df3ce9..524a27550 100644 --- a/apps/examples/i2schar/i2schar_main.c +++ b/apps/examples/i2schar/i2schar_main.c @@ -297,9 +297,12 @@ int i2schar_main(int argc, char *argv[]) ret = pthread_create(&transmitter, &attr, i2schar_transmitter, NULL); if (ret != OK) { + sched_unlock(); message("i2schar_main: ERROR: failed to Start transmitter thread: %d\n", ret); return EXIT_FAILURE; } + + pthread_setname_np(transmitter, "transmitter"); #endif #ifdef CONFIG_EXAMPLES_I2SCHAR_RX @@ -313,6 +316,7 @@ int i2schar_main(int argc, char *argv[]) ret = pthread_create(&receiver, &attr, i2schar_receiver, NULL); if (ret != OK) { + sched_unlock(); message("i2schar_main: ERROR: failed to Start receiver thread: %d\n", ret); #ifdef CONFIG_EXAMPLES_I2SCHAR_TX message("i2schar_main: Waiting for the transmitter thread\n"); @@ -320,8 +324,11 @@ int i2schar_main(int argc, char *argv[]) #endif return EXIT_FAILURE; } + + pthread_setname_np(transmitter, "receiver"); #endif + sched_unlock(); #ifdef CONFIG_EXAMPLES_I2SCHAR_TX message("i2schar_main: Waiting for the transmitter thread\n"); ret = pthread_join(transmitter, &result); diff --git a/apps/examples/i2schar/i2schar_receiver.c b/apps/examples/i2schar/i2schar_receiver.c index 40256d571..279076c6a 100644 --- a/apps/examples/i2schar/i2schar_receiver.c +++ b/apps/examples/i2schar/i2schar_receiver.c @@ -94,6 +94,7 @@ pthread_addr_t i2schar_receiver(pthread_addr_t arg) struct audio_buf_desc_s desc; int bufsize; int nread; + int ret; int fd; int i; @@ -117,15 +118,17 @@ pthread_addr_t i2schar_receiver(pthread_addr_t arg) desc.numbytes = CONFIG_EXAMPLES_I2SCHAR_BUFSIZE; desc.u.ppBuffer = &apb; - bufsize = apb_alloc(&desc); - if (bufsize < 0) + ret = apb_alloc(&desc); + if (ret < 0) { message("i2schar_receiver: ERROR: failed to allocate buffer %d: %d\n", - i+1, bufsize); + i+1, ret); close(fd); pthread_exit(NULL); } + bufsize = sizeof(struct ap_buffer_s) + CONFIG_EXAMPLES_I2SCHAR_BUFSIZE; + /* Then receifve into the buffer */ do diff --git a/apps/examples/i2schar/i2schar_transmitter.c b/apps/examples/i2schar/i2schar_transmitter.c index 96717d2d0..601f9af39 100644 --- a/apps/examples/i2schar/i2schar_transmitter.c +++ b/apps/examples/i2schar/i2schar_transmitter.c @@ -96,6 +96,7 @@ pthread_addr_t i2schar_transmitter(pthread_addr_t arg) uint8_t *ptr; int bufsize; int nwritten; + int ret; int fd; int i; int j; @@ -120,15 +121,17 @@ pthread_addr_t i2schar_transmitter(pthread_addr_t arg) desc.numbytes = CONFIG_EXAMPLES_I2SCHAR_BUFSIZE; desc.u.ppBuffer = &apb; - bufsize = apb_alloc(&desc); - if (bufsize < 0) + ret = apb_alloc(&desc); + if (ret < 0) { message("i2schar_transmitter: ERROR: failed to allocate buffer %d: %d\n", - i+1, bufsize); + i+1, ret); close(fd); pthread_exit(NULL); } + bufsize = sizeof(struct ap_buffer_s) + CONFIG_EXAMPLES_I2SCHAR_BUFSIZE; + /* Fill the audio buffer with crap */ for (j = 0, ptr = apb->samp; j < CONFIG_EXAMPLES_I2SCHAR_BUFSIZE; j++) @@ -136,6 +139,8 @@ pthread_addr_t i2schar_transmitter(pthread_addr_t arg) *ptr++ = crap++; } + apb->nbytes = CONFIG_EXAMPLES_I2SCHAR_BUFSIZE; + /* Then send the buffer */ do diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 67a06cb00..f7f35ca71 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -6036,3 +6036,6 @@ (2013-11-11). * arch/arm/src/stm32: Added header files and driver framework for the STM32F429 LTDC framebuffer driver. From Ken Pettit (2013-11-11). + * configs/sama5d3x-ek/src/sam_i2schar.c: Add support for the + apps/examples/i2schar test (2011-11-11). + diff --git a/nuttx/arch/arm/src/sama5/sam_ssc.c b/nuttx/arch/arm/src/sama5/sam_ssc.c index 9d40f0558..77e4fe63c 100644 --- a/nuttx/arch/arm/src/sama5/sam_ssc.c +++ b/nuttx/arch/arm/src/sama5/sam_ssc.c @@ -254,7 +254,7 @@ struct sam_buffer_s struct sam_ssc_s { struct i2s_dev_s dev; /* Externally visible I2S interface */ - uint32_t base; /* SSC controller register base address */ + uintptr_t base; /* SSC controller register base address */ sem_t exclsem; /* Assures mutually exclusive acess to SSC */ uint16_t master:1; /* True: Master mode transfers */ uint16_t rx:1; /* True: RX transfers supported */ @@ -319,15 +319,15 @@ struct sam_ssc_s /* Register helpers */ #ifdef CONFIG_SAMA5_SSC_REGDEBUG -static bool ssc_checkreg(struct sam_ssc_s *priv, bool wr, uint32_t value, - uint32_t address); +static bool ssc_checkreg(struct sam_ssc_s *priv, bool wr, uint32_t regval, + uint32_t regaddr); #else -# define ssc_checkreg(priv,wr,value,address) (false) +# define ssc_checkreg(priv,wr,regval,regaddr) (false) #endif static inline uint32_t ssc_getreg(struct sam_ssc_s *priv, unsigned int offset); -static inline void ssc_putreg(struct sam_ssc_s *priv, uint32_t value, - unsigned int offset); +static inline void ssc_putreg(struct sam_ssc_s *priv, unsigned int offset, + uint32_t regval); static inline uintptr_t ssc_physregaddr(struct sam_ssc_s *priv, unsigned int offset); @@ -459,8 +459,8 @@ static const struct i2s_ops_s g_sscops = * Check if the current register access is a duplicate of the preceding. * * Input Parameters: - * value - The value to be written - * address - The address of the register to write to + * regval - The value to be written + * regaddr - The address of the register to write to * * Returned Value: * true: This is the first register access of this type. @@ -469,12 +469,12 @@ static const struct i2s_ops_s g_sscops = ****************************************************************************/ #ifdef CONFIG_SAMA5_SSC_REGDEBUG -static bool ssc_checkreg(struct sam_ssc_s *priv, bool wr, uint32_t value, - uint32_t address) +static bool ssc_checkreg(struct sam_ssc_s *priv, bool wr, uint32_t regval, + uint32_t regaddr) { if (wr == priv->wr && /* Same kind of access? */ - value == priv->regval && /* Same value? */ - address == priv->regaddr) /* Same address? */ + regval == priv->regval && /* Same value? */ + regaddr == priv->regaddr) /* Same address? */ { /* Yes, then just keep a count of the number of times we did this. */ @@ -495,9 +495,9 @@ static bool ssc_checkreg(struct sam_ssc_s *priv, bool wr, uint32_t value, /* Save information about the new access */ priv->wr = wr; - priv->regval = value; - priv->regaddr = address; - priv->count = 0; + priv->regval = regval; + priv->regaddr = regaddr; + priv->count = 0; } /* Return true if this is the first time that we have done this operation */ @@ -517,17 +517,17 @@ static bool ssc_checkreg(struct sam_ssc_s *priv, bool wr, uint32_t value, static inline uint32_t ssc_getreg(struct sam_ssc_s *priv, unsigned int offset) { - uint32_t address = priv->base + offset; - uint32_t value = getreg32(address); + uint32_t regaddr = priv->base + offset; + uint32_t regval = getreg32(regaddr); #ifdef CONFIG_SAMA5_SSC_REGDEBUG - if (ssc_checkreg(priv, false, value, address)) + if (ssc_checkreg(priv, false, regval, regaddr)) { - lldbg("%08x->%08x\n", address, value); + lldbg("%08x->%08x\n", regaddr, regval); } #endif - return value; + return regval; } /**************************************************************************** @@ -538,19 +538,19 @@ static inline uint32_t ssc_getreg(struct sam_ssc_s *priv, * ****************************************************************************/ -static inline void ssc_putreg(struct sam_ssc_s *priv, uint32_t value, - unsigned int offset) +static inline void ssc_putreg(struct sam_ssc_s *priv, unsigned int offset, + uint32_t regval) { - uint32_t address = priv->base + offset; + uint32_t regaddr = priv->base + offset; #ifdef CONFIG_SAMA5_SSC_REGDEBUG - if (ssc_checkreg(priv, true, value, address)) + if (ssc_checkreg(priv, true, regval, regaddr)) { - lldbg("%08x<-%08x\n", address, value); + lldbg("%08x<-%08x\n", regaddr, regval); } #endif - putreg32(value, address); + putreg32(regval, regaddr); } /**************************************************************************** diff --git a/nuttx/drivers/audio/i2schar.c b/nuttx/drivers/audio/i2schar.c index f7f251d7f..e3f6986b1 100644 --- a/nuttx/drivers/audio/i2schar.c +++ b/nuttx/drivers/audio/i2schar.c @@ -280,7 +280,7 @@ static ssize_t i2schar_read(FAR struct file *filep, FAR char *buffer, */ sem_post(&priv->exclsem); - return nbytes; + return sizeof(struct ap_buffer_s) + nbytes; errout_with_reference: apb_free(apb); @@ -354,7 +354,7 @@ static ssize_t i2schar_write(FAR struct file *filep, FAR const char *buffer, */ sem_post(&priv->exclsem); - return nbytes; + return sizeof(struct ap_buffer_s) + nbytes; errout_with_reference: apb_free(apb); @@ -370,7 +370,13 @@ errout_with_reference: * Name: i2schar_register * * Description: - * Create and register the i2s character driver. + * Create and register the I2S character driver. + * + * The I2S character driver is a simple character driver that supports I2S + * transfers via a read() and write(). The intent of this driver is to + * support I2S testing. It is not an audio driver but does conform to some + * of the buffer management heuristics of an audio driver. It is not + * suitable for use in any real driver application in its current form. * * Input Parameters: * i2s - An instance of the lower half I2S driver diff --git a/nuttx/include/nuttx/audio/i2s.h b/nuttx/include/nuttx/audio/i2s.h index e9addf784..ecf42f199 100644 --- a/nuttx/include/nuttx/audio/i2s.h +++ b/nuttx/include/nuttx/audio/i2s.h @@ -252,6 +252,31 @@ extern "C" * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: i2schar_register + * + * Description: + * Create and register the I2S character driver. + * + * The I2S character driver is a simple character driver that supports I2S + * transfers via a read() and write(). The intent of this driver is to + * support I2S testing. It is not an audio driver but does conform to some + * of the buffer management heuristics of an audio driver. It is not + * suitable for use in any real driver application in its current form. + * + * Input Parameters: + * i2s - An instance of the lower half I2S driver + * minor - The device minor number. The I2S character device will be + * registers as /dev/i2scharN where N is the minor number + * + * Returned Value: + * OK if the driver was successfully register; A negated errno value is + * returned on any failure. + * + ****************************************************************************/ + +int i2schar_register(FAR struct i2s_dev_s *i2s, int minor); + #undef EXTERN #if defined(__cplusplus) } |