지금 나는 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 드라이버를 사용할 수있는 방법을 알 수 있습니다.
"i2c-dev"드라이버를 통해 간접적으로 I2C Cadance 드라이버를 사용했습니다. 이 드라이버는 I2C 어댑터 (I2C 마스터 버스 컨트롤러)가 시스템에 추가되거나 시스템에서 제거 될 때마다 알림을 받고 "/ dev/i2c-n"장치를 생성하거나 삭제합니다. 이를 통해 사용자 공간 애플리케이션은 I2C 버스상의 임의의 슬레이브로 메시지를 보낼 수 있습니다 (장치 드라이버에 연결된 모든 슬레이브 장치를 혼동시킬 수 있음). –
SPI를 사용하면 "spidev"드라이버를 사용하여 사용자 공간에서 SPI 슬레이브 장치에 액세스 할 수 있지만 I2C와 달리 SPI 슬레이브 장치를 시스템에 정의해야합니다 (예 : 장치 트리 또는 보드 구성 코드). "spidev"드라이버. –
장치 트리에 추가하는 방법을 알고 있습니다. 그러나 어떻게 그것을 운전사에게 묶을 수 있습니까? 나는 eeprom을 추가하고 싶다. –