blob: 6f9a5d39b84e12ae45711f5bab584f43681ea1b9 [file] [log] [blame]
#include <stdint.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <log/log.h>
#include "liblog/lynq_deflog.h"
#include "mtk_device_wrap.h"
#include "lynq_bootctrl.h"
static char *blk_dev_path = "/dev/disk/by-partlabel/misc";
static int bootctrl_write_lynq_data(lynq_data_t *bctrl)
{
int fd, err;
ssize_t sz, size;
char *buf = (char *)bctrl;
RLOGD("Enter in bootctrl: bootctrl_write_lynq_data \n");
fd = mtk_device_wrap_open(blk_dev_path, O_RDWR);
if (fd < 0)
{
err = errno;
RLOGE("%s Error opening metadata file: %s\n", __func__,strerror(errno));
return -err;
}
if (mtk_device_wrap_seek(fd, OFFSETOF_LYNQ_DATA, SEEK_SET) < 0)
{
err = errno;
RLOGE("%s Error seeking to metadata offset: %s\n", __func__ ,strerror(errno));
mtk_device_wrap_close(fd);
return -err;
}
size = sizeof(lynq_data_t);
do {
sz = mtk_device_wrap_write_force(fd, buf, size);
if (sz == 0)
{
break;
}
else if (sz < 0)
{
if (errno == EINTR)
{
continue;
}
err = -errno;
RLOGE("%s Error Writing metadata file\n",__func__);
mtk_device_wrap_close(fd);
return err;
}
size -= sz;
buf += sz;
} while(size > 0);
mtk_device_wrap_close(fd);
return 0;
}
static int bootctrl_read_lynq_data(lynq_data_t *bctrl)
{
int fd, err;
ssize_t sz, size;
char *buf = (char *)bctrl;
fd = open(blk_dev_path, O_RDONLY);
if (fd < 0)
{
err = errno;
RLOGE("%s Error opening metadata file: %s\n", __func__ ,strerror(errno));
return -err;
}
if (lseek(fd, OFFSETOF_LYNQ_DATA, SEEK_SET) < 0)
{
err = errno;
RLOGE("%s Error seeking to metadata offset: %s\n", __func__ ,strerror(errno));
close(fd);
return -err;
}
size = sizeof(lynq_data_t);
do {
sz = read(fd, buf, size);
if (sz == 0)
{
break;
}
else if (sz < 0)
{
if (errno == EINTR)
{
continue;
}
err = -errno;
RLOGE("%s Error reading metadata file\n", __func__);
close(fd);
return err;
}
size -= sz;
buf += sz;
} while(size > 0);
close(fd);
return 0;
}
int lynq_bootctrl_sgmii0_speed_set(unsigned speed)
{
int ret = -1;
lynq_data_t data;
RLOGD("BOOTCTRL: in lynq_bootctrl_sgmii0_speed_set, speed is %u\n", speed);
memset(&data, 0xFF, sizeof(data));
switch (speed)
{
case 100://100M
data.sgmii0_speed = 0x55;
break;
case 1000://1000M
data.sgmii0_speed = 0xAA;
break;
default:
return -1;
}
ret = bootctrl_write_lynq_data(&data);
if (ret < 0)
{
return ret;
}
return 0;
}
int lynq_bootctrl_sgmii0_speed_get(unsigned *speed)
{
int ret = -1;
lynq_data_t data;
RLOGD("BOOTCTRL: in lynq_bootctrl_sgmii0_speed_get\n");
ret = bootctrl_read_lynq_data(&data);
if(ret != 0)
{
return -1;
}
if(data.sgmii0_speed == 0x55)
{
*speed = 100;
}
else if(data.sgmii0_speed == 0xAA)
{
*speed = 1000;
}
else
{
*speed = 0;
}
return 0;
}
#ifdef __cplusplus
}
#endif