$vincent$ 发表于 2014-1-9 14:25:18

求指教TQ2416的SPI驱动问题

TQ2416用天嵌的光盘里的3.1内核,发现里面没有添加SPI驱动,根据网上的方法修改了几个地方:
1、在mach-tq2416.c文件前面增加头文件include:
   #include <../mach-s3c2410/include/mach/spi.h>
   #include <linux/spi/spi.h>2、增加如下结构定义
   static struct spi_board_info s3c2416_spi0_board[] = {
        = {
                .modalias = "spidev",
                .bus_num = 0,
                .chip_select = 0,
                //.irq = IRQ_EINT10,
                .max_speed_hz = 500*1000,
        },
};
static struct s3c2410_spi_info s3c2416_spi0_platdata = {
        .pin_cs = S3C2410_GPL(13),
        .num_cs = 1,
        .bus_num = 0,
};
3、在tq2416_devices中增加&s3c_device_spi0,
4、在tq2416_machine_init
   s3c_device_spi0.dev.platform_data = &s3c2416_spi0_platdata;
   spi_register_board_info(s3c2416_spi0_board,ARRAY_SIZE(s3c2416_spi0_board));
5、http://www.armbbs.net/forum.php?mod=image&aid=7534&size=300x300&key=3172e636f2f18959&nocache=yes&type=fixnone
6、编译模块,在板上加载:insmod spi_bitbang.ko spi_s3c24xx.ko spidev.ko
使用内核源码中的Documents/spi目录下测试程序测试时,没有输出,而且程序会崩溃http://www.armbbs.net/forum.php?mod=image&aid=7535&size=300x300&key=191e618ef1c51c26&nocache=yes&type=fixnone
用示波器看过,MISO\MOSI\SCLK都没有波形输出,求大侠指教{:5_322:}

TQ-ZQL 发表于 2014-1-10 17:09:13

static struct spi_gpio_platform_data spi_gpio_cfg = {
        .sck                = S3C2410_GPX(X), //以下都是按实际来
        .mosi                = S3C2410_GPA(1),
        .miso                = S3C2410_GPG(6),
};

static struct platform_device tq2416_spi = {
        .name                = "spi-gpio",//不可以改名,一定要用这个
        .id                = 1,
        .dev.platform_data = &spi_gpio_cfg,
};

然后再注册平台设备就可。

$vincent$ 发表于 2014-1-11 16:18:37

本帖最后由 $vincent$ 于 2014-1-13 16:06 编辑

TQ-ZQL 发表于 2014-1-10 17:09
static struct spi_gpio_platform_data spi_gpio_cfg = {
      .sck                = S3C2410_GPX(X), //以下都是按实际来
...
按照你说的在mach-tq2416.c中加入
static struct spi_gpio_platform_data spi_gpio_cfg = {
      .sck                = S3C2410_GPE(13), //以下都是按实际来
      .mosi                = S3C2410_GPE(12),
      .miso                = S3C2410_GPE(11),
};

static struct platform_device tq2416_spi = {
      .name                = "spi-gpio",//不可以改名,一定要用这个
      .id                = 1,
      .dev.platform_data = &spi_gpio_cfg,
};
在static struct platform_device *tq2416_devices[] __initdata中加入&tq2416_spi
编译后insmod spi-gpio.ko时出现错误 insmod: can't insert 'spi-gpio.ko': No such device
platform_device 的名字与驱动名字是一样,求大神解答,是什么原因?{:5_322:}

ubuntu1204 发表于 2014-1-13 14:31:39

lz解决了没? /dev下一直没有spi设备信息{:2_135:}

TQ-ZQL 发表于 2014-1-13 14:38:06

看不到你的图      

亚瑟王 发表于 2014-1-13 14:50:26

你还需要开启SPI的时钟的分频才行(即CLKSRC寄存器)。

ubuntu1204 发表于 2014-1-13 15:13:18

亚瑟王 发表于 2014-1-13 14:50
你还需要开启SPI的时钟的分频才行(即CLKSRC寄存器)。

正解,
看到提示“s3c2416-spi.0: No clock for device
s3c2416-spi: probe of s3c2416-spi.0 failed with error -2
”,{:5_322:}CLKSRC在哪个文件里啊?

亚瑟王 发表于 2014-1-13 15:27:13

ubuntu1204 发表于 2014-1-13 15:13
正解,
看到提示“s3c2416-spi.0: No clock for device
s3c2416-spi: probe of s3c2416-spi.0 failed w ...

在arch/arm/mach-s3c2416目录下有关于时钟配置的文件,在里面模仿别的外设的时钟进行配置即可。

ubuntu1204 发表于 2014-1-13 15:49:40

亚瑟王 发表于 2014-1-13 15:27
在arch/arm/mach-s3c2416目录下有关于时钟配置的文件,在里面模仿别的外设的时钟进行配置即可。

哦,知道亚瑟王的意思,但是还是不会改。。貌似要改plat-s3c24xx/s3c2443-clock.c   {:5_332:}

亚瑟王 发表于 2014-1-13 17:04:36

ubuntu1204 发表于 2014-1-13 15:49
哦,知道亚瑟王的意思,但是还是不会改。。貌似要改plat-s3c24xx/s3c2443-clock.c

模仿IIC、SDIO之类的时钟做相关修改即可。

$vincent$ 发表于 2014-1-14 17:19:33

本帖最后由 $vincent$ 于 2014-1-14 17:21 编辑

亚瑟王 发表于 2014-1-13 14:50
你还需要开启SPI的时钟的分频才行(即CLKSRC寄存器)。我追踪了一下,发现加载模块时运行到platform_driver_probe(&spi_gpio_driver, spi_gpio_probe)里面 int __init_or_module platform_driver_probe(struct platform_driver *drv,int (*probe)(struct platform_device *)){
      int retval, code;

      /* make sure driver won't have bind/unbind attributes */
      drv->driver.suppress_bind_attrs = true;

      /* temporary section violation during probe() */
      drv->probe = probe;
      retval = code = platform_driver_register(drv);

      /*
         * Fixup that section violation, being paranoid about code scanning
         * the list of drivers in order to probe new devices.Check to see
         * if the probe was successful, and make sure any forced probes of
         * new devices fail.
         */
      spin_lock(&drv->driver.bus->p->klist_drivers.k_lock);
      drv->probe = NULL;
      if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
                retval = -ENODEV;
      drv->driver.probe = platform_drv_probe_fail;
      spin_unlock(&drv->driver.bus->p->klist_drivers.k_lock);

      if (code != retval)
                platform_driver_unregister(drv);
      return retval;
}
在      if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
                retval = -ENODEV;


返回了ENODEV导致出现insmod: can't insert 'spi-gpio.ko': No such device,这是时钟的问题吗?求解决{:2_135:}



亚瑟王 发表于 2014-1-15 10:11:52

$vincent$ 发表于 2014-1-14 17:19
我追踪了一下,发现加载模块时运行到platform_driver_probe(&spi_gpio_driver, spi_gpio_probe)里面 int __ ...

向上检查一下spi注册或spin_lock吧。

ubuntu1204 发表于 2014-1-16 15:54:46

亚瑟王 发表于 2014-1-13 17:04
模仿IIC、SDIO之类的时钟做相关修改即可。

亚瑟王,直接操作寄存器还是提示“No clock .....”

先按照亚瑟的意思添加
static struct clk spi0_clk = {
        .name                = "spi0",
        .devname        = "s3c-spi.0",
        .parent                = &clk_p,
        .enable                = s3c2443_clkcon_enable_p,
        .ctrlbit        = (1<<6),
};
.......
不成功。{:5_347:}

又试了下直接/mach-s3c2416/clock.c 里,s3c2416_init_clocks函数最下面添加

*(volatile unsigned int __force   *)(0xf6100020) &= ~(1<<18);
*(volatile unsigned int __force   *)(0xf6100024) |=(3<<24);
*(volatile unsigned int __force   *)(0xf6100034) |=(1<<6);
还是不成功{:5_330:},到底哪里不对啊,阿瑟

亚瑟王 发表于 2014-1-17 10:19:52

ubuntu1204 发表于 2014-1-16 15:54
亚瑟王,直接操作寄存器还是提示“No clock .....”

先按照亚瑟的意思添加


在arch/arm/plat-s3c24xx/s3c2443-clock.c的init_clocks中模仿别的外设做相关初始化就可以了。

ubuntu1204 发表于 2014-1-17 10:57:03

亚瑟王 发表于 2014-1-17 10:19
在arch/arm/plat-s3c24xx/s3c2443-clock.c的init_clocks中模仿别的外设做相关初始化就可以了。

就是这样试了,不行啊,肯定自己哪里没搞对。
/mach-s3c2416/clock.c

static struct clk spi0_clk = {
        .name                = "spi",
        .devname        = "s3c-spi.0",
        .parent                = &clk_p,
        .enable                = s3c2443_clkcon_enable_p,
        .ctrlbit        = (1<<6),
};
void __init s3c2416_init_clocks(int xtal)
{
        u32 epllcon = __raw_readl(S3C2443_EPLLCON);
        u32 epllcon1 = __raw_readl(S3C2443_EPLLCON+4);
        int ptr;

        /* s3c2416 EPLL compatible with s3c64xx */
        clk_epll.rate = s3c_get_pll6553x(xtal, epllcon, epllcon1);

        clk_epll.parent = &clk_epllref.clk;

        s3c2443_common_init_clocks(xtal, s3c2416_get_pll, s3c2416_fclk_div);

        for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
                s3c_register_clksrc(clksrcs, 1);

        s3c24xx_register_clock(&hsmmc0_clk);
        s3c24xx_register_clock(&spi0_clk);       
                s3c_pwmclk_init();

}

以上应该是把 PCLKCON 寄存器里的SPI_HS_0位 置1, 那SPI的配置寄存器应该也要设置吧?在哪里设置?SPI_s3c24xx.c?就如SPI的Clk_CFG (0x52000004)   ,断断续续搞了老久了,还没ok,麻烦亚瑟了{:5_322:}
页: [1] 2
查看完整版本: 求指教TQ2416的SPI驱动问题