5. EXAMPLE CODE OF MODULE USAGE BY USER LAYER
Please ensure the driver has enabled in menuconfig and device tree has correct setting.
5.1 GPIO Module
5.1.1 GPIO Module control by C code
/************************************************************/
//File name:gpiotest.c
//Function : Test linux gpio with SP7021
//Date : 2019-12-19
/************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<fcntl.h>
#include<dirent.h>
#define SYS_GPIO_PFX "/sys/class/gpio/"
#define PIN_DIR_I 0
#define PIN_DIR_O 1
typedef unsigned char uint8;
int fd = -1;
//gpio init
static uint8 gpio_init(int _pin)
{
DIR *dp;
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
printf("port=%d, num=%d \n",port,num);
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d", port, num);
if(!(dp=opendir(fpath)))
{
FILE *fp;
if((fp = fopen(SYS_GPIO_PFX"export", "w")) == NULL) return(-1);
fprintf(fp, "%d", _pin);
fclose(fp);
}
else
{
closedir(dp);
}
return(0);
}
static uint8 gpio_read(int _pin)
{
char ret, ss[2];
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/value", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
ret = read(fd, ss, 1);
close(fd);
if(ret < 0) return(0);
return((ss[0] == '0'?0:1));
}
static uint8 gpio_write(int _pin, int _val)
{
int ret;
char x[2];
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/value", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
x[1] = '\0';
x[0] = (_val>0 ? '1':'0');
ret = write(fd, x, 1);
close(fd);
return(ret);
}
static uint8 gpio_dir_get(int _pin)
{
static char ss[2];
char fpath[100];
int ret,port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/direction", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
ret = read(fd, ss, 2);
close(fd);
if(ret < 0) return(0);
return((ss[0] == 'i'? PIN_DIR_I:PIN_DIR_O));
}
static uint8 gpio_dir_set(int _pin, int _dir)
{
int ret=0;
const char *ss="in";
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/direction", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
if(_dir == PIN_DIR_O) ss="out";
ret = write(fd, ss, strlen(ss)*sizeof(char));
close(fd);
return((ret<2 ? -1:0));
}
// main
// $ ./gpiotest 10 state ==> get G_MX[10] direction
// $ ./gpiotest 10 out ==> set G_MX[10] as output
// $ ./gpiotest 10 read ==> read G_MX[10] value
// $ ./gpiotest 10 write 1 ==> mean set G_MX[10] to high
int main(int argc, char *argv[])
{
int i,pinnum,value;
printf("GPIO test main start \n");
pinnum = atoi(argv[1]);
if (argv[3] != NULL)
value = atoi(argv[3]);
gpio_init(pinnum);
if(strcmp(argv[2],"state") == 0)
{
printf("state:%s \n", (gpio_dir_get(pinnum) == PIN_DIR_I? "IN":"OUT"));
}
if(strcmp(argv[2],"in") == 0)
{
printf("set IN ok:%d \n", gpio_dir_set(pinnum,PIN_DIR_I));
}
if(strcmp(argv[2],"read") == 0)
{
printf("read:%d \n", gpio_read(pinnum));
sleep(5);
printf("read:%d \n", gpio_read(pinnum));
}
if(strcmp(argv[2],"out") == 0)
{
printf("set OUT ok:%d \n", gpio_dir_set(pinnum,PIN_DIR_O));
}
if(strcmp(argv[2],"write") == 0)
{
printf("set OUT ok:%d \n", gpio_dir_set(pinnum,PIN_DIR_O));
if(value == 1)
printf("write done:%d \n", gpio_write(pinnum,1));
else
printf("write done:%d \n", gpio_write(pinnum,0));
}
printf("GPIO test end! \n ");
for(i=1; i; i--){
usleep(1000*100);
}
}
5.1.2 GPIO Module control by Python code
5.1.2.1 Edit gpio.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
#define SYS_GPIO_PFX "/sys/class/gpio/"
#define PIN_DIR_I 0
#define PIN_DIR_O 1
typedef unsigned char uint8;
int fd = -1;
uint8 gpio_init(int);
uint8 gpio_read(int);
uint8 gpio_write(int, int);
uint8 gpio_dir_get(int);
uint8 gpio_dir_set(int, int);
//gpio init
uint8 gpio_init(int _pin)
{
DIR *dp;
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
printf("port=%d, num=%d \n",port,num);
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d", port, num);
if(!(dp=opendir(fpath)))
{
FILE *fp;
if((fp = fopen(SYS_GPIO_PFX"export", "w")) == NULL) return(-1);
fprintf(fp, "%d", _pin);
fclose(fp);
sprintf(fpath, "sudo -S chmod 777 %sP%d_0%d/value", SYS_GPIO_PFX, port, num);
printf ("fpath0=%s", fpath);
system(fpath);
//chmod(fpath, 0777);
sprintf(fpath, "sudo -S chmod 777 %sP%d_0%d/direction", SYS_GPIO_PFX, port, num);
printf ("fpath1=%s", fpath);
system(fpath);
//chmod(fpath, 0777);
}
else
{
closedir(dp);
}
return(0);
}
uint8 gpio_read(int _pin)
{
char ret, ss[2];
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/value", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
ret = read(fd, ss, 1);
close(fd);
if(ret < 0) return(0);
return((ss[0] == '0'?0:1));
}
uint8 gpio_write(int _pin, int _val)
{
int ret;
char x[2];
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/value", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
x[1] = '\0';
x[0] = (_val>0 ? '1':'0');
ret = write(fd, x, 1);
close(fd);
return(ret);
}
uint8 gpio_dir_get(int _pin)
{
static char ss[2];
char fpath[100];
int ret,port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/direction", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
ret = read(fd, ss, 2);
close(fd);
if(ret < 0) return(0);
return((ss[0] == 'i'? PIN_DIR_I:PIN_DIR_O));
}
uint8 gpio_dir_set(int _pin, int _dir)
{
int ret=0;
const char *ss="in";
char fpath[100];
int port,num;
port = _pin/8;
num = _pin%8;
sprintf(fpath, SYS_GPIO_PFX"P%d_0%d/direction", port, num);
printf("fpath=%s \n", fpath);
fd = open(fpath, O_RDWR); // open file and enable read and write
if(fd < 0)
{
perror("Can't open gpio file \n"); // open i2c dev file fail
exit(1);
}
printf("open gpio file success !\n"); // open i2c dev file succes
if(_dir == PIN_DIR_O) ss="out";
ret = write(fd, ss, strlen(ss)*sizeof(char));
close(fd);
return((ret<2 ? -1:0));
}
5.1.2.2 Edit share library
$ gcc -shared -fPIC gpio.c -o gpio.so
5.1.2.3 Edit gpio.py
import time
from ctypes import *
m=cdll.LoadLibrary('./gpio.so')
k=m.gpio_init(c_int(12))
print(k)
k=m.gpio_dir_set(c_int(12),c_int(1))
print(k)
while True:
k=m.gpio_write(c_int(12),c_int(1))
time.sleep(0.005)
k=m.gpio_write(c_int(12),c_int(0))
time.sleep(0.005)
5.2 I2C Module
/************************************************************/
//File name:tea5767.c
//Function : Test linux i2c with tea5767 communication
//Date : 2019-05-29
/************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/select.h>
#include<sys/time.h>
#include<errno.h>
#define Address 0x60 //tea5767 ID address
#define I2C_RETRIES 0x0701
#define I2C_TIMEOUT 0x0702
#define I2C_SLAVE 0x0703
#define I2C_BUS_MODE 0x0780
typedef unsigned char uint8;
int fd = -1;
//Function declare
static uint8 tea5767_Init(void);
//tea5767 init
static uint8 tea5767_Init(void)
{
float frequency;
unsigned div;
uint8 data[5];
printf(" TEA5767 init\n ");
fd = open("/dev/i2c-0", O_RDWR); // open file of i2c-0 and enable read and write
if(fd < 0) {
perror("Can't open /dev/TEA5767 \n"); // open i2c dev file fail
exit(1);
}
printf("open /dev/i2c-0 success !\n"); // open i2c dev file succes
if(ioctl(fd, I2C_SLAVE, Address)<0) { //set i2c address
printf("fail to set i2c device slave address!\n");
close(fd);
return -1;
}
printf("set slave address to 0x%x success!\n", Address);
frequency = 97.5;
div = (4 * (frequency * 1000 + 225))/32.768;
data[0] = (div >> 8)&0x3f ;
data[1] = div & 0xff ;
data[2] = 0xB0 ;
data[3] = 0x50 ;
data[4] = 0x00 ;
write(fd, data, 5);
read(fd, data, 5);
printf("data0=0x%x\n", data[0]);
printf("data1=0x%x\n", data[1]);
printf("data2=0x%x\n", data[2]);
printf("data3=0x%x\n", data[3]);
printf("data4=0x%x\n", data[4]);
return(1);
}
// main
int main(int argc, char *argv[])
{
int i;
tea5767_Init();
usleep(1000*100);
printf(" TEA5767 get \n ");
close(fd);
}
5.3 SPI Module
/************************************************************/
//File name : ms5611.c
//Function : Test linux SPI with ms5611 communication
//Date : 2019-05-29
/************************************************************/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <tgmath.h>
#include <math.h>
#include <fcntl.h>
#include <linux/types.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#define DIG_START 0x88
#define TEMP_START 0xFA
#define CTRL_MEAS 0xF4
#define TEMP_ONLY_NORMAL_MODE 0xE3 // 111 000 11
#define MS5611_CMD_ADC_READ (0x00)
#define MS5611_CMD_RESET (0x1E)
#define MS5611_CMD_CONV_D1_256 (0x40)
#define MS5611_CMD_CONV_D1_512 (0x42)
#define MS5611_CMD_CONV_D1_1024 (0x44)
#define MS5611_CMD_CONV_D1_2048 (0x46)
#define MS5611_CMD_CONV_D1_4096 (0x48)
#define MS5611_CMD_CONV_D2_256 (0x50)
#define MS5611_CMD_CONV_D2_512 (0x52)
#define MS5611_CMD_CONV_D2_1024 (0x54)
#define MS5611_CMD_CONV_D2_2048 (0x56)
#define MS5611_CMD_CONV_D2_4096 (0x58)
#define MS5611_CMD_READ_PROM_RESERVE (0xA0)
#define MS5611_CMD_READ_PROM_1 (0xA2)
#define MS5611_CMD_READ_PROM_2 (0xA4)
#define MS5611_CMD_READ_PROM_3 (0xA6)
#define MS5611_CMD_READ_PROM_4 (0xA8)
#define MS5611_CMD_READ_PROM_5 (0xAA)
#define MS5611_CMD_READ_PROM_6 (0xAC)
#define MS5611_CMD_READ_PROM_CRC (0xAE)
char buf[10];
char buf2[10];
struct spi_ioc_transfer xfer[10];
spi_init(int file)
{
__u8 lsb = 0;
__u8 mode = 0;
__u8 bits = 8;
__u32 speed = 20000000;
if (ioctl(file, SPI_IOC_RD_MODE, &mode) < 0) {
perror("SPI rd_mode");
return;
}
if (ioctl(file, SPI_IOC_WR_MAX_SPEED_HZ, &speed)<0) {
perror("can't set max speed hz");
return;
}
if (ioctl(file, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
perror("SPI max_speed_hz");
return;
}
printf("spi max_speed_hz: %d\n", speed);
}
char * spi_rw(int addr,int nbytes,int file)
{
int status;
memset(buf, 0, sizeof buf);
memset(buf2, 0, sizeof buf2);
buf[0] = addr;
xfer[0].tx_buf = (unsigned long)buf;
xfer[0].len = 1;
xfer[1].rx_buf = (unsigned long) buf2;
xfer[1].len = nbytes;
printf("spi_start_rw\n");
status = ioctl(file, SPI_IOC_MESSAGE(2), xfer);
if (status < 0) {
perror("SPI_IOC_MESSAGE");
return;
}
return buf2;
}
char * spi_read(int addr,int nbytes,int file)
{
int status;
memset(buf, 0, sizeof buf);
memset(buf2, 0, sizeof buf2);
buf[0] = addr | 128;
xfer[0].tx_buf = (unsigned long)buf;
xfer[0].len = 1;
xfer[1].rx_buf = (unsigned long) buf2;
xfer[1].len = nbytes;
printf("before buf[0] = 0x0%x\n" ,buf[0]);
status = ioctl(file, SPI_IOC_MESSAGE(2), xfer);
if (status < 0) {
perror("SPI_IOC_MESSAGE");
return;
}
return buf2;
}
void spi_write_com(char value, int file)
{
int status;
memset(buf, 0, sizeof buf);
buf[0] = value;
xfer[0].tx_buf = (unsigned long)buf;
xfer[0].len = 1;
status = ioctl(file, SPI_IOC_MESSAGE(1), xfer);
if (status < 0) {
perror("SPI_IOC_MESSAGE");
}
}
int main()
{
int file,i;
char * id;
char tmp_buff[2];
char buff[3];
uint16_t coef[7]={0};
int status;
float ms_data[3];
uint32_t D1,D2;
int dT,T2,TEMP;
int64_t OFF,SENS,OFF2,SENS2;
printf("open spi device\n");
file = open("/dev/spidev0.0",O_RDWR);
spi_init(file);
if(file < 0) {
perror("Can't open /dev/spidev0.0\n"); // open i2c dev file fail
exit(1);
}
printf("open /dev/spidev0.0 success !\n"); // open i2c dev file succes
spi_write_com(MS5611_CMD_RESET,file);
usleep(100*28); //delay 2.8 ms
for(i=0;i<8;i++){ // read PROM data
usleep(1000*1); //delay 1 ms
memcpy(tmp_buff, spi_rw((MS5611_CMD_READ_PROM_RESERVE+2*i), 2, file), 2);
coef[i] = tmp_buff[0]*256+tmp_buff[1];
}
spi_write_com(MS5611_CMD_CONV_D2_4096,file);
usleep(10*822); //delay 8.22 ms
memcpy(buff, spi_rw(MS5611_CMD_ADC_READ, 3, file), 3);
D2 = buff[0]*65536+buff[1]*256+buff[2];
dT = D2 - ((uint32_t)coef[5])*256;
TEMP = 2000 + dT*((float)coef[6])/8388608;
spi_write_com(MS5611_CMD_CONV_D1_4096,file);
usleep(10*822); //delay 8.22 ms
memcpy(buff, spi_rw(MS5611_CMD_ADC_READ, 3, file), 3);
D1 = buff[0]*65536+buff[1]*256+buff[2];
if(TEMP<2000){
T2 = (float)(dT*dT)/2147483648;
OFF2 = 2.5f*(TEMP-2000)*(TEMP-2000);
SENS2 = 1.25f*(TEMP-2000)*(TEMP-2000);
i f(TEMP<-1500){
OFF2 = OFF2 +7*(TEMP+1500)*(TEMP+1500);
SENS2 = SENS2 +5.5f*(TEMP+1500)*(TEMP+1500);
}
}
else
{
T2 = 0;
OFF2 = 0;
SENS2 = 0;
}
ms_data[0]=(TEMP-T2)/100.0;
OFF = ((int64_t)coef[2])*65536 + (((int64_t)coef[4])*dT)/128 - OFF2;
SENS = ((int64_t)coef[1])*32768 + (((int64_t)coef[3])*dT)/256 - SENS2;
ms_data[1] = ((D1*SENS/2097152 - OFF)/32768);
printf("Temperature : %f \n", ms_data[0]);
printf("Pressure : %f \n", ms_data[1]);
return 0;
}
5.4 ETHERNET Module
/************************************************************/
//File name : test.c
//Function : Source code list of simple server program
//Date : 2019-05-29
/************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVER_PORT 3490 /* Server port for client connection */
#define MAX_CONNECTIONS 10 /* Max allowable connections */
main()
{
int server_fd; /* server file descriptor */
int client_fd; /* client file descriptor */
struct sockaddr_in server_addr; /* server ip address */
struct sockaddr_in client_addr; /* client's ip address */
int sin_size;
/* Get a file descriptor for network communication */
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
/* Setup server address */
server_addr.sin_family = AF_INET; /* Address family: internet */
server_addr.sin_port = htons(SERVER_PORT); /* Server port number */
server_addr.sin_addr.s_addr = INADDR_ANY; /* Allow any IP to connect */
bzero(&(server_addr.sin_zero); /* Zero the rest of the structure. */
/* Assign IP address & port to the file descriptor of server. */
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) {
perror("bind");
exit(1);
}
/* Set server to accept incoming connections. */
if (listen(server_fd, MAX_CONNECTIONS) == -1) {
perror("listen");
exit(1);
}
/* main accept() loop */
while(1) {
/* Accept connection request from client. */
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &sin_size)) == -1) {
perror("accept");
continue;
}
printf("Server: Got connection from %s\n", inet_ntoa(client_addr.sin_addr));
/* Create a child process */
if (!fork()) {
/* This is the child process */
if (send(client_fd, "Hello, world!\n", 14, 0) == -1)
perror("send");
close(client_fd);
exit(0); /* Child process exits */
}
/* Parent process continues here. */
close(client_fd); /* Parent doesn't need this. */
/* Wait for child process exits. */
while (waitpid(-1, NULL, WNOHANG) > 0);
}
}
5.5 CRYPTO Module
/************************************************************/
//File name : crypto.c
//Function : Demo on how to use /dev/crypto device for ciphering
//Date : 2019-05-29
/************************************************************/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <crypto/cryptodev.h>
#include "sha.h"
int sha_ctx_init(struct cryptodev_ctx* ctx, int cfd, const uint8_t *key, unsigned int key_size)
{
#ifdef CIOCGSESSINFO
struct session_info_op siop;
#endif
memset(ctx, 0, sizeof(*ctx));
ctx->cfd = cfd;
if (key == NULL)
ctx->sess.mac = CRYPTO_SHA1;
else {
ctx->sess.mac = CRYPTO_SHA1_HMAC;
ctx->sess.mackeylen = key_size;
ctx->sess.mackey = (void*)key;
}
if (ioctl(ctx->cfd, CIOCGSESSION, &ctx->sess)) {
perror("ioctl(CIOCGSESSION)");
return -1;
}
#ifdef CIOCGSESSINFO
siop.ses = ctx->sess.ses;
if (ioctl(ctx->cfd, CIOCGSESSINFO, &siop)) {
perror("ioctl(CIOCGSESSINFO)");
return -1;
}
printf("Got %s with driver %s\n",
siop.hash_info.cra_name, siop.hash_info.cra_driver_name);
if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) {
printf("Note: This is not an accelerated cipher\n");
}
/printf("Alignmask is %x\n", (unsigned int)siop.alignmask);/
ctx->alignmask = siop.alignmask;
#endif
return 0;
}
void sha_ctx_deinit(struct cryptodev_ctx* ctx)
{
if (ioctl(ctx->cfd, CIOCFSESSION, &ctx->sess.ses)) {
perror("ioctl(CIOCFSESSION)");
}
}
int sha_hash(struct cryptodev_ctx* ctx, const void* text, size_t size, void* digest)
{
struct crypt_op cryp;
void* p;
/* check text and ciphertext alignment */
if (ctx->alignmask) {
p = (void*)(((unsigned long)text + ctx->alignmask) & ~ctx->alignmask);
if (text != p) {
fprintf(stderr, "text is not aligned\n");
return -1;
}
}
memset(&cryp, 0, sizeof(cryp));
/* Encrypt data.in to data.encrypted */
cryp.ses = ctx->sess.ses;
cryp.len = size;
cryp.src = (void*)text;
cryp.mac = digest;
if (ioctl(ctx->cfd, CIOCCRYPT, &cryp)) {
perror("ioctl(CIOCCRYPT)");
return -1;
}
return 0;
}
int main()
{
int cfd = -1, i;
struct cryptodev_ctx ctx;
uint8_t digest[20];
char text[] = "The quick brown fox jumps over the lazy dog";
uint8_t expected[] = "\x2f\xd4\xe1\xc6\x7a\x2d\x28\xfc\xed\x84\x9e\xe1\xbb\x76\xe7\x39\x1b\x93\xeb\x12";
/* Open the crypto device */
cfd = open("/dev/crypto", O_RDWR, 0);
if (cfd < 0) {
perror("open(/dev/crypto)");
return 1;
}
/* Set close-on-exec (not really neede here) */
if (fcntl(cfd, F_SETFD, 1) == -1) {
perror("fcntl(F_SETFD)");
return 1;
}
sha_ctx_init(&ctx, cfd, NULL, 0);
sha_hash(&ctx, text, strlen(text), digest);
sha_ctx_deinit(&ctx);
printf("digest: ");
for (i = 0; i < 20; i++) {
printf("%02x:", digest[i]);
}
printf("\n");
if (memcmp(digest, expected, 20) != 0) {
fprintf(stderr, "SHA1 hashing failed\n");
return 1;
}
/* Close the original descriptor */
if (close(cfd)) {
perror("close(cfd)");
return 1;
}
return 0;
}
5.6 IOP8051 Module
/************************************************************/
//File name : iop8051.c
//Function : IOP8051 demo code
//Date : 2019-05-29
/************************************************************/
#include <errno.h>
#include <fcntl.h>
#include <linux/videodev2.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <getopt.h>
#include "iop_ioctl.h"
int main(int argc, char** argv)
{
int fd;
int i,ret;
int para;
char data[3];
for( ; ; )
{
int c;
c = getopt(argc, argv, "abcd");
if(c==-1)
break;
switch(c){
case 'a':
fd=open("/dev/sp_iop",O_RDWR);
if(fd ==-1) {
perror("update normal code fail");
}
ret = ioctl(fd, IOCTL_VALGET, 1);
if(ret ==-1){
perror("ioctl error ");
}
perror("update normal code success");
printf("close fd");
close(fd);
break;
case 'b':
fd=open("/dev/sp_iop",O_RDWR);
if(fd ==-1){
perror("update standby code fail");
}
ret = ioctl(fd, IOCTL_VALGET, 2);
if(ret ==-1){
perror("ioctl error ");
}
perror("update standby code success");
printf("close fd");
close(fd);
break;
case 'c':
fd=open("/dev/sp_iop",O_RDWR);
if(fd ==-1){
perror("get data fail");
}
ret = ioctl(fd, IOCTL_VALGET, 3);
if(ret ==-1){
perror("ioctl error ");
}
perror("get data success");
printf("close fd");
close(fd);
break;
case 'd':
fd=open("/dev/sp_iop",O_RDWR);
if(fd ==-1){
perror("set data fail");
}
data[0] = 0x01;
data[1] = 0x51;
data[2] = 0x15;
ret = write(fd, data, 3);
if(ret ==-1){
perror("write error ");
}
perror("set data success");
printf("close fd");
close(fd);
break;
}
}
}