如何让spidev.c在samsung s5p6818 / Android5.1上运行

时间:2016-03-23 03:30:15

标签: android linux-kernel linux-device-driver embedded-linux bsd

我正在使用samsung s5p6818 soc的开发板。选择"用户模式spi"" SLSI SPI port0"在menuconfig上,并在plat-s5p6818 / drone / device.c中添加这些代码,

/*------------------------------------------------------------------------------
 * SSP/SPI
 */
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
#include <linux/spi/spi.h>
#include <linux/gpio.h>
#include <mach/slsi-spi.h>


static struct s3c64xx_spi_csinfo spi0_csi[] = {
    [0] = {
        .line = CFG_SPI0_CS,
        .set_level  = gpio_set_value,
        .fb_delay   = 0x2,
    },
};

static struct spi_board_info spi_plat_board[] __initdata = {
    [0] = {
        .modalias        = "spidev",    /* fixup */
        .max_speed_hz    = 3125000,     /* max spi clock (SCK) speed in HZ */
        .bus_num         = 0,           /* Note> set bus num, must be smaller than ARRAY_SIZE(spi_plat_device) */
        .chip_select     = 0,           /* Note> set chip select num, must be smaller than spi cs_num */
        .controller_data = &spi0_csi[0],//spi0_info,
        .mode            = SPI_MODE_3 | SPI_CPOL | SPI_CPHA,
    },
};

#endif
spi_register_board_info(spi_plat_board,ARRAY_SIZE(spi_plat_board));
/*--------------------------------------------------------------------------*/

我可以找到&#34; spidev0.0&#34;在我的主板上运行Android系统的/ dev中。但是,当我使用调用函数读/写的测试程序并使我的系统重启(功能&#34;打开&#34;,&#34; ioctl&#34;可以工作)时,此设备无法正常工作正确)。这是我的测试代码

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/ioctl.h>

#define SPI_IOC_MAGIC 'k'

#define SPI_CPHA 0x01
#define SPI_CPOL 0x02

#define SPI_MODE_0 (0|0)
#define SPI_MODE_1 (0|SPI_CPHA)
#define SPI_MODE_2 (SPI_CPOL|0)
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)

typedef unsigned char __u8;
typedef unsigned int __u32;

/* Read / Write of SPI mode (SPI_MODE_0..SPI_MODE_3) */
#define SPI_IOC_RD_MODE         _IOR(SPI_IOC_MAGIC, 1, __u8)
#define SPI_IOC_WR_MODE         _IOW(SPI_IOC_MAGIC, 1, __u8)

/* Read / Write SPI bit justification */
#define SPI_IOC_RD_LSB_FIRST        _IOR(SPI_IOC_MAGIC, 2, __u8)
#define SPI_IOC_WR_LSB_FIRST        _IOW(SPI_IOC_MAGIC, 2, __u8)

/* Read / Write SPI device word length (1..N) */
#define SPI_IOC_RD_BITS_PER_WORD    _IOR(SPI_IOC_MAGIC, 3, __u8)
#define SPI_IOC_WR_BITS_PER_WORD    _IOW(SPI_IOC_MAGIC, 3, __u8)

/* Read / Write SPI device default max speed hz */
#define SPI_IOC_RD_MAX_SPEED_HZ     _IOR(SPI_IOC_MAGIC, 4, __u32)
#define SPI_IOC_WR_MAX_SPEED_HZ     _IOW(SPI_IOC_MAGIC, 4, __u32)

static int fd = 0;
int main(void)
{
        //  int fd = -1;
        int buf[1000];
        int i = 0;
        fd = open("/dev/spidev0.0", O_RDWR);
        if(fd < 0){
                printf("open /dev/spidev0.0 error!!!\n");
        }
        printf("-------------===============------------fd=%d\n",fd);
        spi_init();
        for (i=0;i<1000;i++)
        {
                buf[i]=0x33333333;
        }
        for(i=0;i<20;i++)
        { write(fd,buf,1000*4);
        }



        return 0;
}
void spi_init(void){
        int ret = 0;
        int speed = 2*1000*1000;
        int delay;
        unsigned char bits = 32;
        unsigned char mode = SPI_MODE_1;

        ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
        if(ret == -1){
                printf("can't set spi mode\n");
        }else{
                printf("set spi mode %d\n",ret);
        }
        ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
        if(ret == -1){
                printf("can't get spi mode\n");
        }else{
                printf("get spi mode %d\n",ret);
        }
        ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
        if(ret == -1){       
                printf("can't set bits per word\n");         
        }else{                
                printf("set bits per word %d\n",ret);
        }  
        ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
        if(ret == -1){       
                printf("can't get bits per word\n");         
        }else{                
                printf(" get bits per word %d\n",ret);
        }  
        ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
        if(ret == -1){       
                printf("can't set max speed hz\n");         
        }else{                
                printf("set max speed hz %d\n",ret);
        }  
        ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
        if(ret == -1){       
                printf("can't get max speed hz\n");         
        }else{                
                printf("get max speed hz %d\n",ret);
        }  
}

这是我的调试日志log

我认为这是因为我没有正确配置gpio,但我不知道如何以及在何处配置gpio引脚。我希望有人可以教我如何做到这一点。

1 个答案:

答案 0 :(得分:0)

您可以在 plat-s5p6818 / drone / include / cfg_gpio.h 中设置gpio功能,例如检查如何为您的拱门定义i2c总线接口。