Linux Spi驱动移植小结

Posted applecai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Spi驱动移植小结相关的知识,希望对你有一定的参考价值。

2012-01-07 22:21:29

  效果图:

 技术图片

 

理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了。

1,  make menuconfig添加spi配置 

2,platform_driver及platform_device数据结构都有了。于是在mach-tq2440.c中tq2440_devices[]结构添加里         &s3c_device_spi1,//by apple

3,接着开始make zImage。

出错,发现串口信息显示

<3>s3c2410-spi s3c2410-spi.1: No platform data supplied

s3c2410-spi: probe of s3c2410-spi.1 failed with error -2

于是查看源代码如下。

    hw->master = spi_master_get(master);

    hw->pdata = pdata = pdev->dev.platform_data;

    hw->dev = &pdev->dev;

 

    if (pdata == NULL) {

             dev_err(&pdev->dev, "No platform data supplied\\n");

             err = -ENOENT;

             goto err_no_pdata;

       }

说明s3c24xx_spi_probe函数中的pdev->dev.platform_data没有赋值。

Pdata到底应该赋什么值呢?继续从代码中找线索

    master->num_chipselect = hw->pdata->num_cs;

    master->bus_num = pdata->bus_num;

搜索了下num_cs及bus_num都是属于s3c2410_spi_info结构的。于是乎,之前网上也查找过相关移植。需要加s3c2410_spi_info结构的数据。于是在devs.c中添加如下代码。

//add by apple

#include <mach/spi.h>

#include <mach/regs-gpio.h>

 

//add by apple

static struct s3c2410_spi_info s3c2410_spi1_platdata = {

        .pin_cs = S3C2410_GPG3,

        .num_cs = 1,

        .bus_num = 0,

};

 

struct platform_device s3c_device_spi1 = {

    .name                  = "s3c2410-spi",

    .id                = 1,

    .num_resources         = ARRAY_SIZE(s3c_spi1_resource),

    .resource   = s3c_spi1_resource,

        .dev              = {

                .dma_mask = &s3c_device_spi1_dmamask,

                .coherent_dma_mask = 0xffffffffUL,

                                .platform_data = & s3c2410_spi1_platdata,  //add by apple

        }

};

4,重新make zImage,下载后,串口没有提示任何spi的信息。于是下载文件系统。在sys/bus/platform/device看到了spi的设备文件信息。但是/dev下确实没有spi设备信息。

5,编译了spidev_test.c

方法如下:技术图片

修改头文件#include <linux/spi/spidev.h>为

#include </study/opt/EmbedSky/linux-2.6.30.4/include/linux/spi/spidev.h>

于是保存退出,执行arm-linux-gcc spidev_test.c -o spidev_test命令即可产生一个spidev_test的可执行文件。从linux虚拟中Copy到PC上。当然也可以用如下方法

arm-linux-gcc –I /study/opt/EmbedSky/linux-2.6.30.4/include spidev_test.c -o spidev_test就不用修改头文件路径了。

6,copy到文件系统。通过“传输”->“zmodem上传列表”中选spidev_test后点击“确定”,启动开发板,进入sbin文件夹或其他文件夹后,选中“传输”->“开始上传zmodem列表”即可完成上传文件至开发板了。然后需要用命令chmod 777 spidev_test来修改权限。

7,./spidev_test即可执行测试程序。果然显示出错。

can‘t open device: No such file or directory

Aborted

8,再来,我做了如下修改,把spi设备及平台都添加了。

A, 在tq2440_machine_init函数中,添加

spi_register_board_info(s3c2410_spi1_board, ARRAY_SIZE(s3c2410_spi1_board));//by apple

     s3c24xx_fb_set_platdata(&tq2440_fb_info);

B, 在mach-tq2440.c中添加数据

static struct spi_board_info s3c2410_spi1_board[] = {

        [0] = {

                 .modalias = "spidev",

                .bus_num        = 1,

                .chip_select        = 0,

                .irq = IRQ_EINT9,

                .max_speed_hz         = 500*1000,

        },

};

C, 添加头文件

#include <linux/spi/spi.h>

#include <mach/spi.h>

D, 把devs.c中的.bus_num统一改成1

E,  编译make zImage 通过。烧录到开发板。

9,查看/dev文件夹下信息。有了是spidev1.0

10,下载并运行spidev_test测试程序。但是同样显示

can‘t open device: No such file or directory

Aborted

怎么可能呢?我的dev下都找到设备号了呀!于是再看源码中有提示,默认的设备是/dev/spidev1.1.所以我该了下-D参数。Linux下Spi驱动回路测试成功!

 

以上是关于Linux Spi驱动移植小结的主要内容,如果未能解决你的问题,请参考以下文章

uboot移植spi驱动

SPI在linux3.14.78 FS_S5PC100(Cortex A8)和S3C2440上驱动移植(deep dive)

华为云技术分享小熊派华为物联网操作系统LiteOS裸机驱动移植02-LCD驱动移植及使用

CH9434 嵌入式Linux与安卓系统驱动移植和使用教程

基于海思3520DV400移植 WK2168驱动

嵌入式开发值zynq---zynq中tlv320aic23b spi的驱动移植