Прямо сейчас я хочу использовать драйвер Cadence SPI для выполнения некоторых базовых операций чтения и записи в Linux. Я только что использовал драйвер I2C, но я все еще немного озадачен тем, как все эти драйверы сочетаются друг с другом и существует ли общий интерфейс, которому они все соответствуют.
Вот код, который я написал для использования драйвера 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 находятся здесь:
https://www.kernel.org/doc/html/v4.11/driver-api/i2c.html
Самая первая структура, определенная в документации I2C, — это i2c_driver. Я не думаю, что когда я писал свою программу I2C, я использовал какие-либо структуры, определенные в документе драйвера I2C. Использовал ли я когда-нибудь драйвер I2C Cadence? Если нет, то как можно переписать мою программу для использования драйвера I2C Cadence, чтобы я мог понять, как использовать драйверы в пользовательском пространстве, чтобы я мог использовать драйвер SPI.