blob: c8f8fb6af11ea680cd8dd35112c5fca3341d8543 [file] [log] [blame]
/* Copyright 2018-2019 NXP
* SPDX-License-Identifier: Apache-2.0
*/
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include "sm_timer.h"
#include "ax_reset.h"
#include "se05x_apis.h"
#define IMX_GPIO_NR(port, index) ((((port)-1) * 32) + ((index)&31))
#define IMX_RESET_PORT 2
#define IMX_RESET_PIN 21
#define EN_PIN IMX_GPIO_NR(IMX_RESET_PORT, IMX_RESET_PIN)
#define LOG_ERROR(X)
// #define LOG_ERROR(X) perror(X)
void axReset_HostConfigure()
{
int fd;
char buf[50];
/* Open export file to export GPIO */
fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd < 0) {
LOG_ERROR("Failed to open GPIO export file ");
return;
}
/* Export GPIO pin to toggle */
snprintf(buf, sizeof(buf), "%d", EN_PIN);
if (write(fd, buf, strlen(buf)) < 1) {
LOG_ERROR("Failed to export Enable pin ");
goto exit;
}
close(fd);
/* Open direction file to configure GPIO direction */
snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio%d/direction", EN_PIN);
fd = open(buf, O_WRONLY);
if (fd < 0) {
sm_usleep(1000 * 1000);
fd = open(buf, O_WRONLY);
if (fd < 0) {
axReset_HostUnconfigure();
LOG_ERROR("Failed to open GPIO direction file ");
return;
}
}
/* Configure direction of exported GPIO */
if (write(fd, "out", 3) < 1) {
LOG_ERROR("Failed to Configure Enable pin ");
axReset_HostUnconfigure();
goto exit;
}
exit:
close(fd);
return;
}
void axReset_HostUnconfigure()
{
int fd;
char buf[50];
fd = open("/sys/class/gpio/unexport", O_WRONLY);
if (fd < 0) {
LOG_ERROR("Failed to open unexport file ");
return;
}
snprintf(buf, sizeof(buf), "%d", EN_PIN);
if (write(fd, buf, strlen(buf)) < 1) {
LOG_ERROR("Failed to unexport GPIO ");
}
close(fd);
return;
}
/*
* Where applicable, PowerCycle the SE
*
* Pre-Requisite: @ref axReset_Configure has been called
*/
void axReset_ResetPluseDUT()
{
axReset_PowerDown();
sm_usleep(2000);
axReset_PowerUp();
return;
}
/*
* Where applicable, put SE in low power/standby mode
*
* Pre-Requisite: @ref axReset_Configure has been called
*/
void axReset_PowerDown()
{
int fd;
char buf[50];
char logic[10];
snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio%d/value", EN_PIN);
fd = open(buf, O_WRONLY);
if (fd < 0) {
LOG_ERROR("Failed to open GPIO value file ");
axReset_HostUnconfigure();
return;
}
snprintf(logic, sizeof(logic), "%d", !SE_RESET_LOGIC);
if (write(fd, logic, 1) < 1) {
LOG_ERROR("Failed to toggle GPIO high ");
axReset_HostUnconfigure();
}
close(fd);
}
/*
* Where applicable, put SE in powered/active mode
*
* Pre-Requisite: @ref axReset_Configure has been called
*/
void axReset_PowerUp()
{
int fd;
char buf[50];
char logic[10];
snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio%d/value", EN_PIN);
fd = open(buf, O_WRONLY);
if (fd < 0) {
LOG_ERROR("Failed to open GPIO value file ");
axReset_HostUnconfigure();
return;
}
snprintf(logic, sizeof(logic), "%d", SE_RESET_LOGIC);
if (write(fd, logic, 1) < 1) {
LOG_ERROR("Failed to toggle GPIO high ");
axReset_HostUnconfigure();
}
close(fd);
}
#if SSS_HAVE_SE05X || SSS_HAVE_LOOPBACK
void se05x_ic_reset()
{
axReset_ResetPluseDUT();
smComT1oI2C_ComReset();
sm_usleep(3000);
return;
}
#endif