Merge branch 'master' into simposix
This commit is contained in:
commit
29d63fe2bc
|
@ -25,11 +25,12 @@
|
||||||
struct rt_mtd_nand_driver_ops;
|
struct rt_mtd_nand_driver_ops;
|
||||||
#define RT_MTD_NAND_DEVICE(device) ((struct rt_mtd_nand_device*)(device))
|
#define RT_MTD_NAND_DEVICE(device) ((struct rt_mtd_nand_device*)(device))
|
||||||
|
|
||||||
#define RT_MTD_EOK 0
|
#define RT_MTD_EOK 0 /* NO error */
|
||||||
#define RT_MTD_EECC 1
|
#define RT_MTD_EECC 1 /* ECC error */
|
||||||
#define RT_MTD_EBUSY 2
|
#define RT_MTD_EBUSY 2 /* hardware busy */
|
||||||
#define RT_MTD_EIO 3
|
#define RT_MTD_EIO 3 /* generic IO issue */
|
||||||
#define RT_MTD_ENOMEM 4
|
#define RT_MTD_ENOMEM 4 /* out of memory */
|
||||||
|
#define RT_MTD_ESRC 5 /* source issue */
|
||||||
|
|
||||||
struct rt_mtd_nand_device
|
struct rt_mtd_nand_device
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
len = str_desc.bLength;
|
||||||
else
|
else
|
||||||
len = setup->length;
|
len = setup->length;
|
||||||
|
@ -355,6 +355,38 @@ static rt_err_t _set_address(struct udevice* device, ureq_t setup)
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
* This function will handle standard request.
|
||||||
*
|
*
|
||||||
|
@ -419,9 +451,14 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup)
|
||||||
_set_interface(device, setup);
|
_set_interface(device, setup);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
rt_kprintf("unknown interface request\n");
|
if (_request_interface(device, setup) != RT_EOK)
|
||||||
dcd_ep_stall(device->dcd, 0);
|
{
|
||||||
break;
|
rt_kprintf("unknown interface request\n");
|
||||||
|
dcd_ep_stall(device->dcd, 0);
|
||||||
|
return - RT_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case USB_REQ_TYPE_ENDPOINT:
|
case USB_REQ_TYPE_ENDPOINT:
|
||||||
|
|
|
@ -623,7 +623,9 @@ long list(void)
|
||||||
rt_kprintf("--Variable List:\n");
|
rt_kprintf("--Variable List:\n");
|
||||||
{
|
{
|
||||||
struct finsh_sysvar *index;
|
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
|
#ifdef FINSH_USING_DESCRIPTION
|
||||||
rt_kprintf("%-16s -- %s\n", index->name, index->desc);
|
rt_kprintf("%-16s -- %s\n", index->name, index->desc);
|
||||||
|
@ -761,7 +763,9 @@ void list_prefix(char *prefix)
|
||||||
/* checks in system variable */
|
/* checks in system variable */
|
||||||
{
|
{
|
||||||
struct finsh_sysvar* index;
|
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)
|
if (str_is_prefix(prefix, index->name) == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,8 +64,16 @@ typedef unsigned char u_char;
|
||||||
typedef unsigned short u_short;
|
typedef unsigned short u_short;
|
||||||
typedef unsigned long u_long;
|
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;
|
typedef unsigned int size_t;
|
||||||
|
#else
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef NULL
|
#ifndef NULL
|
||||||
#define NULL RT_NULL
|
#define NULL RT_NULL
|
||||||
|
@ -148,11 +156,14 @@ struct finsh_sysvar
|
||||||
void* var ; /* the address of variable */
|
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_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_SYSCALL(index) index=finsh_syscall_next(index)
|
||||||
|
#define FINSH_NEXT_SYSVAR(index) index=finsh_sysvar_next(index)
|
||||||
#else
|
#else
|
||||||
#define FINSH_NEXT_SYSCALL(index) index++
|
#define FINSH_NEXT_SYSCALL(index) index++
|
||||||
|
#define FINSH_NEXT_SYSVAR(index) index++
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* system variable item */
|
/* system variable item */
|
||||||
|
|
|
@ -121,7 +121,9 @@ struct finsh_sysvar* finsh_sysvar_lookup(const char* name)
|
||||||
struct finsh_sysvar* index;
|
struct finsh_sysvar* index;
|
||||||
struct finsh_sysvar_item* item;
|
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)
|
if (strcmp(index->name, name) == 0)
|
||||||
return index;
|
return index;
|
||||||
|
|
|
@ -83,7 +83,7 @@ void finsh_syscall_append(const char* name, syscall_func func)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__))
|
||||||
struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call)
|
struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call)
|
||||||
{
|
{
|
||||||
unsigned int *ptr;
|
unsigned int *ptr;
|
||||||
|
@ -93,6 +93,16 @@ struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call)
|
||||||
|
|
||||||
return (struct finsh_syscall*)ptr;
|
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
|
#endif
|
||||||
|
|
||||||
struct finsh_syscall* finsh_syscall_lookup(const char* name)
|
struct finsh_syscall* finsh_syscall_lookup(const char* name)
|
||||||
|
|
|
@ -11,6 +11,13 @@ cwd = GetCurrentDir()
|
||||||
src = Glob('*.c')
|
src = Glob('*.c')
|
||||||
CPPPATH = [cwd]
|
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')
|
Return('group')
|
||||||
|
|
|
@ -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 (timo.kreuzer@reactos.org)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#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));
|
|
||||||
}
|
|
||||||
|
|
10
src/timer.c
10
src/timer.c
|
@ -276,9 +276,15 @@ rt_err_t rt_timer_start(rt_timer_t timer)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* It supposes that the new tick shall less than the half duration of
|
* 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));
|
rt_list_insert_before(n, &(timer->list));
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue