summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorprife <[email protected]>2013-01-22 16:23:33 +0800
committerprife <[email protected]>2013-01-22 16:23:33 +0800
commit29d63fe2bcd04008322a0ca2259a56a6ed51ee89 (patch)
tree4b317f0b23f17e0b676cca0ce9152615818e70a0
parent3f3b6b7deb2b87f88c2b4a1ed65bbfa25c2b3621 (diff)
parent8bbd54ddf65fde499870ceaf4d107d6d23d90d6d (diff)
Merge branch 'master' into simposix
-rw-r--r--components/drivers/include/drivers/mtd_nand.h11
-rw-r--r--components/drivers/usb/usbdevice/core/core.c45
-rw-r--r--components/finsh/cmd.c8
-rw-r--r--components/finsh/finsh.h15
-rw-r--r--components/finsh/finsh_var.c4
-rw-r--r--components/finsh/finsh_vm.c12
-rw-r--r--components/libc/newlib/SConscript9
-rw-r--r--components/libc/newlib/math.c260
-rw-r--r--src/timer.c12
9 files changed, 97 insertions, 279 deletions
diff --git a/components/drivers/include/drivers/mtd_nand.h b/components/drivers/include/drivers/mtd_nand.h
index 45c3016e5c..fdcece3a57 100644
--- a/components/drivers/include/drivers/mtd_nand.h
+++ b/components/drivers/include/drivers/mtd_nand.h
@@ -25,11 +25,12 @@
struct rt_mtd_nand_driver_ops;
#define RT_MTD_NAND_DEVICE(device) ((struct rt_mtd_nand_device*)(device))
-#define RT_MTD_EOK 0
-#define RT_MTD_EECC 1
-#define RT_MTD_EBUSY 2
-#define RT_MTD_EIO 3
-#define RT_MTD_ENOMEM 4
+#define RT_MTD_EOK 0 /* NO error */
+#define RT_MTD_EECC 1 /* ECC error */
+#define RT_MTD_EBUSY 2 /* hardware busy */
+#define RT_MTD_EIO 3 /* generic IO issue */
+#define RT_MTD_ENOMEM 4 /* out of memory */
+#define RT_MTD_ESRC 5 /* source issue */
struct rt_mtd_nand_device
{
diff --git a/components/drivers/usb/usbdevice/core/core.c b/components/drivers/usb/usbdevice/core/core.c
index c0f21a1cd4..9f1738ed33 100644
--- a/components/drivers/usb/usbdevice/core/core.c
+++ b/components/drivers/usb/usbdevice/core/core.c
@@ -124,7 +124,7 @@ static rt_err_t _get_string_descriptor(struct udevice* device, ureq_t setup)
}
}
- if(setup->length == 0xFF)
+ if(setup->length > len)
len = str_desc.bLength;
else
len = setup->length;
@@ -356,6 +356,38 @@ static rt_err_t _set_address(struct udevice* device, ureq_t setup)
}
/**
+ * This function will handle standard request to
+ * interface that defined in class-specifics
+ *
+ * @param device the usb device object.
+ * @param setup the setup request.
+ *
+ * @return RT_EOK on successful.
+ */
+static rt_err_t _request_interface(struct udevice* device, ureq_t setup)
+{
+ uintf_t intf;
+ uclass_t cls;
+ rt_err_t ret;
+
+ /* parameter check */
+ RT_ASSERT(device != RT_NULL);
+ RT_ASSERT(setup != RT_NULL);
+
+ RT_DEBUG_LOG(RT_DEBUG_USB, ("_request_interface\n"));
+
+ intf = rt_usbd_find_interface(device, setup->index & 0xFF, &cls);
+ if (intf != RT_NULL)
+ {
+ ret = intf->handler(device, cls, setup);
+ }
+ else
+ ret = -RT_ERROR;
+
+ return ret;
+}
+
+/**
* This function will handle standard request.
*
* @param device the usb device object.
@@ -419,9 +451,14 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup)
_set_interface(device, setup);
break;
default:
- rt_kprintf("unknown interface request\n");
- dcd_ep_stall(device->dcd, 0);
- break;
+ if (_request_interface(device, setup) != RT_EOK)
+ {
+ rt_kprintf("unknown interface request\n");
+ dcd_ep_stall(device->dcd, 0);
+ return - RT_ERROR;
+ }
+ else
+ break;
}
break;
case USB_REQ_TYPE_ENDPOINT:
diff --git a/components/finsh/cmd.c b/components/finsh/cmd.c
index b4b8712b02..84a0a6f123 100644
--- a/components/finsh/cmd.c
+++ b/components/finsh/cmd.c
@@ -623,7 +623,9 @@ long list(void)
rt_kprintf("--Variable List:\n");
{
struct finsh_sysvar *index;
- for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++)
+ for (index = _sysvar_table_begin;
+ index < _sysvar_table_end;
+ FINSH_NEXT_SYSVAR(index))
{
#ifdef FINSH_USING_DESCRIPTION
rt_kprintf("%-16s -- %s\n", index->name, index->desc);
@@ -761,7 +763,9 @@ void list_prefix(char *prefix)
/* checks in system variable */
{
struct finsh_sysvar* index;
- for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++)
+ for (index = _sysvar_table_begin;
+ index < _sysvar_table_end;
+ FINSH_NEXT_SYSVAR(index))
{
if (str_is_prefix(prefix, index->name) == 0)
{
diff --git a/components/finsh/finsh.h b/components/finsh/finsh.h
index 994509bd64..85e32b9fb8 100644
--- a/components/finsh/finsh.h
+++ b/components/finsh/finsh.h
@@ -64,8 +64,16 @@ typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned long u_long;
-#if !defined(__CC_ARM) && !defined(__IAR_SYSTEMS_ICC__) && !defined(__ADSPBLACKFIN__) && !defined(_MSC_VER)
+#if !defined(__CC_ARM) && \
+ !defined(__IAR_SYSTEMS_ICC__) && \
+ !defined(__ADSPBLACKFIN__) && \
+ !defined(_MSC_VER)
+
+#if !(defined(__GNUC__) && defined(__x86_64__))
typedef unsigned int size_t;
+#else
+#include <stdio.h>
+#endif
#ifndef NULL
#define NULL RT_NULL
@@ -148,11 +156,14 @@ struct finsh_sysvar
void* var ; /* the address of variable */
};
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__))
struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call);
+struct finsh_sysvar* finsh_sysvar_next(struct finsh_sysvar* call);
#define FINSH_NEXT_SYSCALL(index) index=finsh_syscall_next(index)
+#define FINSH_NEXT_SYSVAR(index) index=finsh_sysvar_next(index)
#else
#define FINSH_NEXT_SYSCALL(index) index++
+#define FINSH_NEXT_SYSVAR(index) index++
#endif
/* system variable item */
diff --git a/components/finsh/finsh_var.c b/components/finsh/finsh_var.c
index 96f1244210..8429f6f21c 100644
--- a/components/finsh/finsh_var.c
+++ b/components/finsh/finsh_var.c
@@ -121,7 +121,9 @@ struct finsh_sysvar* finsh_sysvar_lookup(const char* name)
struct finsh_sysvar* index;
struct finsh_sysvar_item* item;
- for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++)
+ for (index = _sysvar_table_begin;
+ index < _sysvar_table_end;
+ FINSH_NEXT_SYSVAR(index))
{
if (strcmp(index->name, name) == 0)
return index;
diff --git a/components/finsh/finsh_vm.c b/components/finsh/finsh_vm.c
index 845eb48919..6b24b70f24 100644
--- a/components/finsh/finsh_vm.c
+++ b/components/finsh/finsh_vm.c
@@ -83,7 +83,7 @@ void finsh_syscall_append(const char* name, syscall_func func)
}
#endif
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__))
struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call)
{
unsigned int *ptr;
@@ -93,6 +93,16 @@ struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call)
return (struct finsh_syscall*)ptr;
}
+
+struct finsh_sysvar* finsh_sysvar_next(struct finsh_sysvar* call)
+{
+ unsigned int *ptr;
+ ptr = (unsigned int*) (call + 1);
+ while ((*ptr == 0) && ((unsigned int*)ptr < (unsigned int*) _sysvar_table_end))
+ ptr ++;
+
+ return (struct finsh_sysvar*)ptr;
+}
#endif
struct finsh_syscall* finsh_syscall_lookup(const char* name)
diff --git a/components/libc/newlib/SConscript b/components/libc/newlib/SConscript
index 28d66bc0fe..a3ddbe9f4d 100644
--- a/components/libc/newlib/SConscript
+++ b/components/libc/newlib/SConscript
@@ -11,6 +11,13 @@ cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd]
-group = DefineGroup('newlib', src, depend = ['RT_USING_NEWLIB'], CPPPATH = CPPPATH)
+# link with libm in default.
+# libm is a frequently used lib. Newlib is compiled with -ffunction-sections in
+# recent GCC tool chains. The linker would just link in the functions that have
+# been referenced. So setting this won't result in bigger text size.
+LIBS = ['m']
+
+group = DefineGroup('newlib', src, depend = ['RT_USING_NEWLIB'],
+ CPPPATH = CPPPATH, LIBS = LIBS)
Return('group')
diff --git a/components/libc/newlib/math.c b/components/libc/newlib/math.c
deleted file mode 100644
index 61418f25f3..0000000000
--- a/components/libc/newlib/math.c
+++ /dev/null
@@ -1,260 +0,0 @@
-#include <math.h>
-
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS CRT
- * FILE: lib/crt/math/cos.c
- * PURPOSE: Generic C Implementation of cos
- * PROGRAMMER: Timo Kreuzer ([email protected])
- */
-
-#define PRECISION 9
-
-static double cos_off_tbl[] = {0.0, -M_PI/2., 0, -M_PI/2.};
-static double cos_sign_tbl[] = {1,-1,-1,1};
-
-static double sin_off_tbl[] = {0.0, -M_PI/2., 0, -M_PI/2.};
-static double sin_sign_tbl[] = {1,-1,-1,1};
-
-double sin(double x)
-{
- int quadrant;
- double x2, result;
-
- /* Calculate the quadrant */
- quadrant = x * (2./M_PI);
-
- /* Get offset inside quadrant */
- x = x - quadrant * (M_PI/2.);
-
- /* Normalize quadrant to [0..3] */
- quadrant = (quadrant - 1) & 0x3;
-
- /* Fixup value for the generic function */
- x += sin_off_tbl[quadrant];
-
- /* Calculate the negative of the square of x */
- x2 = - (x * x);
-
- /* This is an unrolled taylor series using <PRECISION> iterations
- * Example with 4 iterations:
- * result = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8!
- * To save multiplications and to keep the precision high, it's performed
- * like this:
- * result = 1 - x^2 * (1/2! - x^2 * (1/4! - x^2 * (1/6! - x^2 * (1/8!))))
- */
-
- /* Start with 0, compiler will optimize this away */
- result = 0;
-
-#if (PRECISION >= 10)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20);
- result *= x2;
-#endif
-#if (PRECISION >= 9)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18);
- result *= x2;
-#endif
-#if (PRECISION >= 8)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16);
- result *= x2;
-#endif
-#if (PRECISION >= 7)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14);
- result *= x2;
-#endif
-#if (PRECISION >= 6)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12);
- result *= x2;
-#endif
-#if (PRECISION >= 5)
- result += 1./(1.*2*3*4*5*6*7*8*9*10);
- result *= x2;
-#endif
- result += 1./(1.*2*3*4*5*6*7*8);
- result *= x2;
-
- result += 1./(1.*2*3*4*5*6);
- result *= x2;
-
- result += 1./(1.*2*3*4);
- result *= x2;
-
- result += 1./(1.*2);
- result *= x2;
-
- result += 1;
-
- /* Apply correct sign */
- result *= sin_sign_tbl[quadrant];
-
- return result;
-}
-
-double cos(double x)
-{
- int quadrant;
- double x2, result;
-
- /* Calculate the quadrant */
- quadrant = x * (2./M_PI);
-
- /* Get offset inside quadrant */
- x = x - quadrant * (M_PI/2.);
-
- /* Normalize quadrant to [0..3] */
- quadrant = quadrant & 0x3;
-
- /* Fixup value for the generic function */
- x += cos_off_tbl[quadrant];
-
- /* Calculate the negative of the square of x */
- x2 = - (x * x);
-
- /* This is an unrolled taylor series using <PRECISION> iterations
- * Example with 4 iterations:
- * result = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8!
- * To save multiplications and to keep the precision high, it's performed
- * like this:
- * result = 1 - x^2 * (1/2! - x^2 * (1/4! - x^2 * (1/6! - x^2 * (1/8!))))
- */
-
- /* Start with 0, compiler will optimize this away */
- result = 0;
-
-#if (PRECISION >= 10)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20);
- result *= x2;
-#endif
-#if (PRECISION >= 9)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18);
- result *= x2;
-#endif
-#if (PRECISION >= 8)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16);
- result *= x2;
-#endif
-#if (PRECISION >= 7)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14);
- result *= x2;
-#endif
-#if (PRECISION >= 6)
- result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12);
- result *= x2;
-#endif
-#if (PRECISION >= 5)
- result += 1./(1.*2*3*4*5*6*7*8*9*10);
- result *= x2;
-#endif
- result += 1./(1.*2*3*4*5*6*7*8);
- result *= x2;
-
- result += 1./(1.*2*3*4*5*6);
- result *= x2;
-
- result += 1./(1.*2*3*4);
- result *= x2;
-
- result += 1./(1.*2);
- result *= x2;
-
- result += 1;
-
- /* Apply correct sign */
- result *= cos_sign_tbl[quadrant];
-
- return result;
-}
-
-static const int N = 100;
-
-double coef(int n)
-{
- double t;
-
- if (n == 0)
- {
- return 0;
- }
-
- t = 1.0/n;
-
- if (n%2 == 0)
- {
- t = -t;
- }
-
- return t;
-}
-
-double horner(double x)
-{
- double u = coef(N);
- int i;
-
- for(i=N-1; i>=0; i--)
- {
- u = u*x + coef(i);
- }
-
- return u;
-}
-
-double sqrt(double b)
-{
- double x = 1;
- int step = 0;
-
- while ((x*x-b<-0.000000000000001 || x*x-b>0.000000000000001) && step<50)
- {
- x = (b/x+x)/2.0;
- step++;
- }
- return x;
-}
-
-double ln(double x)
-{
- int i;
-
- if (x > 1.5)
- {
- for(i=0; x>1.25; i++)
- {
- x = sqrt(x);
- }
- return (1<<i)*horner(x-1);
- }
- else if (x<0.7 && x>0)
- {
- for(i=0; x<0.7; i++)
- {
- x = sqrt(x);
- }
- return (1<<i)*horner(x-1);
- }
- else if(x > 0)
- {
- return horner(x-1);
- }
-}
-
-double exp(double x)
-{
- double sum = 1;
- int i;
-
- for(i=N; i>0; i--)
- {
- sum /= i;
- sum *= x;
- sum += 1;
- }
- return sum;
-}
-
-double pow(double m, double n)
-{
- return exp(n*ln(m));
-}
-
diff --git a/src/timer.c b/src/timer.c
index a1699dad63..2a27d9d9a8 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -273,12 +273,18 @@ rt_err_t rt_timer_start(rt_timer_t timer)
for (n = timer_list->next; n != timer_list; n = n->next)
{
t = rt_list_entry(n, struct rt_timer, list);
-
+
/*
* It supposes that the new tick shall less than the half duration of
- * tick max.
+ * tick max. And if we have two timers that timeout at the same time,
+ * it's prefered that the timer inserted early get called early.
*/
- if ((t->timeout_tick - timer->timeout_tick) < RT_TICK_MAX / 2)
+ if ((t->timeout_tick - timer->timeout_tick) == 0)
+ {
+ rt_list_insert_after(n, &(timer->list));
+ break;
+ }
+ else if ((t->timeout_tick - timer->timeout_tick) < RT_TICK_MAX / 2)
{
rt_list_insert_before(n, &(timer->list));
break;