This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Error in enabling SPI1 of OMAPL137 EVM board

Other Parts Discussed in Thread: DA8XX

HI,

I am using EVM OMAPL137 board & Linux.

EVM OMAPL137 has two SPI peripheral.

SPI0 of EVM board is used for SPI0 Flash & in the kernel for OMAPL137 only SPI0 is defined

But in our application we require SPI1 also.

So in kernel files I have made some changes as given below

In board-da830-evm.c following lines are added

{

  static struct spi_board_info da830_spi_board_info1[] = {
    [0] = {
        .modalias = "spidev",
        //.platform_data = &spi_flash_data,
        .mode = SPI_MODE_0,
        .max_speed_hz = 50000000,       // max sample rate at 3V
        .bus_num = 1,
        .chip_select = 0,
    },
  };

////////////////////////////////////////////////// the lines given below are added in da830_evm_init(void) function ////////////////////////////////////

  ret = da8xx_pinmux_setup(da830_spi1_pins);
    if (ret)
        pr_warning("da830_evm_init: spi1 mux setup failed: %d\n",
                ret);
   
    da830_init_spi1(BIT(0), da830_spi_board_info1,
            ARRAY_SIZE(da830_spi_board_info1));

}

In device-da8xx.c following lines are added

{

   static struct davinci_spi_platform_data da830_spi1_pdata = {
    .version     = SPI_VERSION_2,
    .num_chipselect = 1,
    .wdelay        = 0,
    .odd_parity    = 0,
    .parity_enable    = 0,
    .wait_enable    = 0,
    .timer_disable  = 0,
    .clk_internal    = 1,
    .cs_hold    = 1,
    .intr_level    = 0,
    .poll_mode    = 1,
    .use_dma    = 0,
    .c2tdelay    = 8,
    .t2cdelay    = 8,
 };

 static struct resource da830_spi1_resources[] = {
    [0] = {
        .start = 0x01E12000,
        .end = 0x01E12000 + 0xfff,
        .flags = IORESOURCE_MEM,
    },
    [1] = {
        .start = IRQ_DA8XX_SPINT1,
        .end = IRQ_DA8XX_SPINT1,
        .flags = IORESOURCE_IRQ,
    },
    [2] = {
        .start = EDMA_CTLR_CHAN(0, 14),
        .end = EDMA_CTLR_CHAN(0, 14),
        .flags = IORESOURCE_DMA,
    },
    [3] = {
        .start = EDMA_CTLR_CHAN(0, 15),
        .end = EDMA_CTLR_CHAN(0, 15),
        .flags = IORESOURCE_DMA,
    },
    [4] = {
        .start = 1,
        .end = 1,
        .flags = IORESOURCE_DMA,
     },
   };

    static struct platform_device da830_spi1_device = {
    .name = "spi_davinciHA",
    .id = 1,
    .resource = da830_spi1_resources,
    .num_resources = ARRAY_SIZE(da830_spi1_resources),
    .dev = {
        .platform_data = &da830_spi1_pdata,
     },
   };

    void __init da830_init_spi1(unsigned chipselect_mask,
        struct spi_board_info *info, unsigned len)
    {
    spi_register_board_info(info, len);

    platform_device_register(&da830_spi1_device);
   }

}

& In the kernel configuration I have kept CONFIG_SPI_SPIDEV=y so that I can have user space access of the SPI1

The above given changes in the kernel compiles properly but I am not able to open the given device.

In the sys file I am able to see spidev devices as show below

root@arago:/sys# ls -R | grep spi
spi
spi_davinci.0
spi_davinciHA.1
spi_davinci
./bus/platform/drivers/spi_davinci:
spi_davinci.0
./bus/spi:
./bus/spi/devices:
spi0.0
./bus/spi/drivers:
spidev
./bus/spi/drivers/m25p80:
spi0.0
./bus/spi/drivers/spidev:
spi_master
spidev
./class/spi_master:
spi0
./class/spidev:
spi_davinci.0
spi_davinciHA.1
./devices/platform/spi_davinci.0:
spi0.0
spi_master
./devices/platform/spi_davinci.0/spi0.0:
./devices/platform/spi_davinci.0/spi0.0/mtd:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd0:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd0/mtdblock0:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd0/mtdblock0/holders:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd0/mtdblock0/queue:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd0/mtdblock0/queue/iosched:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd0/mtdblock0/slaves:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd0ro:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd1:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd1/mtdblock1:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd1/mtdblock1/holders:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd1/mtdblock1/queue:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd1/mtdblock1/queue/iosched:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd1/mtdblock1/slaves:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd1ro:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd2:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd2/mtdblock2:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd2/mtdblock2/holders:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd2/mtdblock2/queue:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd2/mtdblock2/queue/iosched:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd2/mtdblock2/slaves:
./devices/platform/spi_davinci.0/spi0.0/mtd/mtd2ro:
./devices/platform/spi_davinci.0/spi_master:
spi0
./devices/platform/spi_davinci.0/spi_master/spi0:
./devices/platform/spi_davinciHA.1:
spidev
./module/spidev:
./module/spidev/parameters:

but in /dev/ no spidev or spidev1.0 file is present

so when I use ./spidev_test -D /dev/spidev it gives error cannot open device.

Can anyone tell me what SPI1 configuration I am missing

Thanks & Regards

Jitendra

 

 

 

 

 

 

 

 

 

  • Hi Jitendra,

     

    Please try out the pin mux utility to ensure both SPIs can be used simlutaneosuly for your product needs.And post the finding.

     

    Hello Sitara/OMAPL Champs,

     

    Could you please help on this query with any other insights.

     

     

    Best Regards

    Feroz

     

  • Hello,

    Can you please specify which verision of kernel or PSP/SDK release you are using?

    Jitendra Jagasia said:
        static struct platform_device da830_spi1_device = {
        .name = "spi_davinciHA",
        .id = 1,

    Why is the name called "spi_davinciHA"? This should match with the name of the driver.

    Also, have you already looked at this post with a similar question? http://e2e.ti.com/support/embedded/f/354/p/74188/334209.aspx#334209

    Thanks,

    Sekhar

  • Hello Sekhar,

    I was able to make SPI1 working , The issue was the pin mux of uart2 & spi1 were clashing.

    But Now the issue is that according to our application requirement we want multiple chip select.

    So can any provide me some example of how to use multiple GPIO as a chip select for spi1 in OMAPL137 & what necessary changes are to be done in the spi drivers side.

    According to your response on GPIO as the SPI chip select, I followed the link  http://processors.wiki.ti.com/index.php/MontaVista_Linux_SPI_Driver#Porting_for_custom_hardware

    But according to that link chip_sel[n] array has to be defined in da830_spi1_pdata but da830_spi1_pdata is defined from structure static struct davinci_spi_platform_data,

    struct davinci_spi_platform_data which is defined in mach/spi.h does not define chip_sel[n] array. So addition of chip_sel[n] will require changes in davinci spi driver [ davinci_spi.c ]

    & I am currently using PSP version of DaVinci-PSP-SDK-03.20.00.12 & the above reference is for MontaVista Linux.

    So what changes might be required for multiple chip select in SPI ?

    Please Revert back for above query.

    Thanks for your reply.

    Regards

    Jitendra