求指教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:}
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-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:}
lz解决了没? /dev下一直没有spi设备信息{:2_135:} 看不到你的图 你还需要开启SPI的时钟的分频才行(即CLKSRC寄存器)。 亚瑟王 发表于 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在哪个文件里啊? 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目录下有关于时钟配置的文件,在里面模仿别的外设的时钟进行配置即可。 亚瑟王 发表于 2014-1-13 15:27
在arch/arm/mach-s3c2416目录下有关于时钟配置的文件,在里面模仿别的外设的时钟进行配置即可。
哦,知道亚瑟王的意思,但是还是不会改。。貌似要改plat-s3c24xx/s3c2443-clock.c {:5_332:} ubuntu1204 发表于 2014-1-13 15:49
哦,知道亚瑟王的意思,但是还是不会改。。貌似要改plat-s3c24xx/s3c2443-clock.c
模仿IIC、SDIO之类的时钟做相关修改即可。 本帖最后由 $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:}
$vincent$ 发表于 2014-1-14 17:19
我追踪了一下,发现加载模块时运行到platform_driver_probe(&spi_gpio_driver, spi_gpio_probe)里面 int __ ...
向上检查一下spi注册或spin_lock吧。 亚瑟王 发表于 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:},到底哪里不对啊,阿瑟 ubuntu1204 发表于 2014-1-16 15:54
亚瑟王,直接操作寄存器还是提示“No clock .....”
先按照亚瑟的意思添加
在arch/arm/plat-s3c24xx/s3c2443-clock.c的init_clocks中模仿别的外设做相关初始化就可以了。 亚瑟王 发表于 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