diff options
| author | Pali Rohár <pali.rohar@gmail.com> | 2012-11-24 01:01:53 +0100 | 
|---|---|---|
| committer | Pali Rohár <pali.rohar@gmail.com> | 2012-11-24 01:01:53 +0100 | 
| commit | 2e78262c10cbb1409f9fd0e8cad988a9adc96d46 (patch) | |
| tree | 785254191e9229f57a56ce786131578c0efe0f5d /src/local.c | |
| parent | c03e01879e4dc13d8ecc999b97350e683fa5cf06 (diff) | |
| download | 0xFFFF-2e78262c10cbb1409f9fd0e8cad988a9adc96d46.tar.bz2 | |
local: Use in-tree CAL parser
Diffstat (limited to 'src/local.c')
| -rw-r--r-- | src/local.c | 203 | 
1 files changed, 108 insertions, 95 deletions
| diff --git a/src/local.c b/src/local.c index 6af6aa1..b909f86 100644 --- a/src/local.c +++ b/src/local.c @@ -28,18 +28,70 @@  #include <unistd.h>  #include <fcntl.h> -#ifdef WITH_CAL -#include <cal.h> -#endif -  #include "local.h"  #include "global.h"  #include "device.h"  #include "image.h" +#include "cal.h" -static enum device device = DEVICE_UNKNOWN;  static int failed; +static enum device device = DEVICE_UNKNOWN; +static int16_t hwrev = -1; +static char kernel_ver[256]; +static char initfs_ver[256]; +static char nolo_ver[256]; +static char sw_ver[256]; +static char content_ver[256]; +static char rd_mode[256]; +static int usb_host_mode; +static int root_device; + +#define min(a, b) (a < b ? a : b) +#define local_cal_copy(dest, from, len) strncpy(dest, from, min(len, sizeof(dest)-1)) +#define local_cal_read(cal, str, ptr, len) ( cal_read_block(cal, str, &ptr, &len, 0) == 0 && ptr ) +#define local_cal_store(cal, str, dest) do { void * ptr; unsigned long int len; if ( local_cal_read(cal, str, ptr, len) ) local_cal_copy(dest, ptr, len); } while ( 0 ) + +static void local_cal_parse(void) { + +	struct cal * cal = NULL; +	char buf[128]; + +	if ( cal_init(&cal) < 0 || ! cal ) +		return; + +	local_cal_store(cal, "kernel-ver", kernel_ver); +	local_cal_store(cal, "initfs-ver", kernel_ver); +	local_cal_store(cal, "nolo-ver", nolo_ver); +	local_cal_store(cal, "sw-release-ver", sw_ver); +	local_cal_store(cal, "content-ver", content_ver); +	local_cal_store(cal, "r&d_mode", rd_mode); + +	memset(buf, 0, sizeof(buf)); +	local_cal_store(cal, "phone-info", buf); +	buf[4] = 0; + +	if ( sscanf(buf, "%hd", &hwrev) != 1 ) +		hwrev = -1; + +	buf[0] = 0; +	local_cal_store(cal, "usb_host_mode", buf); +	usb_host_mode = buf[0]; + +	memset(buf, 0, sizeof(buf)); +	local_cal_store(cal, "root_device", buf); + +	if ( strcmp(buf, "mmc") == 0 ) +		root_device = 1; +	else if ( strcmp(buf, "usb") == 0 ) +		root_device = 2; +	else +		root_device = 0; + +	cal_finish(cal); + +} +  int local_init(void) {  	char buf[1024]; @@ -97,6 +149,7 @@ int local_init(void) {  			if ( device ) {  				printf("Found local device: %s\n", device_to_long_string(device));  				fclose(file); +				local_cal_parse();  				return 0;  			} @@ -277,52 +330,9 @@ int local_reboot_device(void) {  } -static int local_read_cal(const char * str, void * buf, size_t size) { - -#ifdef WITH_CAL -	unsigned long int len; -	struct cal * cal; -	void * ptr; -	int ret; - -	if ( cal_init(&cal) < 0 ) -		return -1; - -	ret = cal_read_block(cal, "r&d_mode", &ptr, &len, CAL_FLAG_USER); - -	if ( ret < 0 || ! ptr ) { -		cal_finish(cal); -		return -1; -	} - -	if ( len > size ) -		len = size; - -	memcpy(str, ptr, len); -	cal_finish(cal); -	return len; -#else -	(void)str; -	(void)buf; -	(void)size; -	return -1; -#endif - -} - -static int local_write_cal(const char * str, const void * buf, size_t len) { - -	(void)str; -	(void)buf; -	(void)len; -	return -1; - -} -  int local_get_root_device(void) { -	ERROR("Not implemented yet"); -	return -1; +	return root_device;  } @@ -336,8 +346,7 @@ int local_set_root_device(int device) {  int local_get_usb_host_mode(void) { -	ERROR("Not implemented yet"); -	return -1; +	return usb_host_mode;  } @@ -351,12 +360,7 @@ int local_set_usb_host_mode(int enable) {  int local_get_rd_mode(void) { -	char buf[10]; - -	if ( local_read_cal("r&d_mode", buf, sizeof(buf)) < 0 ) -		return -1; - -	if ( strncmp(buf, "master", strlen("master")) == 0 ) +	if ( strncmp(rd_mode, "master", strlen("master")) == 0 )  		return 1;  	else  		return 0; @@ -373,16 +377,12 @@ int local_set_rd_mode(int enable) {  int local_get_rd_flags(char * flags, size_t size) { -	char buf[512]; -	char * ptr; - -	if ( local_read_cal("r&d_mode", buf, sizeof(buf)) < 0 ) -		return -1; +	const char * ptr; -	if ( strncmp(buf, "master", strlen("master")) == 0 ) -		ptr = buf + strlen("master"); +	if ( strncmp(rd_mode, "master", strlen("master")) == 0 ) +		ptr = rd_mode + strlen("master");  	else -		ptr = buf; +		ptr = rd_mode;  	if ( *ptr == ',' )  		++ptr; @@ -400,33 +400,14 @@ int local_get_rd_flags(char * flags, size_t size) {  int local_set_rd_flags(const char * flags) { -	char buf[512]; - -	if ( strlen(flags) > sizeof(buf) + strlen("master,") ) -		return -1; - -	if ( flags[0] == 0 ) -		return local_write_cal("r&d_mode", "master", strlen("master") + 1); - -	strcpy(buf, "master,"); -	strcpy(buf+strlen("master,"), flags); -	return local_write_cal("r&d_mode", buf, strlen(buf) + 1); +	ERROR("Not implemented yet"); +	(void)flags; +	return -1;  }  int16_t local_get_hwrev(void) { -	char buf[5]; -	int16_t hwrev; - -	if ( local_read_cal("phone-info", buf, sizeof(buf)) < 0 ) -		return 0; - -	buf[4] = 0; - -	if ( sscanf(buf, "%hd", &hwrev) != 1 ) -		return -1; -  	return hwrev;  } @@ -441,48 +422,80 @@ int local_set_hwrev(int16_t hwrev) {  int local_get_kernel_ver(char * ver, size_t size) { -	return local_read_cal("kernel-ver", ver, size); +	strncpy(ver, kernel_ver, size); +	ver[size-1] = 0; +	return 0;  }  int local_set_kernel_ver(const char * ver) { -	return local_write_cal("kernel-ver", ver, strlen(ver)); +	ERROR("Not implemented yet"); +	(void)ver; +	return -1; + +} + +int local_get_initfs_ver(char * ver, size_t size) { + +	strncpy(ver, initfs_ver, size); +	ver[size-1] = 0; +	return 0; + +} + +int local_set_initfs_ver(const char * ver) { + +	ERROR("Not implemented yet"); +	(void)ver; +	return -1;  }  int local_get_nolo_ver(char * ver, size_t size) { -	return local_read_cal("nolo-ver", ver, size); +	strncpy(ver, nolo_ver, size); +	ver[size-1] = 0; +	return 0;  }  int local_set_nolo_ver(const char * ver) { -	return local_write_cal("nolo-ver", ver, strlen(ver)); +	ERROR("Not implemented yet"); +	(void)ver; +	return -1;  }  int local_get_sw_ver(char * ver, size_t size) { -	return local_read_cal("sw-release-ver", ver, size); +	strncpy(ver, sw_ver, size); +	ver[size-1] = 0; +	return 0;  }  int local_set_sw_ver(const char * ver) { -	return local_write_cal("sw-release-ver", ver, strlen(ver)); +	ERROR("Not implemented yet"); +	(void)ver; +	return -1;  }  int local_get_content_ver(char * ver, size_t size) { -	return local_read_cal("content-ver", ver, size); +	strncpy(ver, content_ver, size); +	ver[size-1] = 0; +	return 0;  }  int local_set_content_ver(const char * ver) { -	return local_write_cal("content-ver", ver, strlen(ver)); +	ERROR("Not implemented yet"); +	(void)ver; +	return -1;  } |