Skip to content

Commit

Permalink
[Sigmastar] small cleanup and refactoring (#70)
Browse files Browse the repository at this point in the history
Co-authored-by: viktorxda <viktorxda@users.noreply.github.com>
  • Loading branch information
viktorxda and viktorxda committed May 3, 2023
1 parent 4a194f1 commit 4ecce15
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 70 deletions.
9 changes: 6 additions & 3 deletions src/chipid.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,15 @@ static bool generic_detect_cpu() {
char buf[256] = "unknown";

strcpy(chip_name, "unknown");
bool res = line_from_file("/proc/cpuinfo", "Hardware.+:.(\\w+)", buf, sizeof(buf));
bool res = line_from_file("/proc/cpuinfo", "Hardware.+:.(\\w+)",
buf, sizeof(buf));
if (!res) {
res = line_from_file("/proc/cpuinfo", "vendor_id.+:.(\\w+)", buf, sizeof(buf));
res = line_from_file("/proc/cpuinfo", "vendor_id.+:.(\\w+)",
buf, sizeof(buf));
}
if (!res) {
res = line_from_file("/proc/cpuinfo", "machine.+:.(\\w+)", buf, sizeof(buf));
res = line_from_file("/proc/cpuinfo", "machine.+:.(\\w+)",
buf, sizeof(buf));
}
strcpy(chip_manufacturer, buf);

Expand Down
137 changes: 76 additions & 61 deletions src/hal/sstar.c
Original file line number Diff line number Diff line change
@@ -1,31 +1,33 @@
#include "hal/sstar.h"

#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <unistd.h>

#include "chipid.h"
#include "hal/common.h"
#include "hal/sstar.h"
#include "tools.h"

static unsigned char onsemi_addrs[] = {0x20, 0};
static unsigned char sony_addrs[] = {0x34, 0};
static unsigned char ssens_addrs[] = {0x60, 0};
static unsigned char omni_addrs[] = {0x6c, 0};
static unsigned char onsemi_addrs[] = {0x20, 0};
static unsigned char gc_addrs[] = {0x6e, 0};
static unsigned char omni_addrs[] = {0x6C, 0};
static unsigned char gc_addrs[] = {0x6E, 0};

static sensor_addr_t sstar_possible_i2c_addrs[] = {
{SENSOR_SONY, sony_addrs}, {SENSOR_SMARTSENS, ssens_addrs},
{SENSOR_ONSEMI, onsemi_addrs}, {SENSOR_OMNIVISION, omni_addrs},
{SENSOR_GALAXYCORE, gc_addrs}, {0, NULL}};
{SENSOR_ONSEMI, onsemi_addrs},
{SENSOR_SONY, sony_addrs},
{SENSOR_SMARTSENS, ssens_addrs},
{SENSOR_OMNIVISION, omni_addrs},
{SENSOR_GALAXYCORE, gc_addrs},
{0, NULL},
};

bool mstar_detect_cpu(char *chip_name) {
uint32_t val;
uint32_t val = 0;

if (mem_reg(0x1f2025a4, (uint32_t *)&val, OP_READ)) {
if (mem_reg(MSTAR_ADDR, &val, OP_READ)) {
switch (val & 0xF000) {
case 0x6000:
strcpy(chip_name, "MSC313E");
Expand All @@ -39,25 +41,14 @@ bool mstar_detect_cpu(char *chip_name) {
}
return true;
}
return false;
}

static bool sstar_detect_brom_tag(uint32_t addr, char *buf) {
mem_reg(addr, (uint32_t*)buf, OP_READ);
if (buf[0] == 'M' && buf[1] == 'V' && buf[2] == 'X') {
for (int i = 1; i < 8; i++)
mem_reg(addr + i * 4, (uint32_t*)(buf + i * 4), OP_READ);
return true;
} else {
buf[0] = 0;
}
return false;
}

bool sstar_detect_cpu(char *chip_name) {
uint32_t val;
uint32_t val = 0;

if (mem_reg(0x1f003c00, &val, OP_READ)) {
if (mem_reg(SSTAR_ADDR, &val, OP_READ)) {
chip_generation = val;
switch (val) {
case INFINITY5:
Expand All @@ -79,78 +70,102 @@ bool sstar_detect_cpu(char *chip_name) {
return false;
}

bool sstar_get_die_id(char *buf, ssize_t len) {
uint32_t base, val;
static bool sstar_get_die_id(char *buf, ssize_t len) {
uint32_t base = 0, val = 0;

if (!chip_generation)
if (!chip_generation) {
return false;
}

if (chip_generation == INFINITY6E)
base = 0x1F203150;
else
base = 0x1F004058;
if (chip_generation == INFINITY6E) {
base = CHIP_ADDR1;
} else {
base = CHIP_ADDR2;
}

char *ptr = buf;
for (uint32_t addr = base + 8; addr >= base; addr -= 4) {
if (!mem_reg(addr, &val, OP_READ))
if (!mem_reg(addr, &val, OP_READ)) {
return false;
int outsz = snprintf(ptr, len, "%04X", val);
ptr += outsz;
}
int outsz = snprintf(buf, len, "%04X", val);
buf += outsz;
len -= outsz;
}

return true;
}

static unsigned long sstar_media_mem() {
char buf[256];
static bool sstar_detect_brom_tag(uint32_t addr, char *buf) {
mem_reg(addr, (uint32_t*)buf, OP_READ);

if (!line_from_file("/proc/cmdline", "mma_heap=.+sz=(0x[0-9A-Fa-f]+)", buf,
sizeof(buf)))
return 0;
return strtoul(buf, NULL, 16) / 1024;
}
if (buf[0] == 'M' && buf[1] == 'V' && buf[2] == 'X') {
for (int i = 1; i < 8; i++) {
mem_reg(addr + i * 4, (uint32_t*)(buf + i * 4), OP_READ);
}
return true;
}

unsigned long sstar_totalmem(unsigned long *media_mem) {
*media_mem = sstar_media_mem();
return *media_mem + kernel_mem();
return false;
}

int sstar_open_sensor_fd() { return universal_open_sensor_fd("/dev/i2c-1"); }
static int sstar_open_sensor_fd() {
return universal_open_sensor_fd("/dev/i2c-1");
}

static int sstar_i2c_write(int fd, unsigned char slave_addr,
unsigned char *reg_addr, unsigned char reg_width) {
unsigned int data_size = 0;

data_size = reg_width * sizeof(unsigned char);
unsigned char *reg_addr, unsigned char reg_width) {
unsigned int data_size = reg_width * sizeof(unsigned char);
return 0;
}

static void sstar_hal_cleanup() {}
static void sstar_hal_cleanup() {
}

float sstar_get_temp() {
float ret = -237.0;
static float sstar_get_temp() {
char buf[16];
if (line_from_file("/sys/class/mstar/msys/TEMP_R", "Temperature\\s+(.+)",
buf, sizeof(buf))) {
ret = strtof(buf, NULL);

if (!line_from_file(TEMP_PATH, "Temperature\\s+(.+)", buf, sizeof(buf))) {
return 0;
}

return strtof(buf, NULL);
}

static unsigned long sstar_media_mem() {
char buf[256];

if (!line_from_file(CMD_PATH, "mma_heap=.+sz=(\\w+)", buf,sizeof(buf))) {
return 0;
}
return ret;

return strtoul(buf, NULL, 16) / 1024;
}

void sstar_chip_properties(cJSON *j_inner) {
char buf[1024];
unsigned long sstar_totalmem(unsigned long *media_mem) {
*media_mem = sstar_media_mem();
return *media_mem + kernel_mem();
}

static void sstar_chip_properties(cJSON *j_inner) {
char buf[128];

if (sstar_get_die_id(buf, sizeof buf)) {
ADD_PARAM("id", buf);
}

if (sstar_detect_brom_tag(BROM_ADDR1, buf) ||
sstar_detect_brom_tag(BROM_ADDR2, buf)) {
ADD_PARAM("tag", buf);
}
}

void sstar_setup_hal() {
open_i2c_sensor_fd = sstar_open_sensor_fd;
possible_i2c_addrs = sstar_possible_i2c_addrs;
hal_cleanup = sstar_hal_cleanup;
if (!access("/sys/class/mstar/msys/TEMP_R", R_OK))
if (!access(TEMP_PATH, R_OK)) {
hal_temperature = sstar_get_temp;
}
#ifndef STANDALONE_LIBRARY
hal_totalmem = sstar_totalmem;
hal_chip_properties = sstar_chip_properties;
Expand Down
20 changes: 14 additions & 6 deletions src/hal/sstar.h
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
#ifndef HAL_SSTAR_H
#define HAL_SSTAR_H

#include <stdbool.h>
#define CMD_PATH "/proc/cmdline"
#define TEMP_PATH "/sys/class/mstar/msys/TEMP_R"

#define INFINITY3 0xC2
#define INFINITY5 0xED
#define MERCURY5 0xEE
#define INFINITY6 0xEF
#define BROM_ADDR1 0x3FE0
#define BROM_ADDR2 0x7FE0
#define CHIP_ADDR1 0x1F203150
#define CHIP_ADDR2 0x1F004058
#define MSTAR_ADDR 0x1F2025A4
#define SSTAR_ADDR 0x1F003C00

#define INFINITY3 0xC2
#define INFINITY5 0xED
#define MERCURY5 0xEE
#define INFINITY6 0xEF
#define INFINITY2M 0xF0
#define INFINITY6E 0xF1
#define INFINITY6B 0xF2
#define PIONEER3 0xF5
#define PIONEER3 0xF5

bool mstar_detect_cpu(char *chip_name);
bool sstar_detect_cpu(char *chip_name);
Expand Down

0 comments on commit 4ecce15

Please sign in to comment.