Hi,

  We are using beagleboard xm in our project - we have configure our board 
for SPI4.0,also configured GPIO pin 16 as irq pin , 
  The problem with this code is if we try to read  spidev4.0 by giving 
command as root@beagleboard:~# cat < /dev/spidev4.0 
   it  remains in read mode and reads the following data contineously.

                   [  764.107574] read-8 00
                   [  764.110321] read-8 00
                   [  764.112579] read-8 00
                   [  764.114868] read-8 00
                   [  764.117340] read-8 00
                   [  764.119628] read-8 00
                   [  764.121917] read-8 00
                   [  764.124389] read-8 00
 

 Any suggestions to come out from this infinite loop from spi read 

  
********************************************************************************************
 
CODE  
********************************************************************************************

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

PATH => vim arch/arm/mach-omap2/board-omap3beagle.c

 

#define OMAP3BEAGLE_GPIO_GS_IRQ 16  /* Pin No. 16 (GPIO) is converted into 
irq */


static void __init omap3_beagle_config_mcspi4_mux(void)
{
        omap_mux_init_signal("mcbsp1_clkr.mcspi4_clk", OMAP_PIN_INPUT);
        omap_mux_init_signal("mcbsp1_fsx.mcspi4_cs0", OMAP_PIN_OUTPUT);
        omap_mux_init_signal("mcbsp1_dx.mcspi4_simo", OMAP_PIN_OUTPUT);
        omap_mux_init_signal("mcbsp1_dr.mcspi4_somi", 
OMAP_PIN_INPUT_PULLUP);
        omap_mux_init_signal("etk_d2.gpio_16", OMAP_PIN_INPUT);
        omap_mux_init_signal("etk_d1.gpio_15", OMAP_PIN_INPUT);
}

static struct spi_board_info beagle_mcspi_board_info[] __initdata = {
        // spi 4.0
        {
                .modalias       = "spidev",
                .max_speed_hz   = 1000000, //1MHz
                .bus_num        = 4,
                .chip_select    = 0,
                .mode = SPI_MODE_1,
                .irq            = OMAP_GPIO_IRQ(OMAP3BEAGLE_GPIO_GS_IRQ),
                .controller_data = &beagle_mcspi_config,
        },
};

static void __init omap3beagle_gs_init(void)
{
        if ((gpio_request(OMAP3BEAGLE_GPIO_GS_IRQ, "GS_IRQ") == 0) &&
            (gpio_direction_input(OMAP3BEAGLE_GPIO_GS_IRQ) == 0)) {
                gpio_export(OMAP3BEAGLE_GPIO_GS_IRQ, 0);
                beagle_mcspi_board_info[0].irq  = 
OMAP_GPIO_IRQ(OMAP3BEAGLE_GPIO_GS_IRQ);
                set_irq_type(beagle_mcspi_board_info[0].irq, 
IRQ_TYPE_EDGE_BOTH);

                printk(KERN_INFO "OMAP3BEAGLE_GPIO_GS_IRQ..... registered 
....\n");

        } else {
                printk(KERN_ERR "could not obtain gpio for GS_IRQ\n");
                return;
        }
        spi_register_board_info(beagle_mcspi_board_info,
                        ARRAY_SIZE(beagle_mcspi_board_info));
}

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

static unsigned
omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
{
    

        if (word_len <= 8) {
                u8              *rx;
                const u8        *tx;

                rx = xfer->rx_buf;
                tx = xfer->tx_buf;

                do {
                        c -= 1;
                        if (tx != NULL) {
                                if (mcspi_wait_for_reg_bit(chstat_reg,
                                                OMAP2_MCSPI_CHSTAT_TXS) < 
0) {
                                        dev_err(&spi->dev, "TXS timed 
out\n");
                                        goto out;
                                }
#ifdef DBG_PRINT
                                printk(KERN_INFO "write-%d %02x\n", 
word_len, *tx);
#endif
#ifdef VERBOSE
                                dev_dbg(&spi->dev, "write-%d %02x\n",
                                                word_len, *tx);
#endif
                                __raw_writel(*tx++, tx_reg);
                        }
                        if (rx != NULL) {
                                if (mcspi_wait_for_reg_bit(chstat_reg,
                                                OMAP2_MCSPI_CHSTAT_RXS) < 
0) {
                                        dev_err(&spi->dev, "RXS timed 
out\n");
                                        goto out;
                                }
                                /* prevent last RX_ONLY read from triggering
                                 * more word i/o: switch to rx+tx
                                 */
                                if (c == 0 && tx == NULL)
                                        mcspi_write_chconf0(spi, l);
                                *rx++ = __raw_readl(rx_reg);
#ifdef VERBOSE
                                dev_dbg(&spi->dev, "read-%d %02x\n",
                                                word_len, *(rx - 1));
#endif

#ifdef DBG_PRINT
                                printk(KERN_INFO "read-%d %02x\n", 
word_len, *(rx - 1));
#endif
 

}

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to