0

J'utilise une carte de développement de samsung s5p6818 soc. Après avoir choisi "le mode utilisateur spi" "SLSI SPI PORT0" sur menuconfig, et en ajoutant ce code dans plate- s5p6818/drone/device.c,Comment faire spidev.c fonctionne sur samsung s5p6818/Android5.1

/*------------------------------------------------------------------------------ 
* 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)); 
/*--------------------------------------------------------------------------*/ 

je peux trouver "spidev0.0" dans/dev lorsque Android le système fonctionne sur ma carte. Cependant, ce périphérique ne fonctionne pas lorsque j'utilise un programme de test appelant la fonction lecture/écriture et provoque le redémarrage de mon système (la fonction "open", "ioctl" peut fonctionner correctement). Voici mon code de test

#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); 
     } 
} 

Voici mon journal de débogage log

Je pense que cela est parce que je l'ai fait correctement GPIO pas config, mais je ne sais pas comment et où config broches GPIO. J'espère que quelqu'un peut m'apprendre comment rendre cela correct.

Répondre

0

Vous pouvez définir la fonction gpio dans plat-s5p6818/drone/include/cfg_gpio.h pour des exemples, vérifiez comment l'interface de bus i2c est définie pour votre voûte.