天嵌 ARM开发社区

 找回密码
 注册
查看: 7000|回复: 17

求指教TQ2416的SPI驱动问题

[复制链接]
$vincent$ 发表于 2014-1-9 14:25:18 | 显示全部楼层 |阅读模式
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[] = {
        [0] = {
                .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、
6、编译模块,在板上加载:insmod spi_bitbang.ko spi_s3c24xx.ko spidev.ko
使用内核源码中的Documents/spi目录下测试程序测试时,没有输出,而且程序会崩溃
用示波器看过,MISO\MOSI\SCLK都没有波形输出,求大侠指教

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
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 的名字与驱动名字是一样,求大神解答,是什么原因?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
ubuntu1204 发表于 2014-1-13 14:31:39 | 显示全部楼层
lz解决了没? /dev下一直没有spi设备信息
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
”,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   
亚瑟王 发表于 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,这是时钟的问题吗?求解决



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
亚瑟王 发表于 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),
};
.......
不成功。

又试了下直接/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);
还是不成功,到底哪里不对啊,阿瑟
亚瑟王 发表于 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[ptr], 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,麻烦亚瑟了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-5 13:59 , Processed in 1.046875 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表