int main(int argc, char *argv[])
{
- int rv = 0;
- int h, i, j;
- int devs_no;
+ int rv = 0, h, i, j, devs_no;
struct api_signature *sig = NULL;
ulong start, now;
struct device_info *di;
+ lbasize_t rlen;
if (!api_search_sig(&sig))
return -1;
if (devs_no == 0)
return -1;
-
printf("\n*** Show devices ***\n");
for (i = 0; i < devs_no; i++) {
test_dump_di(i);
if ((rv = ub_dev_open(i)) != 0)
errf("open device %d error %d\n", i, rv);
- else if ((rv = ub_dev_read(i, buf, 1, 0)) != 0)
+ else if ((rv = ub_dev_read(i, buf, 1, 0, &rlen)) != 0)
errf("could not read from device %d, error %d\n", i, rv);
else {
printf("Sector 0 dump (512B):\n");
/*
- * (C) Copyright 2007 Semihalf
- *
- * Written by: Rafal Jaworowski <raj@semihalf.com>
+ * (C) Copyright 2007-2008 Semihalf, Rafal Jaworowski <raj@semihalf.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* returns 1/0 depending on found/not found result
*/
-int api_search_sig(struct api_signature **sig) {
-
+int api_search_sig(struct api_signature **sig)
+{
unsigned char *sp;
uint32_t search_start = 0;
uint32_t search_end = 0;
syscall(API_RESET, NULL);
}
-#define MR_MAX 5
-static struct mem_region mr[MR_MAX];
+static struct mem_region mr[UB_MAX_MR];
static struct sys_info si;
struct sys_info * ub_get_sys_info(void)
memset(&si, 0, sizeof(struct sys_info));
si.mr = mr;
- si.mr_no = MR_MAX;
+ si.mr_no = UB_MAX_MR;
memset(&mr, 0, sizeof(mr));
if (!syscall(API_GET_SYS_INFO, &err, (u_int32_t)&si))
*
* devices
*
- * Devices are identified by handles: numbers 0, 1, 2, ..., MAX_DEVS-1
+ * Devices are identified by handles: numbers 0, 1, 2, ..., UB_MAX_DEV-1
*
***************************************************************************/
-#define MAX_DEVS 6
-
-static struct device_info devices[MAX_DEVS];
+static struct device_info devices[UB_MAX_DEV];
struct device_info * ub_dev_get(int i)
{
- return ((i < 0 || i >= MAX_DEVS) ? NULL : &devices[i]);
+ return ((i < 0 || i >= UB_MAX_DEV) ? NULL : &devices[i]);
}
/*
struct device_info *di;
int n = 0;
- memset(&devices, 0, sizeof(struct device_info) * MAX_DEVS);
+ memset(&devices, 0, sizeof(struct device_info) * UB_MAX_DEV);
di = &devices[0];
if (!syscall(API_DEV_ENUM, NULL, di))
while (di->cookie != NULL) {
- if (++n >= MAX_DEVS)
+ if (++n >= UB_MAX_DEV)
break;
/* take another device_info */
struct device_info *di;
int err = 0;
- if (handle < 0 || handle >= MAX_DEVS)
+ if (handle < 0 || handle >= UB_MAX_DEV)
return API_EINVAL;
di = &devices[handle];
{
struct device_info *di;
- if (handle < 0 || handle >= MAX_DEVS)
+ if (handle < 0 || handle >= UB_MAX_DEV)
return API_EINVAL;
di = &devices[handle];
*/
static int dev_valid(int handle)
{
- if (handle < 0 || handle >= MAX_DEVS)
+ if (handle < 0 || handle >= UB_MAX_DEV)
return 0;
if (devices[handle].state != DEV_STA_OPEN)
return 1;
}
-int ub_dev_read(int handle, void *buf, lbasize_t len, lbastart_t start)
+int ub_dev_read(int handle, void *buf, lbasize_t len, lbastart_t start,
+ lbasize_t *rlen)
{
struct device_info *di;
lbasize_t act_len;
di = &devices[handle];
if (!syscall(API_DEV_READ, &err, di, buf, &len, &start, &act_len))
- return -1;
-
- if (err)
- return err;
+ return API_ESYSC;
- if (act_len != len)
- return API_EIO;
+ if (!err && rlen)
+ *rlen = act_len;
- return 0;
+ return err;
}
static int dev_net_valid(int handle)
return 1;
}
-int ub_dev_recv(int handle, void *buf, int len)
+int ub_dev_recv(int handle, void *buf, int len, int *rlen)
{
struct device_info *di;
int err = 0, act_len;
di = &devices[handle];
if (!syscall(API_DEV_READ, &err, di, buf, &len, &act_len))
- return -1;
+ return API_ESYSC;
- if (err)
- return -1;
+ if (!err && rlen)
+ *rlen = act_len;
- return act_len;
+ return (err);
}
int ub_dev_send(int handle, void *buf, int len)
di = &devices[handle];
if (!syscall(API_DEV_WRITE, &err, di, buf, &len))
- return -1;
+ return API_ESYSC;
return err;
}
syscall(API_ENV_SET, NULL, (uint32_t)name, (uint32_t)value);
}
-
static char env_name[256];
const char * ub_env_enum(const char *last)
#define API_SEARCH_LEN (3 * 1024 * 1024) /* 3MB search range */
+#define UB_MAX_MR 5 /* max mem regions number */
+#define UB_MAX_DEV 6 /* max devices number */
+
extern void *syscall_ptr;
extern uint32_t search_hint;
int api_search_sig(struct api_signature **sig);
/*
- * ub_ library calls are part of the application, not U-Boot code! They are
- * front-end wrappers that are used by the consumer application: they prepare
- * arguments for particular syscall and jump to the low level syscall()
+ * The ub_ library calls are part of the application, not U-Boot code! They
+ * are front-end wrappers that are used by the consumer application: they
+ * prepare arguments for particular syscall and jump to the low level
+ * syscall()
*/
/* console */
int ub_dev_enum(void);
int ub_dev_open(int handle);
int ub_dev_close(int handle);
-int ub_dev_read(int handle, void *buf,
- lbasize_t len, lbastart_t start);
+int ub_dev_read(int handle, void *buf, lbasize_t len,
+ lbastart_t start, lbasize_t *rlen);
int ub_dev_send(int handle, void *buf, int len);
-int ub_dev_recv(int handle, void *buf, int len);
+int ub_dev_recv(int handle, void *buf, int len, int *rlen);
struct device_info * ub_dev_get(int);
#endif /* _API_GLUE_H_ */