0

Ich bin mit einem Entwicklungsboard von Samsung S5P6818 Soc. Nach der Auswahl "Benutzermodus spi" "SLSI SPI port0 spidev0.0" in/dev "auf menuconfig, und das Hinzufügen dieser Code in plat-s5p6818/Drohne/device.c,Wie spidev.c Arbeit auf 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)); 
/*--------------------------------------------------------------------------*/ 

finde ich", wenn Android System läuft auf meinem Board. Dieses Gerät funktioniert jedoch nicht, wenn ich ein Testprogramm verwende, das die Funktion read/write aufruft und mein System neu startet (Funktion "open", "ioctl" kann richtig funktionieren). Hier ist mein Testcode

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

Hier ist mein Debug-Protokoll log

Ich denke, das ist, weil ich nicht Config gpio richtig gemacht, aber ich weiß nicht, wie und wo GPIO-Pins config. Ich hoffe, jemand kann mir beibringen, wie man das richtig macht.

Antwort

0

Sie können die GPIO-Funktion in plat-s5p6818/drone/include/cfg_gpio.h für Beispiele überprüfen, wie i2c-Bus-Schnittstelle für Ihren Bogen definiert ist.