| #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 |