2017-11-06 14 views
0

지금 나는 Cadence SPI 드라이버를 사용하여 Linux에서 몇 가지 기본적인 읽기 및 쓰기 작업을 수행하려고합니다. 필자는 방금 I2C 드라이버를 사용했지만,이 모든 드라이버가 어떻게 서로 맞는지, 그리고 모두가 준수하는 일반 인터페이스가 있는지에 관해서는 다소 혼란 스럽습니다. 여기 사용자 공간 프로그램/SPI 응용 프로그램에 드라이버 포함

내가 I2C 드라이버

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <inttypes.h> 

#include <errno.h> 
#include <string.h> 

#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

#include <linux/i2c.h> 
#include <linux/i2c-dev.h> 
#include <sys/ioctl.h> 

#define I2C_ADAPTER     "/dev/i2c-0" 
#define I2C_SWITHC_MUX_ADDRESS  0x74 
#define DEVICE_ADDRESS    0x54 


int main (int argc, char *argv[]) 
{ 
    int file; 

    uint8_t reg, value; 

    char *end; 

    /* Take a value to write */ 

    printf("The device address on the bus: %d", DEVICE_ADDRESS); 

    if(argc == 2) { 
     value = strtol(argv[1], &end, 16); 
     printf("value to write is: %d\n", value); 
    } 
    else { 
     printf("arg failed\n\n."); 
    } 


    if((file = open(I2C_ADAPTER, O_RDWR)) < 0) { 
     printf("Failed to open the bus\n"); 
     return -1; 
    } 

    if(ioctl(file, I2C_SLAVE_FORCE, I2C_SWITHC_MUX_ADDRESS) < 0) { 
     printf("Unable to open device as slave \n%s\n", strerror(errno)); 
     return -1; 
    } 

    char buf[10]; 

    reg = DEVICE_ADDRESS; 

    buf[0] = reg; 
    buf[1] = value; 

    if(write(file, buf, 2) != 2) { 
     printf("Failed to write to bus %s.\n\n", strerror(errno)); 
    } 
    else { 
     printf("Successful write\n"); 
     printf(buf); 
     printf("\n\n"); 
    } 

    if(read(file, buf, 1) != 1) { 
     printf("Failed to read from the i2c bus.\n %s\n\n", strerror(errno)); 
    } 
    else { 
     printf("Successful read\n"); 
     printf("Buf = [%02u]\n", buf[0]); 
     printf("\n\n"); 
    } 

    return 0; 
} 

내가 드라이버가 실제로 호출되는 경우에 같은 혼란 스러워요을 사용하여 작성한 코드입니다. 지금은 여기에 SPI 드라이버 문서를 읽고있다 :

https://www.kernel.org/doc/html/v4.11/driver-api/spi.html

는 I2C 드라이버의 해당 문서 위치 : 매우 먼저 I2C 문서에 정의 된 구조체

https://www.kernel.org/doc/html/v4.11/driver-api/i2c.html

는 i2c_driver입니다. 내 I2C 프로그램을 작성할 때 I2C 드라이버 문서에 정의 된 구조체를 사용했다고 생각하지 않습니다. I2C Cadence 드라이버를 실제로 사용 했습니까? 그렇지 않다면 어떻게 내 프로그램을 I2C Cadence 드라이버를 사용하도록 다시 작성할 수 있습니다. 그래서 사용자 공간에서 드라이버를 사용하여 SPI 드라이버를 사용할 수있는 방법을 알 수 있습니다.

+0

"i2c-dev"드라이버를 통해 간접적으로 I2C Cadance 드라이버를 사용했습니다. 이 드라이버는 I2C 어댑터 (I2C 마스터 버스 컨트롤러)가 시스템에 추가되거나 시스템에서 제거 될 때마다 알림을 받고 "/ dev/i2c-n"장치를 생성하거나 삭제합니다. 이를 통해 사용자 공간 애플리케이션은 I2C 버스상의 임의의 슬레이브로 메시지를 보낼 수 있습니다 (장치 드라이버에 연결된 모든 슬레이브 장치를 혼동시킬 수 있음). –

+0

SPI를 사용하면 "spidev"드라이버를 사용하여 사용자 공간에서 SPI 슬레이브 장치에 액세스 할 수 있지만 I2C와 달리 SPI 슬레이브 장치를 시스템에 정의해야합니다 (예 : 장치 트리 또는 보드 구성 코드). "spidev"드라이버. –

+0

장치 트리에 추가하는 방법을 알고 있습니다. 그러나 어떻게 그것을 운전사에게 묶을 수 있습니까? 나는 eeprom을 추가하고 싶다. –

답변

0

내 두 센트를 넣으면 i2c-tools 유틸리티를 대신 사용할 수 있습니다. 리눅스에서 i2c 장치를 다루기가 매우 쉽습니다. 그것을 사용하는 방법을 참조하십시오. https://elinux.org/Interfacing_with_I2C_Devices

+0

, 정확히 내가 한 일입니다. 단지 규모가 어떻게 될지 확실하지 않고 선호하는 방법이라면 –

+0

하나의 설명을합니다.제공 한 코드는 사용자 응용 프로그램 (주 기능 포함)입니다. 커널 드라이버 코드가 생성됩니다./dev에있는 i2c- * 장치 노드. 이제 두 가지 옵션이 있습니다. 작성한 사용자 공간에서 i2c- *를 사용하십시오. intialising 할 때 cross-compile하고 시작한다 (init 스크립트를 작성한다). 또는 커널 드라이버가 커널에서 같은 질문을 할 수 있도록 일부 rtc 드라이버를 확인하십시오. 당신이하고 싶은 것을 스스로 결정하십시오. – Devidas

+0

또한보십시오이 blog http://opensourceforu.com/2015/01/writing-i2c-clients-in-linux/ – Devidas