forked from Archive/PX4-Autopilot
Merge branch 'master' of github.com:PX4/Firmware
This commit is contained in:
commit
22c1a03af7
|
@ -22,8 +22,8 @@ As there is only one output, if using two servos adjustments to compensate for
|
|||
differences between the servos must be made mechanically. To obtain the correct
|
||||
motion using a Y cable, the servos can be positioned reversed from one another.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
|
||||
Elevator mixer
|
||||
|
@ -35,8 +35,8 @@ depending on the actual configuration it may be necessary to reverse the scaling
|
|||
factors (to reverse the servo movement) and adjust the offset, scaling and
|
||||
endpoints to suit.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 1 10000 10000 0 -10000 10000
|
||||
|
||||
Rudder mixer
|
||||
|
@ -48,8 +48,8 @@ depending on the actual configuration it may be necessary to reverse the scaling
|
|||
factors (to reverse the servo movement) and adjust the offset, scaling and
|
||||
endpoints to suit.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 2 10000 10000 0 -10000 10000
|
||||
|
||||
Motor speed mixer
|
||||
|
@ -59,6 +59,6 @@ Two scalers total (output, thrust).
|
|||
This mixer generates a full-range output (-1 to 1) from an input in the (0 - 1)
|
||||
range. Inputs below zero are treated as zero.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 3 0 20000 -10000 -10000 10000
|
||||
|
|
|
@ -25,8 +25,8 @@ motion using a Y cable, the servos can be positioned reversed from one another.
|
|||
Alternatively, output 2 could be used as a second aileron servo output with
|
||||
separate mixing.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
|
||||
Elevator mixer
|
||||
|
@ -38,8 +38,8 @@ depending on the actual configuration it may be necessary to reverse the scaling
|
|||
factors (to reverse the servo movement) and adjust the offset, scaling and
|
||||
endpoints to suit.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 1 10000 10000 0 -10000 10000
|
||||
|
||||
Output 2
|
||||
|
@ -55,6 +55,6 @@ Two scalers total (output, thrust).
|
|||
This mixer generates a full-range output (-1 to 1) from an input in the (0 - 1)
|
||||
range. Inputs below zero are treated as zero.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 3 0 20000 -10000 -10000 10000
|
||||
|
|
|
@ -18,8 +18,8 @@ depending on the actual configuration it may be necessary to reverse the scaling
|
|||
factors (to reverse the servo movement) and adjust the offset, scaling and
|
||||
endpoints to suit.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
|
||||
Elevator mixer
|
||||
|
@ -31,8 +31,8 @@ depending on the actual configuration it may be necessary to reverse the scaling
|
|||
factors (to reverse the servo movement) and adjust the offset, scaling and
|
||||
endpoints to suit.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 1 10000 10000 0 -10000 10000
|
||||
|
||||
Output 2
|
||||
|
@ -48,6 +48,6 @@ Two scalers total (output, thrust).
|
|||
This mixer generates a full-range output (-1 to 1) from an input in the (0 - 1)
|
||||
range. Inputs below zero are treated as zero.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 3 0 20000 -10000 -10000 10000
|
||||
|
|
|
@ -21,13 +21,13 @@ input is inverted between the two servos.
|
|||
The scaling factor for roll inputs is adjusted to implement differential travel
|
||||
for the elevons.
|
||||
|
||||
M: 3
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 2
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 0 3000 5000 0 -10000 10000
|
||||
S: 0 1 5000 5000 0 -10000 10000
|
||||
|
||||
M: 3
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 2
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 0 5000 3000 0 -10000 10000
|
||||
S: 0 1 -5000 -5000 0 -10000 10000
|
||||
|
||||
|
@ -44,7 +44,7 @@ Two scalers total (output, thrust).
|
|||
This mixer generates a full-range output (-1 to 1) from an input in the (0 - 1)
|
||||
range. Inputs below zero are treated as zero.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 3 0 20000 -10000 -10000 10000
|
||||
|
||||
|
|
|
@ -6,19 +6,19 @@ input range.
|
|||
|
||||
Channel group 0, channels 0-3 values 0.0 - 1.0 are scaled to the full output range.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 0 0 20000 -10000 -10000 10000
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 1 0 20000 -10000 -10000 10000
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 2 0 20000 -10000 -10000 10000
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 3 0 20000 -10000 -10000 10000
|
||||
|
||||
|
|
|
@ -5,19 +5,19 @@ This file defines passthrough mixers suitable for testing.
|
|||
|
||||
Channel group 0, channels 0-3 are passed directly through to the outputs.
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 1 10000 10000 0 -10000 10000
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 2 10000 10000 0 -10000 10000
|
||||
|
||||
M: 2
|
||||
S: 0 0 10000 10000 0 -10000 10000
|
||||
M: 1
|
||||
O: 10000 10000 0 -10000 10000
|
||||
S: 0 3 10000 10000 0 -10000 10000
|
||||
|
||||
|
|
|
@ -62,29 +62,67 @@ followed by a colon are significant. All other lines are ignored, meaning that
|
|||
explanatory text can be freely mixed with the definitions.
|
||||
|
||||
Each file may define more than one mixer; the allocation of mixers to actuators
|
||||
is specific to the device reading the mixer definition.
|
||||
is specific to the device reading the mixer definition, and the number of
|
||||
actuator outputs generated by a mixer is specific to the mixer.
|
||||
|
||||
A mixer begins with a line of the form
|
||||
|
||||
M: <scaler count>
|
||||
<tag>: <mixer arguments>
|
||||
|
||||
If the scaler count is zero, the mixer is a placeholder and the device will not
|
||||
allocate a mixer for this position. Otherwise, this line is followed by scaler
|
||||
definitions matching the given count.
|
||||
The tag selects the mixer type; 'M' for a simple summing mixer, 'R' for a
|
||||
multirotor mixer, etc.
|
||||
|
||||
A scaler definition is a line of the form:
|
||||
Null Mixer
|
||||
..........
|
||||
|
||||
S: <group> <index> <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
|
||||
A null mixer consumes no controls and generates a single actuator output whose
|
||||
value is always zero. Typically a null mixer is used as a placeholder in a
|
||||
collection of mixers in order to achieve a specific pattern of actuator outputs.
|
||||
|
||||
The first scaler definition following the M: line configures the output scaler.
|
||||
The <group> and <index> fields are ignored in this case.
|
||||
The null mixer definition has the form:
|
||||
|
||||
For the remaining scalers, the <group> value identifies the control group from
|
||||
which the scaler will read. Control group 0 is the vehicle attitude control
|
||||
group; other group numbers may be assigned for other purposes. The <index> value
|
||||
selects the control within the group that will be scaled.
|
||||
Z:
|
||||
|
||||
The remaining fields on the line represent the scaler parameters as discussed
|
||||
Simple Mixer
|
||||
............
|
||||
|
||||
A simple mixer combines zero or more control inputs into a single actuator
|
||||
output. Inputs are scaled, and the mixing function sums the result before
|
||||
applying an output scaler.
|
||||
|
||||
A simple mixer definition begins with:
|
||||
|
||||
M: <control count>
|
||||
O: <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
|
||||
|
||||
If <control count> is zero, the sum is effectively zero and the mixer will
|
||||
output a fixed value that is <offset> constrained by <lower limit> and <upper
|
||||
limit>.
|
||||
|
||||
The second line defines the output scaler with scaler parameters as discussed
|
||||
above. Whilst the calculations are performed as floating-point operations, the
|
||||
values stored in the definition file are scaled by a factor of 10000; i.e. an
|
||||
offset of -0.5 is encoded as -5000.
|
||||
|
||||
The definition continues with <control count> entries describing the control
|
||||
inputs and their scaling, in the form:
|
||||
|
||||
S: <group> <index> <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
|
||||
|
||||
The <group> value identifies the control group from which the scaler will read,
|
||||
and the <index> value an offset within that group. These values are specific to
|
||||
the device reading the mixer definition.
|
||||
|
||||
When used to mix vehicle controls, mixer group zero is the vehicle attitude
|
||||
control group, and index values zero through three are normally roll, pitch,
|
||||
yaw and thrust respectively.
|
||||
|
||||
The remaining fields on the line configure the control scaler with parameters as
|
||||
discussed above. Whilst the calculations are performed as floating-point
|
||||
operations, the values stored in the definition file are scaled by a factor of
|
||||
10000; i.e. an offset of -0.5 is encoded as -5000.
|
||||
|
||||
Multirotor Mixer
|
||||
................
|
||||
|
||||
The multirotor mixer is not yet defined.
|
||||
|
|
|
@ -81,7 +81,7 @@ struct mixer_scaler_s
|
|||
};
|
||||
|
||||
/** mixer input */
|
||||
struct mixer_input_s
|
||||
struct mixer_control_s
|
||||
{
|
||||
uint8_t control_group; /**< group from which the input reads */
|
||||
uint8_t control_index; /**< index within the control group */
|
||||
|
@ -91,12 +91,12 @@ struct mixer_input_s
|
|||
/** simple mixer */
|
||||
struct mixer_simple_s
|
||||
{
|
||||
uint8_t input_count; /**< number of inputs */
|
||||
uint8_t control_count; /**< number of inputs */
|
||||
struct mixer_scaler_s output_scaler; /**< scaling for the output */
|
||||
struct mixer_input_s inputs[0]; /**< actual size of the array is set by input_count */
|
||||
struct mixer_control_s controls[0]; /**< actual size of the array is set by control_count */
|
||||
};
|
||||
|
||||
#define MIXER_SIMPLE_SIZE(_icount) (sizeof(struct mixer_simple_s) + (_icount) * sizeof(struct mixer_input_s))
|
||||
#define MIXER_SIMPLE_SIZE(_icount) (sizeof(struct mixer_simple_s) + (_icount) * sizeof(struct mixer_control_s))
|
||||
|
||||
/**
|
||||
* add a simple mixer in (struct mixer_simple_s *)arg
|
||||
|
@ -114,7 +114,7 @@ struct mixer_rotor_output_s
|
|||
struct mixer_multirotor_s
|
||||
{
|
||||
uint8_t rotor_count;
|
||||
struct mixer_input_s inputs[4]; /**< inputs are roll, pitch, yaw, thrust */
|
||||
struct mixer_control_s controls[4]; /**< controls are roll, pitch, yaw, thrust */
|
||||
struct mixer_rotor_output_s rotors[0]; /**< actual size of the array is set by rotor_count */
|
||||
};
|
||||
|
||||
|
|
|
@ -371,9 +371,15 @@ o get [-b|-n] [-f <local-path>] -h <ip-address> <remote-path>
|
|||
Selects either binary ("octect") or test ("netascii") transfer
|
||||
mode. Default: text.
|
||||
|
||||
o help
|
||||
o help [-v] [<cmd>]
|
||||
|
||||
Presents summary information about each command to console.
|
||||
Presents summary information about NSH commands to console. Options:
|
||||
|
||||
-v
|
||||
Show verbose output will full command usage
|
||||
|
||||
<cmd>
|
||||
Show full command usage only for this command
|
||||
|
||||
o ifconfig
|
||||
|
||||
|
@ -499,14 +505,14 @@ o mkfatfs <path>
|
|||
|
||||
Format a fat file system on the block device specified by path.
|
||||
NSH provides this command to access the mkfatfs() NuttX API.
|
||||
This block device must reside in the NuttX psuedo filesystem and
|
||||
This block device must reside in the NuttX pseudo filesystem and
|
||||
must have been created by some call to register_blockdriver() (see
|
||||
include/nuttx/fs/fs.h).
|
||||
|
||||
o mkfifo <path>
|
||||
|
||||
Creates a FIFO character device anywhere in the pseudo file system,
|
||||
creating whatever psuedo directories that may be needed to complete
|
||||
creating whatever pseudo directories that may be needed to complete
|
||||
the full path. By convention, however, device drivers are place in
|
||||
the standard /dev directory. After it is created, the FIFO device
|
||||
may be used as any other device driver. NSH provides this command
|
||||
|
@ -578,7 +584,7 @@ o mount [-t <fstype> <block-device> <dir-path>]
|
|||
|
||||
If the mount parameters are provied on the command after the 'mount'
|
||||
command, then the 'mount' command will mount a file system in the
|
||||
NuttX psuedo-file system. 'mount' performs a three way association,
|
||||
NuttX pseudo-file system. 'mount' performs a three way association,
|
||||
binding:
|
||||
|
||||
File system. The '-t <fstype>' option identifies the type of
|
||||
|
@ -586,19 +592,19 @@ o mount [-t <fstype> <block-device> <dir-path>]
|
|||
of this writing, vfat is the only supported value for <fstype>
|
||||
|
||||
Block Device. The <block-device> argument is the full or relative
|
||||
path to a block driver inode in the psuedo filesystem. By convention,
|
||||
path to a block driver inode in the pseudo filesystem. By convention,
|
||||
this is a name under the /dev sub-directory. This <block-device>
|
||||
must have been previously formatted with the same file system
|
||||
type as specified by <fstype>
|
||||
|
||||
Mount Point. The mount point is the location in the psuedo file
|
||||
Mount Point. The mount point is the location in the pseudo file
|
||||
system where the mounted volume will appear. This mount point
|
||||
can only reside in the NuttX psuedo filesystem. By convention, this
|
||||
can only reside in the NuttX pseudo filesystem. By convention, this
|
||||
mount point is a subdirectory under /mnt. The mount command will
|
||||
create whatever psuedo directories that may be needed to complete
|
||||
create whatever pseudo directories that may be needed to complete
|
||||
the full path but the full path must not already exist.
|
||||
|
||||
After the volume has been mounted in the NuttX psuedo file
|
||||
After the volume has been mounted in the NuttX pseudo file
|
||||
system, it may be access in the same way as other objects in the
|
||||
file system.
|
||||
|
||||
|
@ -889,6 +895,9 @@ also allow it to squeeze into very small memory footprints.
|
|||
CONFIG_NSH_DISABLE_UNSET, CONFIG_NSH_DISABLE_USLEEP, CONFIG_NSH_DISABLE_WGET,
|
||||
CONFIG_NSH_DISABLE_XD
|
||||
|
||||
Verbose help output can be suppressed by defining CONFIG_NSH_HELP_TERSE. In that
|
||||
case, the help command is still available but will be slightly smaller.
|
||||
|
||||
NSH-Specific Configuration Settings
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
|
|
@ -88,12 +88,12 @@
|
|||
# define MAX_ARGV_ENTRIES (NSH_MAX_ARGUMENTS+4)
|
||||
#endif
|
||||
|
||||
/* Help layout */
|
||||
/* Help command summary layout */
|
||||
|
||||
#define MAX_CMDLEN 12
|
||||
#define CMDS_PER_LINE 5
|
||||
#define CMDS_PER_LINE 6
|
||||
|
||||
#define NUM_CMDS (sizeof(g_cmdmap)/sizeof(struct cmdmap_s))
|
||||
#define NUM_CMDS ((sizeof(g_cmdmap)/sizeof(struct cmdmap_s)) - 1)
|
||||
#define NUM_CMD_ROWS ((NUM_CMDS + (CMDS_PER_LINE-1)) / CMDS_PER_LINE)
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -211,7 +211,11 @@ static const struct cmdmap_s g_cmdmap[] =
|
|||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_HELP
|
||||
{ "help", cmd_help, 1, 3, "[-v] [cmd]" },
|
||||
# ifdef CONFIG_NSH_HELP_TERSE
|
||||
{ "help", cmd_help, 1, 2, "[<cmd>]" },
|
||||
#else
|
||||
{ "help", cmd_help, 1, 3, "[-v] [<cmd>]" },
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET
|
||||
|
@ -439,7 +443,7 @@ static inline void help_cmdlist(FAR struct nsh_vtbl_s *vtbl)
|
|||
for (i = 0; i < NUM_CMD_ROWS; i++)
|
||||
{
|
||||
nsh_output(vtbl, " ");
|
||||
for (j = 0, k = i; j < CMDS_PER_LINE && k < NUM_CMDS; j++, k += CMDS_PER_LINE)
|
||||
for (j = 0, k = i; j < CMDS_PER_LINE && k < NUM_CMDS; j++, k += NUM_CMD_ROWS)
|
||||
{
|
||||
nsh_output(vtbl, "%-12s", g_cmdmap[k].cmd);
|
||||
}
|
||||
|
@ -453,7 +457,7 @@ static inline void help_cmdlist(FAR struct nsh_vtbl_s *vtbl)
|
|||
* Name: help_usage
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_HELP
|
||||
#if !defined(CONFIG_NSH_DISABLE_HELP) && !defined(CONFIG_NSH_HELP_TERSE)
|
||||
static inline void help_usage(FAR struct nsh_vtbl_s *vtbl)
|
||||
{
|
||||
nsh_output(vtbl, "NSH command forms:\n");
|
||||
|
@ -512,6 +516,7 @@ static int help_cmd(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd)
|
|||
{
|
||||
/* Yes... show it */
|
||||
|
||||
nsh_output(vtbl, "%s usage:", cmd);
|
||||
help_showcmd(vtbl, cmdmap);
|
||||
return OK;
|
||||
}
|
||||
|
@ -526,7 +531,7 @@ static int help_cmd(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd)
|
|||
* Name: help_allcmds
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_HELP
|
||||
#if !defined(CONFIG_NSH_DISABLE_HELP) && !defined(CONFIG_NSH_HELP_TERSE)
|
||||
static inline void help_allcmds(FAR struct nsh_vtbl_s *vtbl)
|
||||
{
|
||||
FAR const struct cmdmap_s *cmdmap;
|
||||
|
@ -569,12 +574,15 @@ static inline void help_builtins(FAR struct nsh_vtbl_s *vtbl)
|
|||
#ifndef CONFIG_NSH_DISABLE_HELP
|
||||
static int cmd_help(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
bool verbose = false;
|
||||
FAR const char *cmd = NULL;
|
||||
#ifndef CONFIG_NSH_HELP_TERSE
|
||||
bool verbose = false;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
/* The command may be followed by a verbose option */
|
||||
|
||||
#ifndef CONFIG_NSH_HELP_TERSE
|
||||
i = 1;
|
||||
if (argc > i)
|
||||
{
|
||||
|
@ -598,6 +606,12 @@ static int cmd_help(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
|||
{
|
||||
help_usage(vtbl);
|
||||
}
|
||||
#else
|
||||
if (argc > 1)
|
||||
{
|
||||
cmd = argv[1];
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Are we showing help on a single command? */
|
||||
|
||||
|
@ -605,13 +619,13 @@ static int cmd_help(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
|||
{
|
||||
/* Yes.. show the single command */
|
||||
|
||||
nsh_output(vtbl, "%s usage:", cmd);
|
||||
help_cmd(vtbl, cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* In verbose mode, show detailed help for all commands */
|
||||
|
||||
#ifndef CONFIG_NSH_HELP_TERSE
|
||||
if (verbose)
|
||||
{
|
||||
nsh_output(vtbl, "Where <cmd> is one of:\n");
|
||||
|
@ -621,8 +635,8 @@ static int cmd_help(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
|||
/* Otherwise, just show the list of command names */
|
||||
|
||||
else
|
||||
#endif
|
||||
{
|
||||
nsh_output(vtbl, "help usage:");
|
||||
help_cmd(vtbl, "help");
|
||||
nsh_output(vtbl, "\n");
|
||||
help_cmdlist(vtbl);
|
||||
|
|
|
@ -226,7 +226,7 @@ FMUServo::task_main()
|
|||
while (!_task_should_exit) {
|
||||
|
||||
/* sleep waiting for data, but no more than 100ms */
|
||||
int ret = ::poll(&fds[0], 2, 100);
|
||||
int ret = ::poll(&fds[0], 2, 1000);
|
||||
|
||||
/* this would be bad... */
|
||||
if (ret < 0) {
|
||||
|
@ -239,17 +239,21 @@ FMUServo::task_main()
|
|||
if (fds[0].revents & POLLIN) {
|
||||
float outputs[num_outputs];
|
||||
|
||||
/* get controls */
|
||||
/* get controls - must always do this to avoid spinning */
|
||||
orb_copy(ORB_ID_VEHICLE_ATTITUDE_CONTROLS, _t_actuators, &_controls);
|
||||
|
||||
/* do mixing */
|
||||
_mixers->mix(&outputs[0], num_outputs);
|
||||
/* can we mix? */
|
||||
if (_mixers != nullptr) {
|
||||
|
||||
/* iterate actuators */
|
||||
for (unsigned i = 0; i < num_outputs; i++) {
|
||||
/* do mixing */
|
||||
_mixers->mix(&outputs[0], num_outputs);
|
||||
|
||||
/* scale for PWM output 900 - 2100us */
|
||||
up_pwm_servo_set(i, 1500 + (600 * outputs[i]));
|
||||
/* iterate actuators */
|
||||
for (unsigned i = 0; i < num_outputs; i++) {
|
||||
|
||||
/* scale for PWM output 900 - 2100us */
|
||||
up_pwm_servo_set(i, 1500 + (600 * outputs[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -151,15 +151,15 @@ SimpleMixer::mix(float *outputs, unsigned space)
|
|||
if (space < 1)
|
||||
return 0;
|
||||
|
||||
for (unsigned i = 0; i < _info->input_count; i++) {
|
||||
for (unsigned i = 0; i < _info->control_count; i++) {
|
||||
float input;
|
||||
|
||||
_control_cb(_cb_handle,
|
||||
_info->inputs[i].control_group,
|
||||
_info->inputs[i].control_index,
|
||||
_info->controls[i].control_group,
|
||||
_info->controls[i].control_index,
|
||||
input);
|
||||
|
||||
sum += scale(_info->inputs[i].scaler, input);
|
||||
sum += scale(_info->controls[i].scaler, input);
|
||||
}
|
||||
*outputs = scale(_info->output_scaler, sum);
|
||||
return 1;
|
||||
|
@ -168,8 +168,8 @@ SimpleMixer::mix(float *outputs, unsigned space)
|
|||
void
|
||||
SimpleMixer::groups_required(uint32_t &groups)
|
||||
{
|
||||
for (unsigned i = 0; i < _info->input_count; i++)
|
||||
groups |= 1 << _info->inputs[i].control_group;
|
||||
for (unsigned i = 0; i < _info->control_count; i++)
|
||||
groups |= 1 << _info->controls[i].control_group;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -180,7 +180,7 @@ SimpleMixer::check()
|
|||
|
||||
/* sanity that presumes that a mixer includes a control no more than once */
|
||||
/* max of 32 groups due to groups_required API */
|
||||
if (_info->input_count > 32)
|
||||
if (_info->control_count > 32)
|
||||
return -2;
|
||||
|
||||
/* validate the output scaler */
|
||||
|
@ -190,18 +190,18 @@ SimpleMixer::check()
|
|||
return ret;
|
||||
|
||||
/* validate input scalers */
|
||||
for (unsigned i = 0; i < _info->input_count; i++) {
|
||||
for (unsigned i = 0; i < _info->control_count; i++) {
|
||||
|
||||
/* verify that we can fetch the control */
|
||||
if (_control_cb(_cb_handle,
|
||||
_info->inputs[i].control_group,
|
||||
_info->inputs[i].control_index,
|
||||
_info->controls[i].control_group,
|
||||
_info->controls[i].control_index,
|
||||
junk) != 0) {
|
||||
return -3;
|
||||
}
|
||||
|
||||
/* validate the scaler */
|
||||
ret = scale_check(_info->inputs[i].scaler);
|
||||
ret = scale_check(_info->controls[i].scaler);
|
||||
|
||||
if (ret != 0)
|
||||
return (10 * i + ret);
|
||||
|
|
|
@ -53,6 +53,9 @@
|
|||
|
||||
#include "mixer.h"
|
||||
|
||||
#define debug(fmt, args...) do { } while(0)
|
||||
//#define debug(fmt, args...) do { printf("[mixer] " fmt "\n", ##args); } while(0)
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
|
@ -76,8 +79,10 @@ mixer_getline(int fd, char *line, unsigned maxlen)
|
|||
ret = read(fd, &c, 1);
|
||||
|
||||
/* on error or EOF, return same */
|
||||
if (ret <= 0)
|
||||
if (ret <= 0) {
|
||||
debug("read: EOF");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* ignore carriage returns */
|
||||
if (c == '\r')
|
||||
|
@ -94,6 +99,7 @@ mixer_getline(int fd, char *line, unsigned maxlen)
|
|||
|
||||
/* terminate line as string and return */
|
||||
*p = '\0';
|
||||
debug("read: '%s'", line);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -105,17 +111,42 @@ mixer_getline(int fd, char *line, unsigned maxlen)
|
|||
}
|
||||
|
||||
/**
|
||||
* Parse a scaler from the buffer.
|
||||
* Parse an output scaler from the buffer.
|
||||
*/
|
||||
static int
|
||||
mixer_parse_scaler(const char *buf, mixer_scaler_s &scaler, uint8_t &control_group, uint8_t &control_index)
|
||||
mixer_parse_output_scaler(const char *buf, mixer_scaler_s &scaler)
|
||||
{
|
||||
int s[5];
|
||||
|
||||
if (sscanf(buf, "O: %d %d %d %d %d",
|
||||
&s[0], &s[1], &s[2], &s[3], &s[4]) != 5) {
|
||||
debug("scaler parse failed on '%s'", buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
scaler.negative_scale = s[0] / 10000.0f;
|
||||
scaler.positive_scale = s[1] / 10000.0f;
|
||||
scaler.offset = s[2] / 10000.0f;
|
||||
scaler.min_output = s[3] / 10000.0f;
|
||||
scaler.max_output = s[4] / 10000.0f;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a control scaler from the buffer.
|
||||
*/
|
||||
static int
|
||||
mixer_parse_control_scaler(const char *buf, mixer_scaler_s &scaler, uint8_t &control_group, uint8_t &control_index)
|
||||
{
|
||||
unsigned u[2];
|
||||
int s[5];
|
||||
|
||||
if (sscanf(buf, "S: %u %u %d %d %d %d %d",
|
||||
&u[0], &u[1], &s[0], &s[1], &s[2], &s[3], &s[4]) != 7)
|
||||
&u[0], &u[1], &s[0], &s[1], &s[2], &s[3], &s[4]) != 7) {
|
||||
debug("scaler parse failed on '%s'", buf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
control_group = u[0];
|
||||
control_index = u[1];
|
||||
|
@ -133,7 +164,6 @@ mixer_load_simple(Mixer::ControlCallback control_cb, uintptr_t cb_handle, int fd
|
|||
{
|
||||
mixer_simple_s *mixinfo = nullptr;
|
||||
char buf[60];
|
||||
uint8_t control_group, control_index;
|
||||
int ret;
|
||||
|
||||
/* let's assume we're going to read a simple mixer */
|
||||
|
@ -141,22 +171,30 @@ mixer_load_simple(Mixer::ControlCallback control_cb, uintptr_t cb_handle, int fd
|
|||
|
||||
/* first, get the output scaler */
|
||||
ret = mixer_getline(fd, buf, sizeof(buf));
|
||||
if (ret < 1)
|
||||
if (ret < 1) {
|
||||
debug("failed reading for output scaler");
|
||||
goto fail;
|
||||
if (mixer_parse_scaler(buf, mixinfo->output_scaler, control_group, control_index))
|
||||
}
|
||||
if (mixer_parse_output_scaler(buf, mixinfo->output_scaler)) {
|
||||
debug("failed parsing output scaler");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* now get any inputs */
|
||||
for (unsigned i = 0; i < inputs; i++) {
|
||||
ret = mixer_getline(fd, buf, sizeof(buf));
|
||||
if (ret < 1)
|
||||
goto fail;
|
||||
if (mixer_parse_scaler(buf,
|
||||
mixinfo->inputs[i].scaler,
|
||||
mixinfo->inputs[i].control_group,
|
||||
mixinfo->inputs[i].control_index)) {
|
||||
if (ret < 1) {
|
||||
debug("failed reading for control scaler");
|
||||
goto fail;
|
||||
}
|
||||
if (mixer_parse_control_scaler(buf,
|
||||
mixinfo->controls[i].scaler,
|
||||
mixinfo->controls[i].control_group,
|
||||
mixinfo->controls[i].control_index)) {
|
||||
debug("failed parsing control scaler");
|
||||
goto fail;
|
||||
}
|
||||
debug("got control %d", i);
|
||||
}
|
||||
|
||||
/* XXX should be a factory that validates the mixinfo ... */
|
||||
|
@ -172,27 +210,32 @@ mixer_load(Mixer::ControlCallback control_cb, uintptr_t cb_handle, int fd, Mixer
|
|||
{
|
||||
int ret;
|
||||
char buf[60];
|
||||
unsigned scalers;
|
||||
unsigned inputs;
|
||||
|
||||
ret = mixer_getline(fd, buf, sizeof(buf));
|
||||
|
||||
/* end of file or error ?*/
|
||||
if (ret < 1)
|
||||
if (ret < 1) {
|
||||
debug("getline %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* slot is empty - allocate a null mixer */
|
||||
if (buf[0] == 'Z') {
|
||||
debug("got null mixer");
|
||||
mixer = new NullMixer();
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* is it a simple mixer? */
|
||||
if (sscanf(buf, "M: %u", &scalers) == 1) {
|
||||
mixer = mixer_load_simple(control_cb, cb_handle, fd, scalers);
|
||||
return (mixer == nullptr) ? -1 : 0;
|
||||
if (sscanf(buf, "M: %u", &inputs) == 1) {
|
||||
debug("got simple mixer with %d inputs", inputs);
|
||||
mixer = mixer_load_simple(control_cb, cb_handle, fd, inputs);
|
||||
return (mixer == nullptr) ? -1 : 1;
|
||||
}
|
||||
|
||||
/* we don't recognise the mixer type */
|
||||
debug("unrecognized mixer type '%c'", buf[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -260,10 +303,12 @@ MixerGroup::load_from_file(const char *path)
|
|||
return -1;
|
||||
|
||||
int fd = open(path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
if (fd < 0) {
|
||||
debug("failed to open %s", path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
for (unsigned count = 0;; count++) {
|
||||
int result;
|
||||
Mixer *mixer;
|
||||
|
||||
|
@ -273,13 +318,19 @@ MixerGroup::load_from_file(const char *path)
|
|||
mixer);
|
||||
|
||||
/* error? */
|
||||
if (result < 0)
|
||||
if (result < 0) {
|
||||
debug("error");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* EOF or error */
|
||||
if (result < 1)
|
||||
if (result < 1) {
|
||||
printf("[mixer] loaded %u mixers\n", count);
|
||||
debug("EOF");
|
||||
break;
|
||||
}
|
||||
|
||||
debug("loaded mixer %p", mixer);
|
||||
add_mixer(mixer);
|
||||
}
|
||||
|
||||
|
|
|
@ -816,7 +816,7 @@
|
|||
and (2) it requires symbol table arguments.
|
||||
* lib/: Add fileno()
|
||||
* examples/ostest: Several of the tests used a big, hard-coded stack size
|
||||
when creating test threads (16Kb stacksize). The stack size should
|
||||
when creating test threads (16K stacksize). The stack size should
|
||||
be controlled by the .config file or the OSTest won't work on platforms
|
||||
with memory constraints.
|
||||
* netutils/thttpd: An initial port of Jeff Poskanzer's THTTPD HTTP server.
|
||||
|
@ -1369,10 +1369,10 @@
|
|||
out instead. This improves behavior, for example, on the first GET request
|
||||
from a browser.
|
||||
* arch/arm/src/lpc17xx/lpc17_emacram.h and lpc17_allocateheap.c: The Ethernet
|
||||
logic was using all of AHB SRAM Bank0 for Ethernet packet buffers (16Kb). An
|
||||
logic was using all of AHB SRAM Bank0 for Ethernet packet buffers (16K). An
|
||||
option was added to limit the amount of SRAM used for packet buffering and to
|
||||
re-use any extra Bank0 memory for heap. configs/olimex-lpc1766stk/nettest
|
||||
now uses only 8Kb at the beginning of Bank0; the 8Kb at the end of Bank0 is
|
||||
now uses only 8K at the beginning of Bank0; the 8K at the end of Bank0 is
|
||||
included in the heap
|
||||
* arch/arm/src/lpc17xx/lpc17_ssp.c: Fix compilation errors when SSP1 is
|
||||
selected.
|
||||
|
@ -1785,7 +1785,7 @@
|
|||
that support 16-bit addressability have smaller overhead than devices
|
||||
that support 32-bit addressability. However, there are many MCUs
|
||||
that support 32-bit addressability *but* have internal SRAM of size
|
||||
less than or equal to 64Kb. In this case, CONFIG_MM_SMALL can be
|
||||
less than or equal to 64K. In this case, CONFIG_MM_SMALL can be
|
||||
defined so that those MCUs will also benefit from the smaller, 16-
|
||||
bit-based allocation overhead.
|
||||
* lib/string/lib_strndup.c: Add standard strndup() library function.
|
||||
|
@ -1846,7 +1846,7 @@
|
|||
* arch/sim/src/up_romgetc.c: Used to test the basic logic to access strings
|
||||
without directly de-referencing a string pointer.
|
||||
* arch/avr/src/avr/up_romget.c: Used to access strings that lie in the first
|
||||
64Kb of FLASH (But I still haven't figured out how to get strings to reside in
|
||||
64K of FLASH (But I still haven't figured out how to get strings to reside in
|
||||
FLASH without using the PROGMEM attribute).
|
||||
* configs/teensy/src/up_spi.c: Correct reading of SD CD and WP pins (was reading
|
||||
the wrong register. AVR SPI now appears to be functional.
|
||||
|
@ -3119,9 +3119,38 @@
|
|||
function called stm32_clockenable() that can be used by PM logic to re-start
|
||||
the PLL after re-awakening from deep sleep modes.
|
||||
* fs/fs_foreachinode.c and fs/fs_foreachmountpoint.c: All logic to traverse
|
||||
inodes and mountpoints in the NuttX psuedo-file system.
|
||||
inodes and mountpoints in the NuttX pseudo-file system.
|
||||
* fs/fat/fs_fat32.c: Max. filename length reported by statfs() was wrong
|
||||
if FAT long file names were enabled.
|
||||
* lib/stdio/lib_libvsprintf.c: Fieldwidth and justification were not
|
||||
supported for the %s format. As a result, %s, %12s, and %-12s all
|
||||
produced the same output.
|
||||
* lib/stdio/lib_libdtoa.c: Fix several issues with presenting floating
|
||||
point numbers (conversions are fine, but presentation was bad). This
|
||||
is a critical bug fix if you use printf or sprintf to deal with floating
|
||||
point numbers.
|
||||
* lib/stdio/lib_libdtoa.c and lib_libvsprintf.c: Correct some floating
|
||||
point options.
|
||||
* arch/arm/lpc43xx/lpc32_usb0dev.c: Add framework for development of
|
||||
an USB0, device-side driver for the LPC43XX. The initial check-in,
|
||||
however, is simply for the LPC31xx driver with name changes. The
|
||||
LPC31xx has the same USB IP, but will require some additional initialization
|
||||
(and lots of testing) before it can be used with the LPC43xx.
|
||||
* nuttx/Documentation/NuttShell.html: Added a section covering ways to
|
||||
customize the behavior or NSH.
|
||||
* arch/arm/src/stm32/chip/stm32f1*_pinmap.h: STM32 CAN TX/RX pins reversed;
|
||||
inconsistent conditional compilation. Reported by Max Holtzberg.
|
||||
* arch/arm/*/stm32: Add support for STM32 F107 "Connectivity Line"
|
||||
Ethernet (contributed by Max Holtzberg).
|
||||
* configs/olimex-stm32-p107: Add board support for the Olimiex STM32-P107
|
||||
board (contributed by Max Holtzberg).
|
||||
* arch/arm/src/stm32/stm32f2xx_dma.c, stm32f4xx_dma.c, stm32_serial.c, and
|
||||
stm32_spic.c: DMA priority was getting zeroed by STM32 F2/F4 DMA drivers
|
||||
so that all DMAs ran at the lowest priority.
|
||||
* configs/stm3240g-eval/include/board.h and configs/stm3220: Drop SD card
|
||||
frequency from 24 to 16 MHz. Apparently 24 MHz is too fast for the board.
|
||||
This (plus the change to the STM32 DMA (above) fixes SDIO DMA on the
|
||||
STM3240G-EVAL (and probably STM3220G-EVAL -- untested).
|
||||
* arch/arm/src/stm32/stm32f2xx_dma.c and stm32f4xx_dma.c: Backed out the
|
||||
DMA priority change just above. The reduced SD card frequency was
|
||||
necessary and sufficient to resolve the problem.
|
||||
|
|
|
@ -1668,7 +1668,7 @@ Important bugfixes included:
|
|||
And feature enhancements:
|
||||
|
||||
* The LPC176x Ethernet driver was using all of AHB SRAM Bank0 for
|
||||
Ethernet packet buffers (16Kb). An option was added to limit
|
||||
Ethernet packet buffers (16K). An option was added to limit
|
||||
the amount of SRAM used for packet buffering and to re-use any
|
||||
extra Bank0 memory for heap.
|
||||
|
||||
|
@ -2022,7 +2022,7 @@ and is available for download from the SourceForge website. The
|
|||
* A PCI-based E1000 Ethernet driver (contributed by Yu Qiang)
|
||||
* New C library functions: inet_addr() (contributed by Yu Qiang),
|
||||
strndup(), asprintf()
|
||||
* Reduced memory allocation overhead for MCUs with small heaps (<64Kb).
|
||||
* Reduced memory allocation overhead for MCUs with small heaps (<64K).
|
||||
* fdopen() now works with socket descriptors allowing standard
|
||||
buffered C functions to be used for network communications.
|
||||
* The NSH ifconfig command can now be used to set or change the
|
||||
|
@ -2062,7 +2062,7 @@ they are, ordered from the least to the most complete:
|
|||
This port of NuttX to the Amber Web Server from SoC Robotics
|
||||
(http://www.soc-robotics.com/index.htm). Is only partially in
|
||||
place. The Amber Web Server is based on an Atmel ATMega128
|
||||
(128Kb FLASH but only 4Kb of SRAM).
|
||||
(128K FLASH but only 4K of SRAM).
|
||||
|
||||
STATUS: Work on this port has stalled due to toolchain issues. It
|
||||
is complete, but untested.
|
||||
|
@ -2073,7 +2073,7 @@ they are, ordered from the least to the most complete:
|
|||
Micropendous3 may be populated with an AT90USB646, 647, 1286,
|
||||
or 1287. See http://code.google.com/p/opendous/. I have only
|
||||
the AT90USB647 version for testing. This version has very
|
||||
limited memory resources: 64Kb of FLASH and 4Kb of SRAM.
|
||||
limited memory resources: 64K of FLASH and 4K of SRAM.
|
||||
|
||||
STATUS: The basic port was released in NuttX-6.5. This basic
|
||||
port consists only of a "Hello, World!!" example that demonstrates
|
||||
|
@ -2085,8 +2085,8 @@ they are, ordered from the least to the most complete:
|
|||
|
||||
This is a port of NuttX to the PJRC Teensy++ 2.0 board. This
|
||||
board was developed by PJRC (http://pjrc.com/teensy/). The
|
||||
Teensy++ 2.0 is based on an Atmel AT90USB1286 MCU with 128Kb
|
||||
of FLASH and 8Kb of SRAM; a little more room to move than the
|
||||
Teensy++ 2.0 is based on an Atmel AT90USB1286 MCU with 128K
|
||||
of FLASH and 8K of SRAM; a little more room to move than the
|
||||
AT90USB647.
|
||||
|
||||
STATUS: The basic port was released in NuttX-6.5. This basic
|
||||
|
@ -2109,7 +2109,7 @@ integrated into the normal, general purpose OS.
|
|||
Most NuttX test applications are console-oriented with lots of
|
||||
strings used for printf and debug output. These strings are all
|
||||
stored in SRAM now due to these data accessing issues and even the
|
||||
smallest console-oriented applications can quickly fill a 4-8Kb
|
||||
smallest console-oriented applications can quickly fill a 4-8K
|
||||
memory. So, in order for the AVR port to be useful, one of two
|
||||
things would need to be done:
|
||||
|
||||
|
|
46
nuttx/TODO
46
nuttx/TODO
|
@ -1,4 +1,4 @@
|
|||
NuttX TODO List (Last updated August 3, 2012)
|
||||
NuttX TODO List (Last updated August 7, 2012)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This file summarizes known NuttX bugs, limitations, inconsistencies with
|
||||
|
@ -15,14 +15,14 @@ nuttx/
|
|||
(5) Binary loaders (binfmt/)
|
||||
(17) Network (net/, drivers/net)
|
||||
(3) USB (drivers/usbdev, drivers/usbhost)
|
||||
(9) Libraries (lib/)
|
||||
(11) Libraries (lib/)
|
||||
(10) File system/Generic drivers (fs/, drivers/)
|
||||
(5) Graphics subystem (graphics/)
|
||||
(1) Pascal add-on (pcode/)
|
||||
(1) Documentation (Documentation/)
|
||||
(6) Build system / Toolchains
|
||||
(5) Linux/Cywgin simulation (arch/sim)
|
||||
(5) ARM (arch/arm/)
|
||||
(6) ARM (arch/arm/)
|
||||
(1) ARM/C5471 (arch/arm/src/c5471/)
|
||||
(3) ARM/DM320 (arch/arm/src/dm320/)
|
||||
(2) ARM/i.MX (arch/arm/src/imx/)
|
||||
|
@ -685,6 +685,19 @@ o Libraries (lib/)
|
|||
Status: Open
|
||||
Priority: Low -- more of a roadmap
|
||||
|
||||
Title: FLOATING POINT FORMATS
|
||||
Description: Only the %f floating point format is supported. Others are accepted
|
||||
but treated like %f.
|
||||
Status: Open
|
||||
Priority: Medium (this might important to someone).
|
||||
|
||||
Title: FLOATING POINT PRECISION
|
||||
Description: A fieldwidth and precision is required with the %f format. If %f
|
||||
is used with no format, than floating numbers will be printed with
|
||||
a precision of 0 (effectively presented as integers).
|
||||
Status: Open
|
||||
Priority: Medium (this might important to someone).
|
||||
|
||||
o File system / Generic drivers (fs/, drivers/)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -703,9 +716,9 @@ o File system / Generic drivers (fs/, drivers/)
|
|||
|
||||
Title: REMOVING PIPES AND FIFOS
|
||||
Description: There is no way to remove a FIFO or PIPE created in the
|
||||
psuedo filesystem. Once created, they persist indefinitely
|
||||
pseudo filesystem. Once created, they persist indefinitely
|
||||
and cannot be unlinked. This is actually a more generic
|
||||
issue: unlink does not work for anything in the psuedo-
|
||||
issue: unlink does not work for anything in the pseudo-
|
||||
filesystem.
|
||||
Status: Open, but partially resolved: pipe buffer is at least freed
|
||||
when there are not open references to the pipe/FIFO.
|
||||
|
@ -906,7 +919,7 @@ o Build system
|
|||
Status: Open
|
||||
Priority: Low.
|
||||
|
||||
Title: KERNEL BUILD MODE ISSUES
|
||||
Title: KERNEL BUILD MODE ISSUES - GRAPHICS/NSH PARTITIONING.
|
||||
Description: In the kernel build mode (where NuttX is built as a monlithic
|
||||
kernel and user code must trap into the protected kernel via
|
||||
syscalls), the single user mode cannot be supported. In this
|
||||
|
@ -915,6 +928,9 @@ o Build system
|
|||
this case, most of the user end functions in graphics/nxmu
|
||||
must be moved to lib/nx and those functions must be built into
|
||||
libuser.a to be linked with the user-space code.
|
||||
A similar issue exists in NSH that uses some internal OS
|
||||
interfaces that would not be available in a kernel build
|
||||
(such as foreach_task, foreach_mountpoint, etc.).
|
||||
Status: Open
|
||||
Priority: Low -- the kernel build configuration is not fully fielded
|
||||
yet.
|
||||
|
@ -1064,7 +1080,21 @@ o ARM (arch/arm/)
|
|||
Priority: Low. The conditions of continous interrupts is really the problem.
|
||||
If your design needs continous interrupts like this, please try
|
||||
the above change and, please, submit a patch with the working fix.
|
||||
|
||||
|
||||
Title: KERNEL MODE ISSUES - HANDLERS
|
||||
Description: The is a design flaw in the ARM/Cortex trap handlers. Currently,
|
||||
they try to process the SYSCALL within the trap handler. That
|
||||
cannot work. There are two possibilities to fix this.
|
||||
1) Just enable interrupts in the trap handler and make sure that
|
||||
that sufficient protection is in place to handler the nested
|
||||
interrupts, or
|
||||
3) Return from the exception via a trampoline (such as is
|
||||
currently done for signal handlers). In the trampoline,
|
||||
the trap would processed in supervisor mode with interrupts
|
||||
enabled.
|
||||
Status: Open
|
||||
Priority: medium-high.
|
||||
|
||||
o ARM/C5471 (arch/arm/src/c5471/)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -1789,7 +1819,7 @@ o mc68hc1x (arch/hc)
|
|||
Description: There is no script for building in banked mode (more correctly, there
|
||||
is a script, but logic inside the script has not yet been implemented).
|
||||
It would be necessary to implement banked mode to able to access more
|
||||
the 48Kb of FLASH.
|
||||
the 48K of FLASH.
|
||||
Status: Open.
|
||||
Priority: Medium/Low
|
||||
|
||||
|
|
|
@ -167,7 +167,13 @@
|
|||
# define STM32_IRQ_EXTI1510 (56) /* 40: EXTI Line[15:10] interrupts */
|
||||
# define STM32_IRQ_RTCALRM (57) /* 41: RTC alarm through EXTI line interrupt */
|
||||
# define STM32_IRQ_OTGFSWKUP (58) /* 42: USB On-The-Go FS Wakeup through EXTI line interrupt */
|
||||
/* 43-49: Reserved */
|
||||
# define STM32_IRQ_RESERVED0 (59) /* 43: Reserved 0 */
|
||||
# define STM32_IRQ_RESERVED1 (60) /* 44: Reserved 1 */
|
||||
# define STM32_IRQ_RESERVED2 (61) /* 45: Reserved 2 */
|
||||
# define STM32_IRQ_RESERVED3 (62) /* 46: Reserved 3 */
|
||||
# define STM32_IRQ_RESERVED4 (63) /* 47: Reserved 4 */
|
||||
# define STM32_IRQ_RESERVED5 (64) /* 48: Reserved 5 */
|
||||
# define STM32_IRQ_RESERVED6 (65) /* 49: Reserved 6 */
|
||||
# define STM32_IRQ_TIM5 (66) /* 50: TIM5 global interrupt */
|
||||
# define STM32_IRQ_SPI3 (67) /* 51: SPI3 global interrupt */
|
||||
# define STM32_IRQ_UART4 (68) /* 52: UART4 global interrupt */
|
||||
|
|
|
@ -301,14 +301,14 @@
|
|||
/* CAN */
|
||||
|
||||
#if defined(CONFIG_STM32_CAN1_REMAP1)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN9)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN9)
|
||||
#elif defined(CONFIG_STM32_CAN1_REMAP2)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN1)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN1)
|
||||
#else
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN12)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN12)
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -66,15 +66,15 @@
|
|||
#define GPIO_ADC12_IN8 (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN0)
|
||||
#define GPIO_ADC12_IN9 (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN1)
|
||||
|
||||
#if defined(CONFIG_STM32_CAN1_FULL_REMAP)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN1)
|
||||
#elif defined(CONFIG_STM32_CAN1_PARTIAL_REMAP)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN9)
|
||||
#if defined(CONFIG_STM32_CAN1_REMAP1)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN9)
|
||||
#elif defined(CONFIG_STM32_CAN1_REMAP2)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN1)
|
||||
#else
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN12)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN12)
|
||||
#endif
|
||||
|
||||
/* SDIO */
|
||||
|
|
|
@ -356,14 +356,14 @@
|
|||
/* CAN */
|
||||
|
||||
#if defined(CONFIG_STM32_CAN1_REMAP1)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN9)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN9)
|
||||
#elif defined(CONFIG_STM32_CAN1_REMAP2)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN1)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN1)
|
||||
#else
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN12)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN12)
|
||||
#endif
|
||||
|
||||
/* FSMC: CF */
|
||||
|
|
|
@ -65,23 +65,23 @@
|
|||
#define GPIO_ADC12_IN8 (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN0)
|
||||
#define GPIO_ADC12_IN9 (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN1)
|
||||
|
||||
#if defined(CONFIG_STM32_CAN1_FULL_REMAP)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN1)
|
||||
#elif defined(CONFIG_STM32_CAN1_PARTIAL_REMAP)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN9)
|
||||
#if defined(CONFIG_STM32_CAN1_REMAP1)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN9)
|
||||
#elif defined(CONFIG_STM32_CAN1_REMAP2)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN1)
|
||||
#else
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN12)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN12)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_STM32_CAN2_REMAP)
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN5)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN6)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN5)
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN6)
|
||||
#else
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN12)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN13)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN12)
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN13)
|
||||
#endif
|
||||
|
||||
#if 0 /* Needs further investigation */
|
||||
|
|
|
@ -65,23 +65,23 @@
|
|||
#define GPIO_ADC12_IN8 (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN0)
|
||||
#define GPIO_ADC12_IN9 (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN1)
|
||||
|
||||
#if defined(CONFIG_STM32_CAN1_FULL_REMAP)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN1)
|
||||
#elif defined(CONFIG_STM32_CAN1_PARTIAL_REMAP)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN9)
|
||||
#if defined(CONFIG_STM32_CAN1_REMAP1)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN8)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN9)
|
||||
#elif defined(CONFIG_STM32_CAN1_REMAP2)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTD|GPIO_PIN0)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN1)
|
||||
#else
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN12)
|
||||
# define GPIO_CAN1_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN11)
|
||||
# define GPIO_CAN1_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN12)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_STM32_CAN2_REMAP)
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN5)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN6)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN5)
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN6)
|
||||
#else
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN12)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN13)
|
||||
# define GPIO_CAN2_RX (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN12)
|
||||
# define GPIO_CAN2_TX (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN13)
|
||||
#endif
|
||||
|
||||
#if 0 /* Needs further investigation */
|
||||
|
@ -89,43 +89,49 @@
|
|||
#define GPIO_DAC_OUT2 (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN5)
|
||||
#endif
|
||||
|
||||
#if 0 /* Needs further investigation */
|
||||
/* Section 29.3 in the stm32 datasheet (Doc ID 13902 Rev 14) */
|
||||
|
||||
#define GPIO_ETH_MDC (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN1)
|
||||
#define GPIO_ETH_MDIO (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN2)
|
||||
#define GPIO_ETH_MIICOL (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN3)
|
||||
#define GPIO_ETH_MIICRSWKUP (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN0)
|
||||
#define GPIO_ETH_MIIRXCLK (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN1)
|
||||
|
||||
#define GPIO_ETH_MIICOL (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN3)
|
||||
#define GPIO_ETH_MIICRSWKUP (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN0)
|
||||
#define GPIO_ETH_MIIRXCLK (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN1)
|
||||
#if defined(CONFIG_STM32_ETH_REMAP)
|
||||
# define GPIO_ETH_MIIRXD0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN9)
|
||||
# define GPIO_ETH_MIIRXD1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN10)
|
||||
# define GPIO_ETH_MIIRXD2 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN11)
|
||||
# define GPIO_ETH_MIIRXD3 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN12)
|
||||
# define GPIO_ETH_MIIRXDV (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN8)
|
||||
# define GPIO_ETH_MIIRXD0 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN9)
|
||||
# define GPIO_ETH_MIIRXD1 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN10)
|
||||
# define GPIO_ETH_MIIRXD2 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN11)
|
||||
# define GPIO_ETH_MIIRXD3 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN12)
|
||||
# define GPIO_ETH_MIIRXDV (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN8)
|
||||
#else
|
||||
# define GPIO_ETH_MIIRXD0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN4)
|
||||
# define GPIO_ETH_MIIRXD1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN5)
|
||||
# define GPIO_ETH_MIIRXD2 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN0)
|
||||
# define GPIO_ETH_MIIRXD3 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN1)
|
||||
# define GPIO_ETH_MIIRXDV (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN7)
|
||||
# define GPIO_ETH_MIIRXD0 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN4)
|
||||
# define GPIO_ETH_MIIRXD1 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN5)
|
||||
# define GPIO_ETH_MIIRXD2 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN0)
|
||||
# define GPIO_ETH_MIIRXD3 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN1)
|
||||
# define GPIO_ETH_MIIRXDV (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN7)
|
||||
#endif
|
||||
|
||||
#define GPIO_ETH_MIIRXER (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN10)
|
||||
#define GPIO_ETH_MIITXCLK (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN3)
|
||||
#define GPIO_ETH_MIIRXER (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN10)
|
||||
#define GPIO_ETH_MIITXCLK (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN3)
|
||||
#define GPIO_ETH_MIITXD0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN12)
|
||||
#define GPIO_ETH_MIITXD1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN13)
|
||||
#define GPIO_ETH_MIITXD2 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN2)
|
||||
#define GPIO_ETH_MIITXD3 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN8)
|
||||
#define GPIO_ETH_MIITXEN (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN11)
|
||||
#define GPIO_ETH_PPSOUT (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN5)
|
||||
#define GPIO_ETH_RMIICRSDV (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN7)
|
||||
#define GPIO_ETH_RMIIREFCLK (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN1)
|
||||
#define GPIO_ETH_RMIIRXD0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN4)
|
||||
#define GPIO_ETH_RMIIRXD1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN5)
|
||||
#define GPIO_ETH_RMIITXD0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN12)
|
||||
#define GPIO_ETH_RMIITXD1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN13)
|
||||
#define GPIO_ETH_RMIITXEN (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN11)
|
||||
#define GPIO_ETH_PPS_OUT (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN5)
|
||||
|
||||
#define GPIO_ETH_RMII_REF_CLK (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN1)
|
||||
#if defined(CONFIG_STM32_ETH_REMAP)
|
||||
# define GPIO_ETH_RMII_CRS_DV (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN8)
|
||||
# define GPIO_ETH_RMII_RXD0 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN9)
|
||||
# define GPIO_ETH_RMII_RXD1 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTD|GPIO_PIN10)
|
||||
#else
|
||||
# define GPIO_ETH_RMII_CRS_DV (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN7)
|
||||
# define GPIO_ETH_RMII_RXD0 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN4)
|
||||
# define GPIO_ETH_RMII_RXD1 (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN5)
|
||||
#endif
|
||||
#define GPIO_ETH_RMII_TXD0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN12)
|
||||
#define GPIO_ETH_RMII_TXD1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN13)
|
||||
#define GPIO_ETH_RMII_TX_EN (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN11)
|
||||
|
||||
#if defined(CONFIG_STM32_I2C1_REMAP)
|
||||
# define GPIO_I2C1_SCL (GPIO_ALT|GPIO_CNF_AFOD|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN8)
|
||||
|
@ -148,9 +154,7 @@
|
|||
#define GPIO_I2S3_SD (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTB|GPIO_PIN5)
|
||||
#define GPIO_I2S3_WS (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN15)
|
||||
|
||||
#if 0 /* Needs further investigation */
|
||||
#define GPIO_MCO (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN8)
|
||||
#endif
|
||||
|
||||
#if 0 /* Needs further investigation */
|
||||
#define GPIO_OTG_FSDM (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTA|GPIO_PIN11)
|
||||
|
|
|
@ -271,6 +271,9 @@
|
|||
# define AFIO_MAPR_SWJ (1 << AFIO_MAPR_SWJ_CFG_SHIFT) /* 001: Full SWJ (JTAG-DP + SW-DP) but without JNTRST */
|
||||
# define AFIO_MAPR_SWDP (2 << AFIO_MAPR_SWJ_CFG_SHIFT) /* 010: JTAG-DP Disabled and SW-DP Enabled */
|
||||
# define AFIO_MAPR_DISAB (4 << AFIO_MAPR_SWJ_CFG_SHIFT) /* 100: JTAG-DP Disabled and SW-DP Disabled */
|
||||
#ifdef CONFIG_STM32_CONNECTIVITYLINE
|
||||
# define AFIO_MAPR_MII_RMII_SEL (1 << 23) /* MII or RMII selection */
|
||||
#endif
|
||||
#define AFIO_MAPR_PD01_REMAP (1 << 15) /* Bit 15 : Port D0/Port D1 mapping on OSC_IN/OSC_OUT */
|
||||
#define AFIO_MAPR_CAN_REMAP_SHIFT (13) /* Bits 14-13: CAN Alternate function remapping */
|
||||
#define AFIO_MAPR_CAN_REMAP_MASK (3 << AFIO_MAPR_CAN_REMAP_SHIFT)
|
||||
|
@ -278,7 +281,7 @@
|
|||
# define AFIO_MAPR_PB89 (2 << AFIO_MAPR_CAN_REMAP_SHIFT) /* 10: CANRX mapped to PB8, CANTX mapped to PB9 */
|
||||
# define AFIO_MAPR_PD01 (3 << AFIO_MAPR_CAN_REMAP_SHIFT) /* 11: CANRX mapped to PD0, CANTX mapped to PD1 */
|
||||
#define AFIO_MAPR_TIM4_REMAP (1 << 12) /* Bit 12: TIM4 remapping */
|
||||
#define AFIO_MAPR_TIM3_REMAP_SHIFT (10) /* Bits 11-10: TIM3 remapping */
|
||||
#define AFIO_MAPR_TIM3_REMAP_SHIFT (10) /* Bits 11-10: TIM3 remapping */
|
||||
#define AFIO_MAPR_TIM3_REMAP_MASK (3 << AFIO_MAPR_TIM3_REMAP_SHIFT)
|
||||
# define AFIO_MAPR_TIM3_NOREMAP (0 << AFIO_MAPR_TIM3_REMAP_SHIFT) /* 00: No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */
|
||||
# define AFIO_MAPR_TIM3_PARTREMAP (2 << AFIO_MAPR_TIM3_REMAP_SHIFT) /* 10: Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */
|
||||
|
|
|
@ -52,7 +52,10 @@
|
|||
#define STM32_RCC_APB1ENR_OFFSET 0x001c /* APB1 Peripheral Clock enable register */
|
||||
#define STM32_RCC_BDCR_OFFSET 0x0020 /* Backup domain control register */
|
||||
#define STM32_RCC_CSR_OFFSET 0x0024 /* Control/status register */
|
||||
#ifdef CONFIG_STM32_VALUELINE
|
||||
#ifdef CONFIG_STM32_CONNECTIVITYLINE
|
||||
# define STM32_RCC_AHBRSTR_OFFSET 0x0028 /* AHB Reset register */
|
||||
#endif
|
||||
#if defined(CONFIG_STM32_VALUELINE) || defined(CONFIG_STM32_CONNECTIVITYLINE)
|
||||
# define STM32_RCC_CFGR2_OFFSET 0x002c /* Clock configuration register 2 */
|
||||
#endif
|
||||
|
||||
|
@ -68,7 +71,10 @@
|
|||
#define STM32_RCC_APB1ENR (STM32_RCC_BASE+STM32_RCC_APB1ENR_OFFSET)
|
||||
#define STM32_RCC_BDCR (STM32_RCC_BASE+STM32_RCC_BDCR_OFFSET)
|
||||
#define STM32_RCC_CSR (STM32_RCC_BASE+STM32_RCC_CSR_OFFSET)
|
||||
#ifdef CONFIG_STM32_VALUELINE
|
||||
#ifdef CONFIG_STM32_CONNECTIVITYLINE
|
||||
# define STM32_RCC_AHBRSTR (STM32_RCC_BASE+STM32_RCC_AHBRSTR_OFFSET)
|
||||
#endif
|
||||
#if defined(CONFIG_STM32_VALUELINE) || defined(CONFIG_STM32_CONNECTIVITYLINE)
|
||||
# define STM32_RCC_CFGR2 (STM32_RCC_BASE+STM32_RCC_CFGR2_OFFSET)
|
||||
#endif
|
||||
|
||||
|
@ -88,6 +94,12 @@
|
|||
#define RCC_CR_CSSON (1 << 19) /* Bit 19: Clock Security System enable */
|
||||
#define RCC_CR_PLLON (1 << 24) /* Bit 24: PLL enable */
|
||||
#define RCC_CR_PLLRDY (1 << 25) /* Bit 25: PLL clock ready flag */
|
||||
#ifdef CONFIG_STM32_CONNECTIVITYLINE
|
||||
# define RCC_CR_PLL2ON (1 << 26) /* Bit 26: PLL2 enable */
|
||||
# define RCC_CR_PLL2RDY (1 << 27) /* Bit 27: PLL2 clock ready flag */
|
||||
# define RCC_CR_PLL3ON (1 << 28) /* Bit 28: PLL3 enable */
|
||||
# define RCC_CR_PLL3RDY (1 << 29) /* Bit 29: PLL3 ready flag */
|
||||
#endif
|
||||
|
||||
/* Clock configuration register */
|
||||
|
||||
|
@ -153,12 +165,16 @@
|
|||
# define RCC_CFGR_PLLMUL_CLKx16 (14 << RCC_CFGR_PLLMUL_SHIFT) /* 111x: PLL input clock x 16 */
|
||||
#define RCC_CFGR_USBPRE (1 << 22) /* Bit 22: USB prescaler */
|
||||
#define RCC_CFGR_MCO_SHIFT (24) /* Bits 26-24: Microcontroller Clock Output */
|
||||
#define RCC_CFGR_MCO_MASK (7 << RCC_CFGR_MCO_SHIFT)
|
||||
# define RCC_CFGR_NOCLK (0 << RCC_CFGR_MCO_SHIFT) /* 0xx: No clock */
|
||||
# define RCC_CFGR_SYSCLK (4 << RCC_CFGR_MCO_SHIFT) /* 100: System clock selected */
|
||||
# define RCC_CFGR_INTCLK (5 << RCC_CFGR_MCO_SHIFT) /* 101: Internal 8 MHz RC oscillator clock selected */
|
||||
# define RCC_CFGR_EXTCLK (6 << RCC_CFGR_MCO_SHIFT) /* 110: External 1-25 MHz oscillator clock selected */
|
||||
# define RCC_CFGR_PLLCLKd2 (7 << RCC_CFGR_MCO_SHIFT) /* 111: PLL clock divided by 2 selected */
|
||||
#define RCC_CFGR_MCO_MASK (0x0f << RCC_CFGR_MCO_SHIFT)
|
||||
# define RCC_CFGR_NOCLK (0 << RCC_CFGR_MCO_SHIFT) /* 0xx: No clock */
|
||||
# define RCC_CFGR_SYSCLK (4 << RCC_CFGR_MCO_SHIFT) /* 100: System clock selected */
|
||||
# define RCC_CFGR_INTCLK (5 << RCC_CFGR_MCO_SHIFT) /* 101: Internal 8 MHz RC oscillator clock selected */
|
||||
# define RCC_CFGR_EXTCLK (6 << RCC_CFGR_MCO_SHIFT) /* 110: External 1-25 MHz oscillator clock selected */
|
||||
# define RCC_CFGR_PLLCLKd2 (7 << RCC_CFGR_MCO_SHIFT) /* 111: PLL clock divided by 2 selected */
|
||||
# define RCC_CFGR_PLL2CLK (8 << RCC_CFGR_MCO_SHIFT) /* 1000: PLL2 clock selected */
|
||||
# define RCC_CFGR_PLL3CLKd2 (9 << RCC_CFGR_MCO_SHIFT) /* 1001: PLL3 clock devided by 2 selected */
|
||||
# define RCC_CFGR_XT1 (10 << RCC_CFGR_MCO_SHIFT) /* 1010: external 3-25 MHz oscillator clock selected (for Ethernet) */
|
||||
# define RCC_CFGR_PLL3CLK (11 << RCC_CFGR_MCO_SHIFT) /* 1011: PLL3 clock selected (for Ethernet) */
|
||||
|
||||
/* Clock interrupt register */
|
||||
|
||||
|
@ -231,6 +247,18 @@
|
|||
#define RCC_AHBENR_CRCEN (1 << 6) /* Bit 6: CRC clock enable */
|
||||
#define RCC_AHBENR_FSMCEN (1 << 8) /* Bit 8: FSMC clock enable */
|
||||
#define RCC_AHBENR_SDIOEN (1 << 10) /* Bit 10: SDIO clock enable */
|
||||
#ifdef CONFIG_STM32_CONNECTIVITYLINE
|
||||
# define RCC_AHBENR_ETHMACEN (1 << 14) /* Bit 14: Ethernet MAC clock enable */
|
||||
# define RCC_AHBENR_ETHMACTXEN (1 << 15) /* Bit 15: Ethernet MAC TX clock enable */
|
||||
# define RCC_AHBENR_ETHMACRXEN (1 << 16) /* Bit 16: Ethernet MAC RX clock enable */
|
||||
#endif
|
||||
|
||||
/* AHB peripheral clock reset register (RCC_AHBRSTR) */
|
||||
|
||||
#ifdef CONFIG_STM32_CONNECTIVITYLINE
|
||||
# define RCC_AHBRSTR_OTGFSRST (1 << 12) /* USB OTG FS reset */
|
||||
# define RCC_AHBRSTR_ETHMACRST (1 << 14) /* Ethernet MAC reset */
|
||||
#endif
|
||||
|
||||
/* APB2 Peripheral Clock enable register */
|
||||
|
||||
|
@ -301,26 +329,86 @@
|
|||
#define RCC_CSR_WWDGRSTF (1 << 30) /* Bit 30: Window watchdog reset flag */
|
||||
#define RCC_CSR_LPWRRSTF (1 << 31) /* Bit 31: Low-Power reset flag */
|
||||
|
||||
#ifdef CONFIG_STM32_VALUELINE
|
||||
#if defined(CONFIG_STM32_VALUELINE) || defined(CONFIG_STM32_CONNECTIVITYLINE)
|
||||
|
||||
/* Clock configuration register 2 */
|
||||
/* Clock configuration register 2 (For connectivity line only) */
|
||||
|
||||
# define RCC_CFGR2_PREDIV1d1 0 /* HSE input not divided */
|
||||
# define RCC_CFGR2_PREDIV1d2 1 /* HSE input divided by 2 */
|
||||
# define RCC_CFGR2_PREDIV1d3 2 /* HSE input divided by 3 */
|
||||
# define RCC_CFGR2_PREDIV1d4 3 /* HSE input divided by 4 */
|
||||
# define RCC_CFGR2_PREDIV1d5 4 /* HSE input divided by 5 */
|
||||
# define RCC_CFGR2_PREDIV1d6 5 /* HSE input divided by 6 */
|
||||
# define RCC_CFGR2_PREDIV1d7 6 /* HSE input divided by 7 */
|
||||
# define RCC_CFGR2_PREDIV1d8 7 /* HSE input divided by 8 */
|
||||
# define RCC_CFGR2_PREDIV1d9 8 /* HSE input divided by 9 */
|
||||
# define RCC_CFGR2_PREDIV1d10 9 /* HSE input divided by 10 */
|
||||
# define RCC_CFGR2_PREDIV1d11 10 /* HSE input divided by 11 */
|
||||
# define RCC_CFGR2_PREDIV1d12 11 /* HSE input divided by 12 */
|
||||
# define RCC_CFGR2_PREDIV1d13 12 /* HSE input divided by 13 */
|
||||
# define RCC_CFGR2_PREDIV1d14 13 /* HSE input divided by 14 */
|
||||
# define RCC_CFGR2_PREDIV1d15 14 /* HSE input divided by 15 */
|
||||
# define RCC_CFGR2_PREDIV1d16 15 /* HSE input divided by 16 */
|
||||
#define RCC_CFGR2_PREDIV1_SHIFT (0)
|
||||
#define RCC_CFGR2_PREDIV1_MASK (0x0f << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d1 (0 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d2 (1 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d3 (2 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d4 (3 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d5 (4 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d6 (5 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d7 (6 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d8 (7 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d9 (8 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d10 (9 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d11 (10 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d12 (11 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d13 (12 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d14 (13 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d15 (14 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1d16 (15 << RCC_CFGR2_PREDIV1_SHIFT)
|
||||
|
||||
#define RCC_CFGR2_PREDIV2_SHIFT (4)
|
||||
#define RCC_CFGR2_PREDIV2_MASK (0x0f << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d1 (0 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d2 (1 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d3 (2 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d4 (3 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d5 (4 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d6 (5 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d7 (6 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d8 (7 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d9 (8 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d10 (9 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d11 (10 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d12 (11 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d13 (12 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d14 (13 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d15 (14 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV2d16 (15 << RCC_CFGR2_PREDIV2_SHIFT)
|
||||
|
||||
#define RCC_CFGR2_PLL2MUL_SHIFT (8)
|
||||
#define RCC_CFGR2_PLL2MUL_MASK (0x0f << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx8 (6 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx9 (7 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx10 (8 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx11 (9 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx12 (10 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx13 (11 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx14 (12 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx16 (14 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL2MULx20 (15 << RCC_CFGR2_PLL2MUL_SHIFT)
|
||||
|
||||
#define RCC_CFGR2_PLL3MUL_SHIFT (12)
|
||||
#define RCC_CFGR2_PLL3MUL_MASK (0x0f << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx8 (6 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx9 (7 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx10 (8 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx11 (9 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx12 (10 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx13 (11 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx14 (12 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx16 (14 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
# define RCC_CFGR2_PLL3MULx20 (15 << RCC_CFGR2_PLL3MUL_SHIFT)
|
||||
|
||||
#define RCC_CFGR2_PREDIV1SRC_SHIFT (16)
|
||||
#define RCC_CFGR2_PREDIV1SRC_MASK (0x01 << RCC_CFGR2_PREDIV1SRC_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1SRC_HSE (0 << RCC_CFGR2_PREDIV1SRC_SHIFT)
|
||||
# define RCC_CFGR2_PREDIV1SRC_PLL2 (1 << RCC_CFGR2_PREDIV1SRC_SHIFT)
|
||||
|
||||
#define RCC_CFGR2_I2S2SRC_SHIFT (17)
|
||||
#define RCC_CFGR2_I2S2SRC_MASK (0x01 << RCC_CFGR2_I2S2SRC_SHIFT)
|
||||
# define RCC_CFGR2_I2S2SRC_SYSCLK (0 << RCC_CFGR2_I2S2SRC_SHIFT)
|
||||
# define RCC_CFGR2_I2S2SRC_PLL3 (1 << RCC_CFGR2_I2S2SRC_SHIFT)
|
||||
|
||||
#define RCC_CFGR2_I2S3SRC_SHIFT (17)
|
||||
#define RCC_CFGR2_I2S3SRC_MASK (0x01 << RCC_CFGR2_I2S3SRC_SHIFT)
|
||||
# define RCC_CFGR2_I2S3SRC_SYSCLK (0 << RCC_CFGR2_I2S3SRC_SHIFT)
|
||||
# define RCC_CFGR2_I2S3SRC_PLL3 (1 << RCC_CFGR2_I2S3SRC_SHIFT)
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -89,7 +89,8 @@ VECTOR(stm32_dma1ch2, STM32_IRQ_DMA1CH2) /* Vector 16+12: DMA1 Channel 2
|
|||
VECTOR(stm32_dma1ch3, STM32_IRQ_DMA1CH3) /* Vector 16+13: DMA1 Channel 3 global interrupt */
|
||||
VECTOR(stm32_dma1ch4, STM32_IRQ_DMA1CH4) /* Vector 16+14: DMA1 Channel 4 global interrupt */
|
||||
VECTOR(stm32_dma1ch5, STM32_IRQ_DMA1CH5) /* Vector 16+15: DMA1 Channel 5 global interrupt */
|
||||
VECTOR(stm32_dma1ch6, STM32_IRQ_DMA1CH6) /* Vector 16+16: DMA1 Channel 7 global interrupt */
|
||||
VECTOR(stm32_dma1ch6, STM32_IRQ_DMA1CH6) /* Vector 16+16: DMA1 Channel 6 global interrupt */
|
||||
VECTOR(stm32_dma1ch7, STM32_IRQ_DMA1CH7) /* Vector 16+17: DMA1 Channel 7 global interrupt */
|
||||
VECTOR(stm32_adc12, STM32_IRQ_ADC12) /* Vector 16+18: ADC1 and ADC2 global interrupt */
|
||||
VECTOR(stm32_can1tx, STM32_IRQ_CAN1TX) /* Vector 16+19: CAN1 TX interrupts */
|
||||
VECTOR(stm32_can1rx0, STM32_IRQ_CAN1RX0) /* Vector 16+20: CAN1 RX0 interrupts */
|
||||
|
@ -115,6 +116,13 @@ VECTOR(stm32_usart3, STM32_IRQ_USART3) /* Vector 16+39: USART3 global
|
|||
VECTOR(stm32_exti1510, STM32_IRQ_EXTI1510) /* Vector 16+40: EXTI Line[15:10] interrupts */
|
||||
VECTOR(stm32_rtcalr, STM32_IRQ_RTCALRM) /* Vector 16+41: RTC alarm through EXTI line interrupt */
|
||||
VECTOR(stm32_otgfswkup, STM32_IRQ_OTGFSWKUP) /* Vector 16+42: USB On-The-Go FS Wakeup through EXTI line interrupt */
|
||||
UNUSED(STM32_IRQ_RESERVED0) /* Vector 16+43: Reserved 0 */
|
||||
UNUSED(STM32_IRQ_RESERVED1) /* Vector 16+44: Reserved 1 */
|
||||
UNUSED(STM32_IRQ_RESERVED2) /* Vector 16+55: Reserved 2 */
|
||||
UNUSED(STM32_IRQ_RESERVED3) /* Vector 16+46: Reserved 3 */
|
||||
UNUSED(STM32_IRQ_RESERVED4) /* Vector 16+47: Reserved 4 */
|
||||
UNUSED(STM32_IRQ_RESERVED5) /* Vector 16+48: Reserved 5 */
|
||||
UNUSED(STM32_IRQ_RESERVED6) /* Vector 16+49: Reserved 6 */
|
||||
VECTOR(stm32_tim5, STM32_IRQ_TIM5) /* Vector 16+50: TIM5 global interrupt */
|
||||
VECTOR(stm32_spi3, STM32_IRQ_SPI3 ) /* Vector 16+51: SPI3 global interrupt */
|
||||
VECTOR(stm32_uart4 , STM32_IRQ_UART4) /* Vector 16+52: UART4 global interrupt */
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
# error "Logic to support multiple Ethernet interfaces is incomplete"
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_STM32_SYSCFG
|
||||
#if !defined(CONFIG_STM32_SYSCFG) && !defined(CONFIG_STM32_CONNECTIVITYLINE)
|
||||
# error "CONFIG_STM32_SYSCFG must be defined in the NuttX configuration"
|
||||
#endif
|
||||
|
||||
|
@ -2657,6 +2657,13 @@ static inline void stm32_ethgpioconfig(FAR struct stm32_ethmac_s *priv)
|
|||
|
||||
#elif defined(CONFIG_STM32_RMII)
|
||||
|
||||
/* Setup MCO pin for alternative usage */
|
||||
|
||||
#if defined(CONFIG_STM32_RMII_MCO)
|
||||
stm32_configgpio(GPIO_MCO);
|
||||
stm32_mcoconfig(BOARD_CFGR_MCO_SOURCE);
|
||||
#endif
|
||||
|
||||
/* Select the RMII interface */
|
||||
|
||||
stm32_selectrmii();
|
||||
|
@ -2673,7 +2680,7 @@ static inline void stm32_ethgpioconfig(FAR struct stm32_ethmac_s *priv)
|
|||
stm32_configgpio(GPIO_ETH_RMII_RXD1);
|
||||
stm32_configgpio(GPIO_ETH_RMII_TXD0);
|
||||
stm32_configgpio(GPIO_ETH_RMII_TXD1);
|
||||
stm32_configgpio(GPIO_ETH_RMII_TX_CLK);
|
||||
/* stm32_configgpio(GPIO_ETH_RMII_TX_CLK); not needed? */
|
||||
stm32_configgpio(GPIO_ETH_RMII_TX_EN);
|
||||
|
||||
#endif
|
||||
|
@ -2704,14 +2711,25 @@ static void stm32_ethreset(FAR struct stm32_ethmac_s *priv)
|
|||
{
|
||||
uint32_t regval;
|
||||
|
||||
/* Reset the Ethernet on the AHB1 bus */
|
||||
/* Reset the Ethernet on the AHB bus (F1 Connectivity Line) or AHB1 bus (F2
|
||||
* and F4)
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_STM32_CONNECTIVITYLINE)
|
||||
regval = stm32_getreg(STM32_RCC_AHBRSTR);
|
||||
regval |= RCC_AHBRSTR_ETHMACRST;
|
||||
stm32_putreg(regval, STM32_RCC_AHBRSTR);
|
||||
|
||||
regval &= ~RCC_AHBRSTR_ETHMACRST;
|
||||
stm32_putreg(regval, STM32_RCC_AHBRSTR);
|
||||
#else
|
||||
regval = stm32_getreg(STM32_RCC_AHB1RSTR);
|
||||
regval |= RCC_AHB1RSTR_ETHMACRST;
|
||||
stm32_putreg(regval, STM32_RCC_AHB1RSTR);
|
||||
|
||||
regval &= ~RCC_AHB1RSTR_ETHMACRST;
|
||||
stm32_putreg(regval, STM32_RCC_AHB1RSTR);
|
||||
#endif
|
||||
|
||||
/* Perform a software reset by setting the SR bit in the DMABMR register.
|
||||
* This Resets all MAC subsystem internal registers and logic. After this
|
||||
|
|
|
@ -116,6 +116,39 @@ static inline void stm32_mco1config(uint32_t source, uint32_t div)
|
|||
}
|
||||
#endif
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32_mcoconfig
|
||||
*
|
||||
* Description:
|
||||
* Selects the clock source to output on MC pin (PA8) for stm32f10xxx.
|
||||
* PA8 should be configured in alternate function mode.
|
||||
*
|
||||
* Input Parameters:
|
||||
* source - One of the definitions for the RCC_CFGR_MCO definitions from
|
||||
* chip/stm32f10xxx_rcc.h {RCC_CFGR_SYSCLK, RCC_CFGR_INTCLK, RCC_CFGR_EXTCLK,
|
||||
* RCC_CFGR_PLLCLKd2, RCC_CFGR_PLL2CLK, RCC_CFGR_PLL3CLKd2, RCC_CFGR_XT1,
|
||||
* RCC_CFGR_PLL3CLK}
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
************************************************************************************/
|
||||
|
||||
#if defined(CONFIG_STM32_CONNECTIVITYLINE)
|
||||
static inline void stm32_mcoconfig(uint32_t source)
|
||||
{
|
||||
uint32_t regval;
|
||||
|
||||
/* Set MCO source */
|
||||
|
||||
regval = getreg32(STM32_RCC_CFGR);
|
||||
regval &= ~(RCC_CFGR_MCO_MASK);
|
||||
regval |= (source & RCC_CFGR_MCO_MASK);
|
||||
putreg32(regval, STM32_RCC_CFGR);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/************************************************************************************
|
||||
* Name: stm32_mco2config
|
||||
*
|
||||
|
|
|
@ -1615,7 +1615,7 @@ static void stm32_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
|
|||
/* SD normal operation clocking (narrow 1-bit mode) */
|
||||
|
||||
case CLOCK_SD_TRANSFER_1BIT:
|
||||
clckr = (SDIO_CLCKR_SDXFR | SDIO_CLKCR_CLKEN)
|
||||
clckr = (SDIO_CLCKR_SDXFR | SDIO_CLKCR_CLKEN);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -132,6 +132,30 @@
|
|||
*/
|
||||
|
||||
# define RXDMA_BUFFER_SIZE 32
|
||||
|
||||
/* DMA priority */
|
||||
|
||||
# ifndef CONFIG_USART_DMAPRIO
|
||||
# if defined(CONFIG_STM32_STM32F10XX)
|
||||
# define CONFIG_USART_DMAPRIO DMA_CCR_PRIMED
|
||||
# elif defined(CONFIG_STM32_STM32F20XX) || defined(CONFIG_STM32_STM32F40XX)
|
||||
# define CONFIG_USART_DMAPRIO DMA_SCR_PRIMED
|
||||
# else
|
||||
# error "Unknown STM32 DMA"
|
||||
# endif
|
||||
# endif
|
||||
# if defined(CONFIG_STM32_STM32F10XX)
|
||||
# if (CONFIG_USART_DMAPRIO & ~DMA_CCR_PL_MASK) != 0
|
||||
# error "Illegal value for CONFIG_USART_DMAPRIO"
|
||||
# endif
|
||||
# elif defined(CONFIG_STM32_STM32F20XX) || defined(CONFIG_STM32_STM32F40XX)
|
||||
# if (CONFIG_USART_DMAPRIO & ~DMA_SCR_PL_MASK) != 0
|
||||
# error "Illegal value for CONFIG_USART_DMAPRIO"
|
||||
# endif
|
||||
# else
|
||||
# error "Unknown STM32 DMA"
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Power management definitions */
|
||||
|
@ -975,6 +999,7 @@ static int up_dma_setup(struct uart_dev_s *dev)
|
|||
DMA_SCR_MINC |
|
||||
DMA_SCR_PSIZE_8BITS |
|
||||
DMA_SCR_MSIZE_8BITS |
|
||||
CONFIG_USART_DMAPRIO |
|
||||
DMA_SCR_PBURST_SINGLE |
|
||||
DMA_SCR_MBURST_SINGLE);
|
||||
|
||||
|
|
|
@ -88,18 +88,47 @@
|
|||
* Definitions
|
||||
************************************************************************************/
|
||||
/* Configuration ********************************************************************/
|
||||
/* SPI interrupts */
|
||||
|
||||
#ifdef CONFIG_STM32_SPI_INTERRUPTS
|
||||
# error "Interrupt driven SPI not yet supported"
|
||||
#endif
|
||||
|
||||
/* Can't have both interrupt driven SPI and SPI DMA */
|
||||
|
||||
#if defined(CONFIG_STM32_SPI_INTERRUPTS) && defined(CONFIG_STM32_SPI_DMA)
|
||||
# error "Cannot enable both interrupt mode and DMA mode for SPI"
|
||||
#endif
|
||||
|
||||
/* DMA channel configuration */
|
||||
/* SPI DMA priority */
|
||||
|
||||
#define SPI_DMA_PRIO DMA_CCR_PRIMED /* Check this to alter priority */
|
||||
#ifdef CONFIG_STM32_SPI_DMA
|
||||
|
||||
# if defined(CONFIG_SPI_DMAPRIO)
|
||||
# define SPI_DMA_PRIO CONFIG_SPI_DMAPRIO
|
||||
# elif defined(CONFIG_STM32_STM32F10XX)
|
||||
# define SPI_DMA_PRIO DMA_CCR_PRIMED
|
||||
# elif defined(CONFIG_STM32_STM32F20XX) || defined(CONFIG_STM32_STM32F40XX)
|
||||
# define SPI_DMA_PRIO DMA_SCR_PRIMED
|
||||
# else
|
||||
# error "Unknown STM32 DMA"
|
||||
# endif
|
||||
|
||||
# if defined(CONFIG_STM32_STM32F10XX)
|
||||
# if (SPI_DMA_PRIO & ~DMA_CCR_PL_MASK) != 0
|
||||
# error "Illegal value for CONFIG_SPI_DMAPRIO"
|
||||
# endif
|
||||
# elif defined(CONFIG_STM32_STM32F20XX) || defined(CONFIG_STM32_STM32F40XX)
|
||||
# if (SPI_DMA_PRIO & ~DMA_SCR_PL_MASK) != 0
|
||||
# error "Illegal value for CONFIG_SPI_DMAPRIO"
|
||||
# endif
|
||||
# else
|
||||
# error "Unknown STM32 DMA"
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
/* DMA channel configuration */
|
||||
|
||||
#define SPI_RXDMA16_CONFIG (SPI_DMA_PRIO|DMA_CCR_MSIZE_16BITS|DMA_CCR_PSIZE_16BITS|DMA_CCR_MINC )
|
||||
#define SPI_RXDMA8_CONFIG (SPI_DMA_PRIO|DMA_CCR_MSIZE_8BITS |DMA_CCR_PSIZE_8BITS |DMA_CCR_MINC )
|
||||
|
|
|
@ -143,6 +143,9 @@ stm32_vectors:
|
|||
#undef VECTOR
|
||||
#define VECTOR(l,i) .word l
|
||||
|
||||
#undef UNUSED
|
||||
#define UNUSED(i) .word stm32_reserved
|
||||
|
||||
#if defined(CONFIG_STM32_STM32F10XX)
|
||||
# include "chip/chip/stm32f10xxx_vectors.h"
|
||||
#elif defined(CONFIG_STM32_STM32F20XX)
|
||||
|
@ -176,6 +179,9 @@ handlers:
|
|||
#undef VECTOR
|
||||
#define VECTOR(l,i) HANDLER l, i
|
||||
|
||||
#undef UNUSED
|
||||
#define UNUSED(i)
|
||||
|
||||
#if defined(CONFIG_STM32_STM32F10XX)
|
||||
# include "chip/chip/stm32f10xxx_vectors.h"
|
||||
#elif defined(CONFIG_STM32_STM32F20XX)
|
||||
|
|
|
@ -144,6 +144,12 @@ static inline void rcc_enableahb(void)
|
|||
regval |= RCC_AHBENR_SDIOEN;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_STM32_ETHMAC) && defined(CONFIG_STM32_CONNECTIVITYLINE)
|
||||
/* Ethernet clock enable */
|
||||
|
||||
regval |= (RCC_AHBENR_ETHMACEN | RCC_AHBENR_ETHMACTXEN | RCC_AHBENR_ETHMACRXEN);
|
||||
#endif
|
||||
|
||||
putreg32(regval, STM32_RCC_AHBENR); /* Enable peripherals */
|
||||
}
|
||||
|
||||
|
|
|
@ -783,6 +783,7 @@ void stm32_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg, bool
|
|||
* mode to determine when the buffer is half-full, or in double-buffered
|
||||
* mode to determine when one of the two buffers is full.
|
||||
*/
|
||||
|
||||
scr |= (half ? DMA_SCR_HTIE : 0) | DMA_SCR_TCIE | DMA_SCR_TEIE;
|
||||
}
|
||||
|
||||
|
|
|
@ -783,6 +783,7 @@ void stm32_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg, bool
|
|||
* mode to determine when the buffer is half-full, or in double-buffered
|
||||
* mode to determine when one of the two buffers is full.
|
||||
*/
|
||||
|
||||
scr |= (half ? DMA_SCR_HTIE : 0) | DMA_SCR_TCIE | DMA_SCR_TEIE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1603,6 +1603,12 @@ configs/olimex-lpc2378
|
|||
Linux or Cygwin. STATUS: ostest and NSH configurations available.
|
||||
This port for the NXP LPC2378 was contributed by Rommel Marcelo.
|
||||
|
||||
configs/olimex-stm32-p107
|
||||
This port uses the Olimex STM32-P107 board (STM32F107VC) and a GNU arm-elf
|
||||
toolchain* under Linux or Cygwin. See the https://www.olimex.com/dev/stm32-p107.html
|
||||
for further information. Contributed by Max Holtzberg. STATUS: Configurations
|
||||
for the basic OS test and NSH are available and verified.
|
||||
|
||||
configs/olimex-strp711
|
||||
This port uses the Olimex STR-P711 board and a GNU arm-elf toolchain* under
|
||||
Linux or Cygwin. See the http://www.olimex.com/dev/str-p711.html" for
|
||||
|
|
|
@ -55,7 +55,7 @@ NM = $(CROSSDEV)nm
|
|||
OBJCOPY = $(CROSSDEV)objcopy
|
||||
OBJDUMP = $(CROSSDEV)objdump
|
||||
|
||||
MAXOPTIMIZATION = -O3
|
||||
MAXOPTIMIZATION = -Os
|
||||
ARCHCPUFLAGS = -mcpu=cortex-m4 \
|
||||
-mthumb \
|
||||
-march=armv7e-m \
|
||||
|
|
|
@ -96,7 +96,7 @@ int closedir(FAR DIR *dirp)
|
|||
*/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
if (INODE_IS_MOUNTPT(inode) && !DIRENT_ISPSUEDONODE(idir->fd_flags))
|
||||
if (INODE_IS_MOUNTPT(inode) && !DIRENT_ISPSEUDONODE(idir->fd_flags))
|
||||
{
|
||||
/* The node is a file system mointpoint. Verify that the mountpoint
|
||||
* supports the closedir() method (not an error if it does not)
|
||||
|
@ -117,13 +117,13 @@ int closedir(FAR DIR *dirp)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
/* The node is part of the root psuedo file system, release
|
||||
/* The node is part of the root pseudo file system, release
|
||||
* our contained reference to the 'next' inode.
|
||||
*/
|
||||
|
||||
if (idir->u.psuedo.fd_next)
|
||||
if (idir->u.pseudo.fd_next)
|
||||
{
|
||||
inode_release(idir->u.psuedo.fd_next);
|
||||
inode_release(idir->u.pseudo.fd_next);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -342,7 +342,7 @@ int files_dup(FAR struct file *filep1, FAR struct file *filep2)
|
|||
#endif
|
||||
#endif
|
||||
{
|
||||
/* Open the psuedo file or device driver */
|
||||
/* Open the pseudo file or device driver */
|
||||
|
||||
ret = inode->u.i_ops->open(filep2);
|
||||
}
|
||||
|
|
|
@ -171,7 +171,7 @@ int foreach_inodelevel(FAR struct inode *node, struct inode_path_s *info)
|
|||
* when the callback 'handler' returns a non-zero value, or when all of
|
||||
* the inodes have been visited.
|
||||
*
|
||||
* NOTE 1: Use with caution... The psuedo-file system is locked throughout
|
||||
* NOTE 1: Use with caution... The pseudo-file system is locked throughout
|
||||
* the traversal.
|
||||
* NOTE 2: The search algorithm is recursive and could, in principle, use
|
||||
* an indeterminant amount of stack space. This will not usually be a
|
||||
|
|
|
@ -154,7 +154,7 @@ static int mountpoint_filter(FAR struct inode *node,
|
|||
* mountpoint inodes. It is intended to support the mount() command to
|
||||
* when the mount command is used to enumerate mounts.
|
||||
*
|
||||
* NOTE 1: Use with caution... The psuedo-file system is locked throughout
|
||||
* NOTE 1: Use with caution... The pseudo-file system is locked throughout
|
||||
* the traversal.
|
||||
* NOTE 2: The search algorithm is recursive and could, in principle, use
|
||||
* an indeterminant amount of stack space. This will not usually be a
|
||||
|
|
|
@ -75,10 +75,10 @@
|
|||
|
||||
/* Mountpoint fd_flags values */
|
||||
|
||||
#define DIRENTFLAGS_PSUEDONODE 1
|
||||
#define DIRENTFLAGS_PSEUDONODE 1
|
||||
|
||||
#define DIRENT_SETPSUEDONODE(f) do (f) |= DIRENTFLAGS_PSUEDONODE; while (0)
|
||||
#define DIRENT_ISPSUEDONODE(f) (((f) & DIRENTFLAGS_PSUEDONODE) != 0)
|
||||
#define DIRENT_SETPSEUDONODE(f) do (f) |= DIRENTFLAGS_PSEUDONODE; while (0)
|
||||
#define DIRENT_ISPSEUDONODE(f) (((f) & DIRENTFLAGS_PSEUDONODE) != 0)
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
|
@ -236,7 +236,7 @@ EXTERN void inode_release(FAR struct inode *inode);
|
|||
* when the callback 'handler' returns a non-zero value, or when all of
|
||||
* the inodes have been visited.
|
||||
*
|
||||
* NOTE 1: Use with caution... The psuedo-file system is locked throughout
|
||||
* NOTE 1: Use with caution... The pseudo-file system is locked throughout
|
||||
* the traversal.
|
||||
* NOTE 2: The search algorithm is recursive and could, in principle, use
|
||||
* an indeterminant amount of stack space. This will not usually be a
|
||||
|
|
|
@ -138,19 +138,19 @@ static inline int open_mountpoint(FAR struct inode *inode,
|
|||
|
||||
static void open_pseudodir(FAR struct inode *inode, FAR struct fs_dirent_s *dir)
|
||||
{
|
||||
/* We have a valid psuedo-filesystem node. Take two references on the
|
||||
/* We have a valid pseudo-filesystem node. Take two references on the
|
||||
* inode -- one for the parent (fd_root) and one for the child (fd_next).
|
||||
* Note that we do not call inode_addref because we are holding the tree
|
||||
* semaphore and that would result in deadlock.
|
||||
*/
|
||||
|
||||
inode->i_crefs += 2;
|
||||
dir->u.psuedo.fd_next = inode; /* This is the next node to use for readdir() */
|
||||
dir->u.pseudo.fd_next = inode; /* This is the next node to use for readdir() */
|
||||
|
||||
/* Flag the inode as belonging to the psuedo-filesystem */
|
||||
/* Flag the inode as belonging to the pseudo-filesystem */
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
DIRENT_SETPSUEDONODE(dir->fd_flags);
|
||||
DIRENT_SETPSEUDONODE(dir->fd_flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -242,7 +242,7 @@ FAR DIR *opendir(FAR const char *path)
|
|||
}
|
||||
|
||||
/* Populate the DIR structure and return it to the caller. The way that
|
||||
* we do this depends on whenever this is a "normal" psuedo-file-system
|
||||
* we do this depends on whenever this is a "normal" pseudo-file-system
|
||||
* inode or a file system mountpoint.
|
||||
*/
|
||||
|
||||
|
@ -262,7 +262,7 @@ FAR DIR *opendir(FAR const char *path)
|
|||
open_pseudodir(inode, dir);
|
||||
}
|
||||
|
||||
/* Is this a node in the psuedo filesystem? Or a mountpoint? If the node
|
||||
/* Is this a node in the pseudo filesystem? Or a mountpoint? If the node
|
||||
* is the root (bisroot == TRUE), then this is a special case.
|
||||
*/
|
||||
|
||||
|
@ -280,7 +280,7 @@ FAR DIR *opendir(FAR const char *path)
|
|||
#endif
|
||||
else
|
||||
{
|
||||
/* The node is part of the root psuedo file system. Does the inode have a child?
|
||||
/* The node is part of the root pseudo file system. Does the inode have a child?
|
||||
* If so that the child would be the 'root' of a list of nodes under
|
||||
* the directory.
|
||||
*/
|
||||
|
@ -292,7 +292,7 @@ FAR DIR *opendir(FAR const char *path)
|
|||
goto errout_with_direntry;
|
||||
}
|
||||
|
||||
/* It looks we have a valid psuedo-filesystem directory node. */
|
||||
/* It looks we have a valid pseudo-filesystem directory node. */
|
||||
|
||||
open_pseudodir(inode, dir);
|
||||
}
|
||||
|
|
|
@ -53,16 +53,16 @@
|
|||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: readpsuedodir
|
||||
* Name: readpseudodir
|
||||
****************************************************************************/
|
||||
|
||||
static inline int readpsuedodir(struct fs_dirent_s *idir)
|
||||
static inline int readpseudodir(struct fs_dirent_s *idir)
|
||||
{
|
||||
FAR struct inode *prev;
|
||||
|
||||
/* Check if we are at the end of the list */
|
||||
|
||||
if (!idir->u.psuedo.fd_next)
|
||||
if (!idir->u.pseudo.fd_next)
|
||||
{
|
||||
/* End of file and error conditions are not distinguishable
|
||||
* with readdir. Here we return -ENOENT to signal the end
|
||||
|
@ -74,21 +74,21 @@ static inline int readpsuedodir(struct fs_dirent_s *idir)
|
|||
|
||||
/* Copy the inode name into the dirent structure */
|
||||
|
||||
strncpy(idir->fd_dir.d_name, idir->u.psuedo.fd_next->i_name, NAME_MAX+1);
|
||||
strncpy(idir->fd_dir.d_name, idir->u.pseudo.fd_next->i_name, NAME_MAX+1);
|
||||
|
||||
/* If the node has file operations, we will say that it is
|
||||
* a file.
|
||||
*/
|
||||
|
||||
idir->fd_dir.d_type = 0;
|
||||
if (idir->u.psuedo.fd_next->u.i_ops)
|
||||
if (idir->u.pseudo.fd_next->u.i_ops)
|
||||
{
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
if (INODE_IS_BLOCK(idir->u.psuedo.fd_next))
|
||||
if (INODE_IS_BLOCK(idir->u.pseudo.fd_next))
|
||||
{
|
||||
idir->fd_dir.d_type |= DTYPE_BLK;
|
||||
}
|
||||
if (INODE_IS_MOUNTPT(idir->u.psuedo.fd_next))
|
||||
if (INODE_IS_MOUNTPT(idir->u.pseudo.fd_next))
|
||||
{
|
||||
idir->fd_dir.d_type |= DTYPE_DIRECTORY;
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ static inline int readpsuedodir(struct fs_dirent_s *idir)
|
|||
* is a directory. NOTE: that the node can be both!
|
||||
*/
|
||||
|
||||
if (idir->u.psuedo.fd_next->i_child || !idir->u.psuedo.fd_next->u.i_ops)
|
||||
if (idir->u.pseudo.fd_next->i_child || !idir->u.pseudo.fd_next->u.i_ops)
|
||||
{
|
||||
idir->fd_dir.d_type |= DTYPE_DIRECTORY;
|
||||
}
|
||||
|
@ -112,14 +112,14 @@ static inline int readpsuedodir(struct fs_dirent_s *idir)
|
|||
|
||||
inode_semtake();
|
||||
|
||||
prev = idir->u.psuedo.fd_next;
|
||||
idir->u.psuedo.fd_next = prev->i_peer; /* The next node to visit */
|
||||
prev = idir->u.pseudo.fd_next;
|
||||
idir->u.pseudo.fd_next = prev->i_peer; /* The next node to visit */
|
||||
|
||||
if (idir->u.psuedo.fd_next)
|
||||
if (idir->u.pseudo.fd_next)
|
||||
{
|
||||
/* Increment the reference count on this next node */
|
||||
|
||||
idir->u.psuedo.fd_next->i_crefs++;
|
||||
idir->u.pseudo.fd_next->i_crefs++;
|
||||
}
|
||||
|
||||
inode_semgive();
|
||||
|
@ -179,7 +179,7 @@ FAR struct dirent *readdir(DIR *dirp)
|
|||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
inode = idir->fd_root;
|
||||
if (INODE_IS_MOUNTPT(inode) && !DIRENT_ISPSUEDONODE(idir->fd_flags))
|
||||
if (INODE_IS_MOUNTPT(inode) && !DIRENT_ISPSEUDONODE(idir->fd_flags))
|
||||
{
|
||||
/* The node is a file system mointpoint. Verify that the mountpoint
|
||||
* supports the readdir() method
|
||||
|
@ -198,9 +198,9 @@ FAR struct dirent *readdir(DIR *dirp)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
/* The node is part of the root psuedo file system */
|
||||
/* The node is part of the root pseudo file system */
|
||||
|
||||
ret = readpsuedodir(idir);
|
||||
ret = readpseudodir(idir);
|
||||
}
|
||||
|
||||
/* ret < 0 is an error. Special case: ret = -ENOENT is end of file */
|
||||
|
|
|
@ -52,10 +52,10 @@
|
|||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: rewindpsuedodir
|
||||
* Name: rewindpseudodir
|
||||
****************************************************************************/
|
||||
|
||||
static inline void rewindpsuedodir(struct fs_dirent_s *idir)
|
||||
static inline void rewindpseudodir(struct fs_dirent_s *idir)
|
||||
{
|
||||
struct inode *prev;
|
||||
|
||||
|
@ -63,8 +63,8 @@ static inline void rewindpsuedodir(struct fs_dirent_s *idir)
|
|||
|
||||
/* Reset the position to the beginning */
|
||||
|
||||
prev = idir->u.psuedo.fd_next; /* (Save to delete later) */
|
||||
idir->u.psuedo.fd_next = idir->fd_root; /* The next node to visit */
|
||||
prev = idir->u.pseudo.fd_next; /* (Save to delete later) */
|
||||
idir->u.pseudo.fd_next = idir->fd_root; /* The next node to visit */
|
||||
idir->fd_position = 0; /* Reset position */
|
||||
|
||||
/* Increment the reference count on the root=next node. We
|
||||
|
@ -138,8 +138,8 @@ void rewinddir(FAR DIR *dirp)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
/* The node is part of the root psuedo file system */
|
||||
/* The node is part of the root pseudo file system */
|
||||
|
||||
rewindpsuedodir(idir);
|
||||
rewindpseudodir(idir);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,10 +53,10 @@
|
|||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: seekpsuedodir
|
||||
* Name: seekpseudodir
|
||||
****************************************************************************/
|
||||
|
||||
static inline void seekpsuedodir(struct fs_dirent_s *idir, off_t offset)
|
||||
static inline void seekpseudodir(struct fs_dirent_s *idir, off_t offset)
|
||||
{
|
||||
struct inode *curr;
|
||||
struct inode *prev;
|
||||
|
@ -76,7 +76,7 @@ static inline void seekpsuedodir(struct fs_dirent_s *idir, off_t offset)
|
|||
else
|
||||
{
|
||||
pos = idir->fd_position;
|
||||
curr = idir->u.psuedo.fd_next;
|
||||
curr = idir->u.pseudo.fd_next;
|
||||
}
|
||||
|
||||
/* Traverse the peer list starting at the 'root' of the
|
||||
|
@ -90,8 +90,8 @@ static inline void seekpsuedodir(struct fs_dirent_s *idir, off_t offset)
|
|||
|
||||
/* Now get the inode to vist next time that readdir() is called */
|
||||
|
||||
prev = idir->u.psuedo.fd_next;
|
||||
idir->u.psuedo.fd_next = curr; /* The next node to visit (might be null) */
|
||||
prev = idir->u.pseudo.fd_next;
|
||||
idir->u.pseudo.fd_next = curr; /* The next node to visit (might be null) */
|
||||
idir->fd_position = pos; /* Might be beyond the last dirent */
|
||||
|
||||
if (curr)
|
||||
|
@ -223,8 +223,8 @@ void seekdir(FAR DIR *dirp, off_t offset)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
/* The node is part of the root psuedo file system */
|
||||
/* The node is part of the root pseudo file system */
|
||||
|
||||
seekpsuedodir(idir, offset);
|
||||
seekpseudodir(idir, offset);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,10 +51,10 @@
|
|||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: statpsuedo
|
||||
* Name: statpseudo
|
||||
****************************************************************************/
|
||||
|
||||
static inline int statpsuedo(FAR struct inode *inode, FAR struct stat *buf)
|
||||
static inline int statpseudo(FAR struct inode *inode, FAR struct stat *buf)
|
||||
{
|
||||
/* Most of the stat entries just do not apply */
|
||||
|
||||
|
@ -92,7 +92,7 @@ static inline int statpsuedo(FAR struct inode *inode, FAR struct stat *buf)
|
|||
{
|
||||
/* If it has no operations, then it must just be a intermediate
|
||||
* node in the inode tree. It is something like a directory.
|
||||
* We'll say that all psuedo-directories are read-able but not
|
||||
* We'll say that all pseudo-directories are read-able but not
|
||||
* write-able.
|
||||
*/
|
||||
|
||||
|
@ -195,9 +195,9 @@ int stat(const char *path, FAR struct stat *buf)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
/* The node is part of the root psuedo file system */
|
||||
/* The node is part of the root pseudo file system */
|
||||
|
||||
ret = statpsuedo(inode, buf);
|
||||
ret = statpseudo(inode, buf);
|
||||
}
|
||||
|
||||
/* Check if the stat operation was successful */
|
||||
|
|
|
@ -52,10 +52,10 @@
|
|||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: statpsuedo
|
||||
* Name: statpseudo
|
||||
****************************************************************************/
|
||||
|
||||
static inline int statpsuedofs(FAR struct inode *inode, FAR struct statfs *buf)
|
||||
static inline int statpseudofs(FAR struct inode *inode, FAR struct statfs *buf)
|
||||
{
|
||||
memset(buf, 0, sizeof(struct statfs));
|
||||
buf->f_type = PROC_SUPER_MAGIC;
|
||||
|
@ -137,9 +137,9 @@ int statfs(FAR const char *path, FAR struct statfs *buf)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
/* The node is part of the root psuedo file system */
|
||||
/* The node is part of the root pseudo file system */
|
||||
|
||||
ret = statpsuedofs(inode, buf);
|
||||
ret = statpseudofs(inode, buf);
|
||||
}
|
||||
|
||||
/* Check if the statfs operation was successful */
|
||||
|
|
|
@ -319,7 +319,7 @@ int syslog_initialize(void)
|
|||
SYSLOG_OFLAGS, 0666);
|
||||
}
|
||||
|
||||
/* No... then it must be a character driver in the NuttX psuedo-
|
||||
/* No... then it must be a character driver in the NuttX pseudo-
|
||||
* file system.
|
||||
*/
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
* Name: unregister_blockdriver
|
||||
*
|
||||
* Description:
|
||||
* Remove the block driver inode at 'path' from the psuedo-file system
|
||||
* Remove the block driver inode at 'path' from the pseudo-file system
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
* Name: unregister_driver
|
||||
*
|
||||
* Description:
|
||||
* Remove the character driver inode at 'path' from the psuedo-file system
|
||||
* Remove the character driver inode at 'path' from the pseudo-file system
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
|
|
@ -65,12 +65,12 @@
|
|||
* reference, a position, a dirent structure, and file-system-specific
|
||||
* information.
|
||||
*
|
||||
* For the root psuedo-file system, we need retain only the 'next' inode
|
||||
* For the root pseudo-file system, we need retain only the 'next' inode
|
||||
* need for the next readdir() operation. We hold a reference on this
|
||||
* inode so we know that it will persist until closedir is called.
|
||||
*/
|
||||
|
||||
struct fs_psuedodir_s
|
||||
struct fs_pseudodir_s
|
||||
{
|
||||
struct inode *fd_next; /* The inode for the next call to readdir() */
|
||||
};
|
||||
|
@ -140,7 +140,7 @@ struct fs_dirent_s
|
|||
{
|
||||
/* This is the node that was opened by opendir. The type of the inode
|
||||
* determines the way that the readdir() operations are performed. For the
|
||||
* psuedo root psuedo-file system, it is also used to support rewind.
|
||||
* pseudo root pseudo-file system, it is also used to support rewind.
|
||||
*
|
||||
* We hold a reference on this inode so we know that it will persist until
|
||||
* closedir() is called (although inodes linked to this inode may change).
|
||||
|
@ -166,9 +166,9 @@ struct fs_dirent_s
|
|||
|
||||
union
|
||||
{
|
||||
/* Private data used by the built-in psuedo-file system */
|
||||
/* Private data used by the built-in pseudo-file system */
|
||||
|
||||
struct fs_psuedodir_s psuedo;
|
||||
struct fs_pseudodir_s pseudo;
|
||||
|
||||
/* Private data used by other file systems */
|
||||
|
||||
|
|
|
@ -199,7 +199,7 @@ union inode_ops_u
|
|||
#endif
|
||||
};
|
||||
|
||||
/* This structure represents one inode in the Nuttx psuedo-file system */
|
||||
/* This structure represents one inode in the Nuttx pseudo-file system */
|
||||
|
||||
struct inode
|
||||
{
|
||||
|
@ -342,7 +342,7 @@ EXTERN void weak_function fs_initialize(void);
|
|||
* mountpoint inodes. It is intended to support the mount() command to
|
||||
* when the mount command is used to enumerate mounts.
|
||||
*
|
||||
* NOTE 1: Use with caution... The psuedo-file system is locked throughout
|
||||
* NOTE 1: Use with caution... The pseudo-file system is locked throughout
|
||||
* the traversal.
|
||||
* NOTE 2: The search algorithm is recursive and could, in principle, use
|
||||
* an indeterminant amount of stack space. This will not usually be a
|
||||
|
@ -415,7 +415,7 @@ EXTERN int register_blockdriver(const char *path,
|
|||
* Name: unregister_driver
|
||||
*
|
||||
* Description:
|
||||
* Remove the character driver inode at 'path' from the psuedo-file system
|
||||
* Remove the character driver inode at 'path' from the pseudo-file system
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
@ -426,7 +426,7 @@ EXTERN int unregister_driver(const char *path);
|
|||
* Name: unregister_blockdriver
|
||||
*
|
||||
* Description:
|
||||
* Remove the block driver inode at 'path' from the psuedo-file system
|
||||
* Remove the block driver inode at 'path' from the pseudo-file system
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
|
|
@ -970,7 +970,9 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
word0(d) &= ~Sign_bit; /* clear sign bit */
|
||||
}
|
||||
else
|
||||
*sign = 0;
|
||||
{
|
||||
*sign = 0;
|
||||
}
|
||||
|
||||
#if defined(IEEE_Arith)
|
||||
# ifdef IEEE_Arith
|
||||
|
@ -1040,17 +1042,22 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
i -= (Bias + (P - 1) - 1) + 1;
|
||||
denorm = 1;
|
||||
}
|
||||
|
||||
ds = (d2 - 1.5) * 0.289529654602168 + 0.1760912590558 + i * 0.301029995663981;
|
||||
k = (int)ds;
|
||||
if (ds < 0. && ds != k)
|
||||
k--; /* want k = floor(ds) */
|
||||
{
|
||||
k--; /* want k = floor(ds) */
|
||||
}
|
||||
k_check = 1;
|
||||
|
||||
if (k >= 0 && k <= Ten_pmax)
|
||||
{
|
||||
if (d < tens[k])
|
||||
k--;
|
||||
k_check = 0;
|
||||
}
|
||||
|
||||
j = bbits - i - 1;
|
||||
if (j >= 0)
|
||||
{
|
||||
|
@ -1062,6 +1069,7 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
b2 = -j;
|
||||
s2 = 0;
|
||||
}
|
||||
|
||||
if (k >= 0)
|
||||
{
|
||||
b5 = 0;
|
||||
|
@ -1074,14 +1082,19 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
b5 = -k;
|
||||
s5 = 0;
|
||||
}
|
||||
|
||||
if (mode < 0 || mode > 9)
|
||||
mode = 0;
|
||||
{
|
||||
mode = 0;
|
||||
}
|
||||
|
||||
try_quick = 1;
|
||||
if (mode > 5)
|
||||
{
|
||||
mode -= 4;
|
||||
try_quick = 0;
|
||||
}
|
||||
|
||||
leftright = 1;
|
||||
switch (mode)
|
||||
{
|
||||
|
@ -1091,14 +1104,19 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
i = 18;
|
||||
ndigits = 0;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
leftright = 0;
|
||||
/* no break */
|
||||
case 4:
|
||||
if (ndigits <= 0)
|
||||
ndigits = 1;
|
||||
{
|
||||
ndigits = 1;
|
||||
}
|
||||
|
||||
ilim = ilim1 = i = ndigits;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
leftright = 0;
|
||||
/* no break */
|
||||
|
@ -1107,18 +1125,24 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
ilim = i;
|
||||
ilim1 = i - 1;
|
||||
if (i <= 0)
|
||||
i = 1;
|
||||
{
|
||||
i = 1;
|
||||
}
|
||||
}
|
||||
|
||||
j = sizeof(unsigned long);
|
||||
for (result_k = 0; (signed)(sizeof(Bigint) - sizeof(unsigned long) + j) <= i;
|
||||
for (result_k = 0;
|
||||
(signed)(sizeof(Bigint) - sizeof(unsigned long) + j) <= i;
|
||||
j <<= 1)
|
||||
result_k++;
|
||||
{
|
||||
result_k++;
|
||||
}
|
||||
|
||||
result = Balloc(result_k);
|
||||
s = s0 = (char *)result;
|
||||
|
||||
if (ilim >= 0 && ilim <= Quick_max && try_quick)
|
||||
{
|
||||
|
||||
/* Try to get by with floating-point arithmetic. */
|
||||
|
||||
i = 0;
|
||||
|
@ -1126,10 +1150,12 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
k0 = k;
|
||||
ilim0 = ilim;
|
||||
ieps = 2; /* conservative */
|
||||
|
||||
if (k > 0)
|
||||
{
|
||||
ds = tens[k & 0xf];
|
||||
j = k >> 4;
|
||||
|
||||
if (j & Bletch)
|
||||
{
|
||||
/* prevent overflows */
|
||||
|
@ -1137,33 +1163,44 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
d /= bigtens[n_bigtens - 1];
|
||||
ieps++;
|
||||
}
|
||||
|
||||
for (; j; j >>= 1, i++)
|
||||
if (j & 1)
|
||||
{
|
||||
ieps++;
|
||||
ds *= bigtens[i];
|
||||
}
|
||||
{
|
||||
if (j & 1)
|
||||
{
|
||||
ieps++;
|
||||
ds *= bigtens[i];
|
||||
}
|
||||
}
|
||||
|
||||
d /= ds;
|
||||
}
|
||||
else if ((j_1 = -k))
|
||||
{
|
||||
d *= tens[j_1 & 0xf];
|
||||
for (j = j_1 >> 4; j; j >>= 1, i++)
|
||||
if (j & 1)
|
||||
{
|
||||
ieps++;
|
||||
d *= bigtens[i];
|
||||
}
|
||||
{
|
||||
if (j & 1)
|
||||
{
|
||||
ieps++;
|
||||
d *= bigtens[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (k_check && d < 1. && ilim > 0)
|
||||
{
|
||||
if (ilim1 <= 0)
|
||||
goto fast_failed;
|
||||
{
|
||||
goto fast_failed;
|
||||
}
|
||||
|
||||
ilim = ilim1;
|
||||
k--;
|
||||
d *= 10.;
|
||||
ieps++;
|
||||
}
|
||||
|
||||
eps = ieps * d + 7.;
|
||||
word0(eps) -= (P - 1) * Exp_msk1;
|
||||
if (ilim == 0)
|
||||
|
@ -1176,10 +1213,12 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
goto no_digits;
|
||||
goto fast_failed;
|
||||
}
|
||||
|
||||
#ifndef No_leftright
|
||||
if (leftright)
|
||||
{
|
||||
/* Use Steele & White method of only generating digits needed. */
|
||||
|
||||
eps = 0.5 / tens[ilim - 1] - eps;
|
||||
for (i = 0;;)
|
||||
{
|
||||
|
@ -1200,6 +1239,7 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
{
|
||||
#endif
|
||||
/* Generate ilim digits, then fix them up. */
|
||||
|
||||
eps *= tens[ilim - 1];
|
||||
for (i = 1;; i++, d *= 10.)
|
||||
{
|
||||
|
@ -1234,6 +1274,7 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
if (be >= 0 && k <= Int_max)
|
||||
{
|
||||
/* Yes. */
|
||||
|
||||
ds = tens[k];
|
||||
if (ndigits < 0 && ilim <= 0)
|
||||
{
|
||||
|
@ -1242,6 +1283,7 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
goto no_digits;
|
||||
goto one_digit;
|
||||
}
|
||||
|
||||
for (i = 1;; i++)
|
||||
{
|
||||
L = (int)(d / ds);
|
||||
|
@ -1273,8 +1315,11 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
break;
|
||||
}
|
||||
if (!(d *= 10.))
|
||||
break;
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
goto ret1;
|
||||
}
|
||||
|
||||
|
@ -1304,10 +1349,12 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
b2 += i;
|
||||
s2 += i;
|
||||
mhi = i2b(1);
|
||||
}
|
||||
|
||||
if (m2 > 0 && s2 > 0)
|
||||
{
|
||||
i = m2 < s2 ? m2 : s2;
|
||||
|
@ -1315,6 +1362,7 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
m2 -= i;
|
||||
s2 -= i;
|
||||
}
|
||||
|
||||
if (b5 > 0)
|
||||
{
|
||||
if (leftright)
|
||||
|
@ -1330,11 +1378,16 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
b = pow5mult(b, j);
|
||||
}
|
||||
else
|
||||
b = pow5mult(b, b5);
|
||||
{
|
||||
b = pow5mult(b, b5);
|
||||
}
|
||||
}
|
||||
|
||||
S = i2b(1);
|
||||
if (s5 > 0)
|
||||
S = pow5mult(S, s5);
|
||||
{
|
||||
S = pow5mult(S, s5);
|
||||
}
|
||||
|
||||
/* Check for special case that d is a normalized power of 2. */
|
||||
|
||||
|
@ -1348,24 +1401,31 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
spec_case = 1;
|
||||
}
|
||||
else
|
||||
spec_case = 0;
|
||||
{
|
||||
spec_case = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Arrange for convenient computation of quotients: shift left if
|
||||
/* Arrange for convenient computation of quotients: shift left if
|
||||
* necessary so divisor has 4 leading 0 bits.
|
||||
*
|
||||
* Perhaps we should just compute leading 28 bits of S once and for all
|
||||
* and pass them and a shift to quorem, so it can do shifts and ors
|
||||
* to compute the numerator for q.
|
||||
*/
|
||||
|
||||
#ifdef Pack_32
|
||||
if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds - 1]) : 1) + s2) & 0x1f))
|
||||
i = 32 - i;
|
||||
{
|
||||
i = 32 - i;
|
||||
}
|
||||
#else
|
||||
if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds - 1]) : 1) + s2) & 0xf))
|
||||
i = 16 - i;
|
||||
{
|
||||
i = 16 - i;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (i > 4)
|
||||
{
|
||||
i -= 4;
|
||||
|
@ -1380,10 +1440,17 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
m2 += i;
|
||||
s2 += i;
|
||||
}
|
||||
|
||||
if (b2 > 0)
|
||||
b = lshift(b, b2);
|
||||
{
|
||||
b = lshift(b, b2);
|
||||
}
|
||||
|
||||
if (s2 > 0)
|
||||
S = lshift(S, s2);
|
||||
{
|
||||
S = lshift(S, s2);
|
||||
}
|
||||
|
||||
if (k_check)
|
||||
{
|
||||
if (cmp(b, S) < 0)
|
||||
|
@ -1391,10 +1458,14 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
k--;
|
||||
b = multadd(b, 10, 0); /* we botched the k estimate */
|
||||
if (leftright)
|
||||
mhi = multadd(mhi, 10, 0);
|
||||
{
|
||||
mhi = multadd(mhi, 10, 0);
|
||||
}
|
||||
|
||||
ilim = ilim1;
|
||||
}
|
||||
}
|
||||
|
||||
if (ilim <= 0 && mode > 2)
|
||||
{
|
||||
if (ilim < 0 || cmp(b, S = multadd(S, 5, 0)) <= 0)
|
||||
|
@ -1409,10 +1480,13 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
k++;
|
||||
goto ret;
|
||||
}
|
||||
|
||||
if (leftright)
|
||||
{
|
||||
if (m2 > 0)
|
||||
mhi = lshift(mhi, m2);
|
||||
{
|
||||
mhi = lshift(mhi, m2);
|
||||
}
|
||||
|
||||
/* Compute mlo -- check for special case that d is a normalized power of
|
||||
* 2. */
|
||||
|
@ -1437,9 +1511,15 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
if (j_1 == 0 && !mode && !(word1(d) & 1))
|
||||
{
|
||||
if (dig == '9')
|
||||
goto round_9_up;
|
||||
{
|
||||
goto round_9_up;
|
||||
}
|
||||
|
||||
if (j > 0)
|
||||
dig++;
|
||||
{
|
||||
dig++;
|
||||
}
|
||||
|
||||
*s++ = dig;
|
||||
goto ret;
|
||||
}
|
||||
|
@ -1455,11 +1535,15 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
b = lshift(b, 1);
|
||||
j_1 = cmp(b, S);
|
||||
if ((j_1 > 0 || (j_1 == 0 && (dig & 1))) && dig++ == '9')
|
||||
goto round_9_up;
|
||||
{
|
||||
goto round_9_up;
|
||||
}
|
||||
}
|
||||
|
||||
*s++ = dig;
|
||||
goto ret;
|
||||
}
|
||||
|
||||
if (j_1 > 0)
|
||||
{
|
||||
if (dig == '9')
|
||||
|
@ -1468,15 +1552,22 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
*s++ = '9';
|
||||
goto roundoff;
|
||||
}
|
||||
|
||||
*s++ = dig + 1;
|
||||
goto ret;
|
||||
}
|
||||
|
||||
*s++ = dig;
|
||||
if (i == ilim)
|
||||
break;
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
b = multadd(b, 10, 0);
|
||||
if (mlo == mhi)
|
||||
mlo = mhi = multadd(mhi, 10, 0);
|
||||
{
|
||||
mlo = mhi = multadd(mhi, 10, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
mlo = multadd(mlo, 10, 0);
|
||||
|
@ -1485,13 +1576,18 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
}
|
||||
}
|
||||
else
|
||||
for (i = 1;; i++)
|
||||
{
|
||||
*s++ = dig = quorem(b, S) + '0';
|
||||
if (i >= ilim)
|
||||
break;
|
||||
b = multadd(b, 10, 0);
|
||||
}
|
||||
{
|
||||
for (i = 1;; i++)
|
||||
{
|
||||
*s++ = dig = quorem(b, S) + '0';
|
||||
if (i >= ilim)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
b = multadd(b, 10, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Round off last digit */
|
||||
|
||||
|
@ -1514,12 +1610,16 @@ char *__dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
|
|||
while (*--s == '0');
|
||||
s++;
|
||||
}
|
||||
|
||||
ret:
|
||||
Bfree(S);
|
||||
if (mhi)
|
||||
{
|
||||
if (mlo && mlo != mhi)
|
||||
Bfree(mlo);
|
||||
{
|
||||
Bfree(mlo);
|
||||
}
|
||||
|
||||
Bfree(mhi);
|
||||
}
|
||||
ret1:
|
||||
|
@ -1529,9 +1629,13 @@ ret1:
|
|||
*s++ = '0';
|
||||
k = 0;
|
||||
}
|
||||
|
||||
*s = 0;
|
||||
*decpt = k + 1;
|
||||
if (rve)
|
||||
*rve = s;
|
||||
{
|
||||
*rve = s;
|
||||
}
|
||||
|
||||
return s0;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,15 @@
|
|||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define MAXEXP 308
|
||||
#define MAX_PREC 16
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(a,b) (a < b ? a : b)
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
# define MAX(a,b) (a > b ? a : b)
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Type Declarations
|
||||
|
@ -58,10 +66,6 @@
|
|||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static char* cvt(double value, int ndigits, int flags, char *sign,
|
||||
int *decpt, int ch, int *length);
|
||||
static int exponent(char *p0, int exp, int fmtch);
|
||||
|
||||
/****************************************************************************
|
||||
* Global Constant Data
|
||||
****************************************************************************/
|
||||
|
@ -78,285 +82,213 @@ static int exponent(char *p0, int exp, int fmtch);
|
|||
* Private Variables
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: zeroes
|
||||
*
|
||||
* Description:
|
||||
* Print the specified number of zeres
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void zeroes(FAR struct lib_outstream_s *obj, int nzeroes)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = nzeroes; i > 0; i--)
|
||||
{
|
||||
obj->put(obj, '0');
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cvt
|
||||
****************************************************************************/
|
||||
|
||||
static char* cvt(double value, int ndigits, int flags, char *sign,
|
||||
int *decpt, int ch, int *length)
|
||||
{
|
||||
int mode, dsgn;
|
||||
char *digits, *bp, *rve;
|
||||
|
||||
if (ch == 'f')
|
||||
{
|
||||
mode = 3; /* ndigits after the decimal point */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* To obtain ndigits after the decimal point for the 'e' and 'E'
|
||||
* formats, round to ndigits + 1 significant figures.
|
||||
*/
|
||||
|
||||
if (ch == 'e' || ch == 'E')
|
||||
{
|
||||
ndigits++;
|
||||
}
|
||||
mode = 2; /* ndigits significant digits */
|
||||
}
|
||||
|
||||
if (value < 0)
|
||||
{
|
||||
value = -value;
|
||||
*sign = '-';
|
||||
}
|
||||
else
|
||||
{
|
||||
*sign = '\000';
|
||||
}
|
||||
|
||||
digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve);
|
||||
if ((ch != 'g' && ch != 'G') || IS_ALTFORM(flags))
|
||||
{
|
||||
/* Print trailing zeros */
|
||||
|
||||
bp = digits + ndigits;
|
||||
if (ch == 'f')
|
||||
{
|
||||
if (*digits == '0' && value)
|
||||
{
|
||||
*decpt = -ndigits + 1;
|
||||
}
|
||||
bp += *decpt;
|
||||
}
|
||||
|
||||
if (value == 0)
|
||||
{
|
||||
/* kludge for __dtoa irregularity */
|
||||
|
||||
rve = bp;
|
||||
}
|
||||
|
||||
while (rve < bp)
|
||||
{
|
||||
*rve++ = '0';
|
||||
}
|
||||
}
|
||||
|
||||
*length = rve - digits;
|
||||
return digits;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: exponent
|
||||
****************************************************************************/
|
||||
|
||||
static int exponent(FAR char *p0, int exp, int fmtch)
|
||||
{
|
||||
FAR char *p;
|
||||
FAR char *t;
|
||||
char expbuf[MAXEXP];
|
||||
|
||||
p = p0;
|
||||
*p++ = fmtch;
|
||||
if (exp < 0)
|
||||
{
|
||||
exp = -exp;
|
||||
*p++ = '-';
|
||||
}
|
||||
else
|
||||
{
|
||||
*p++ = '+';
|
||||
}
|
||||
|
||||
t = expbuf + MAXEXP;
|
||||
if (exp > 9)
|
||||
{
|
||||
do
|
||||
{
|
||||
*--t = (exp % 10) + '0';
|
||||
}
|
||||
while ((exp /= 10) > 9);
|
||||
*--t = exp + '0';
|
||||
for (; t < expbuf + MAXEXP; *p++ = *t++);
|
||||
}
|
||||
else
|
||||
{
|
||||
*p++ = '0';
|
||||
*p++ = exp + '0';
|
||||
}
|
||||
return (p - p0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lib_dtoa
|
||||
*
|
||||
* Description:
|
||||
* This is part of lib_vsprintf(). It handles the floating point formats.
|
||||
* This version supports only the %f (with precision). If no precision
|
||||
* was provided in the format, this will use precision == 0 which is
|
||||
* probably not what you want.
|
||||
*
|
||||
* Input Parameters:
|
||||
* obj - The output stream object
|
||||
* fmt - The format character. Not used 'f' is always assumed
|
||||
* prec - The number of digits to the right of the decimal point. If no
|
||||
* precision is provided in the format, this will be zero. And,
|
||||
* unfortunately in this case, it will be treated literally as
|
||||
* a precision of zero.
|
||||
* flags - Only ALTFORM and SHOWPLUS flags are supported. ALTFORM only
|
||||
* applies if prec == 0 which is not supported anyway.
|
||||
* value - The floating point value to convert.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void lib_dtoa(FAR struct lib_outstream_s *obj, int ch, int prec,
|
||||
uint8_t flags, double _double)
|
||||
static void lib_dtoa(FAR struct lib_outstream_s *obj, int fmt, int prec,
|
||||
uint8_t flags, double value)
|
||||
{
|
||||
FAR char *cp; /* Handy char pointer (short term usage) */
|
||||
FAR char *cp_free = NULL; /* BIONIC: copy of cp to be freed after usage */
|
||||
char expstr[7]; /* Buffer for exponent string */
|
||||
char sign; /* Temporary negative sign for floats */
|
||||
int expt; /* Integer value of exponent */
|
||||
int expsize = 0; /* Character count for expstr */
|
||||
int ndig; /* Actual number of digits returned by cvt */
|
||||
int size; /* Size of converted field or string */
|
||||
FAR char *digits; /* String returned by __dtoa */
|
||||
FAR char *digalloc; /* Copy of digits to be freed after usage */
|
||||
FAR char *rve; /* Points to the end of the return value */
|
||||
int expt; /* Integer value of exponent */
|
||||
int numlen; /* Actual number of digits returned by cvt */
|
||||
int nchars; /* Number of characters to print */
|
||||
int dsgn; /* Unused sign indicator */
|
||||
int i;
|
||||
|
||||
cp = cvt(_double, prec, flags, &sign, &expt, ch, &ndig);
|
||||
cp_free = cp;
|
||||
/* Non-zero... positive or negative */
|
||||
|
||||
if (ch == 'g' || ch == 'G')
|
||||
if (value < 0)
|
||||
{
|
||||
/* 'g' or 'G' fmt */
|
||||
|
||||
if (expt <= -4 || expt > prec)
|
||||
{
|
||||
ch = (ch == 'g') ? 'e' : 'E';
|
||||
}
|
||||
else
|
||||
{
|
||||
ch = 'g';
|
||||
}
|
||||
value = -value;
|
||||
SET_NEGATE(flags);
|
||||
}
|
||||
|
||||
if (ch <= 'e')
|
||||
{
|
||||
/* 'e' or 'E' fmt */
|
||||
/* Perform the conversion */
|
||||
|
||||
--expt;
|
||||
expsize = exponent(expstr, expt, ch);
|
||||
size = expsize + ndig;
|
||||
if (ndig > 1 || IS_ALTFORM(flags))
|
||||
{
|
||||
++size;
|
||||
}
|
||||
}
|
||||
else if (ch == 'f')
|
||||
{
|
||||
/* f fmt */
|
||||
digits = __dtoa(value, 3, prec, &expt, &dsgn, &rve);
|
||||
digalloc = digits;
|
||||
numlen = rve - digits;
|
||||
|
||||
if (expt > 0)
|
||||
{
|
||||
size = expt;
|
||||
if (prec || IS_ALTFORM(flags))
|
||||
{
|
||||
size += prec + 1;
|
||||
}
|
||||
}
|
||||
else /* "0.X" */
|
||||
{
|
||||
size = prec + 2;
|
||||
}
|
||||
}
|
||||
else if (expt >= ndig)
|
||||
{
|
||||
/* fixed g fmt */
|
||||
|
||||
size = expt;
|
||||
if (IS_ALTFORM(flags))
|
||||
{
|
||||
++size;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
size = ndig + (expt > 0 ? 1 : 2 - expt);
|
||||
}
|
||||
|
||||
if (sign)
|
||||
if (IS_NEGATE(flags))
|
||||
{
|
||||
obj->put(obj, '-');
|
||||
}
|
||||
else if (IS_SHOWPLUS(flags))
|
||||
{
|
||||
obj->put(obj, '+');
|
||||
}
|
||||
|
||||
if (_double == 0)
|
||||
/* Special case exact zero or the case where the number is smaller than
|
||||
* the print precision.
|
||||
*/
|
||||
|
||||
if (value == 0 || expt < -prec)
|
||||
{
|
||||
/* kludge for __dtoa irregularity */
|
||||
|
||||
obj->put(obj, '0');
|
||||
if (expt < ndig || IS_ALTFORM(flags))
|
||||
|
||||
/* A decimal point is printed only in the alternate form or if a
|
||||
* particular precision is requested.
|
||||
*/
|
||||
|
||||
if (prec > 0 || IS_ALTFORM(flags))
|
||||
{
|
||||
obj->put(obj, '.');
|
||||
|
||||
i = ndig - 1;
|
||||
while (i > 0)
|
||||
{
|
||||
obj->put(obj, '0');
|
||||
i--;
|
||||
}
|
||||
/* Always print at least one digit to the right of the decimal point. */
|
||||
|
||||
prec = MAX(1, prec);
|
||||
}
|
||||
}
|
||||
else if (expt <= 0)
|
||||
{
|
||||
obj->put(obj, '0');
|
||||
obj->put(obj, '.');
|
||||
|
||||
i = ndig;
|
||||
while (i > 0)
|
||||
{
|
||||
obj->put(obj, *cp);
|
||||
i--;
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
else if (expt >= ndig)
|
||||
{
|
||||
i = ndig;
|
||||
while (i > 0)
|
||||
{
|
||||
obj->put(obj, *cp);
|
||||
i--;
|
||||
cp++;
|
||||
}
|
||||
/* A non-zero value will be printed */
|
||||
|
||||
i = expt - ndig;
|
||||
while (i > 0)
|
||||
{
|
||||
obj->put(obj, '0');
|
||||
i--;
|
||||
}
|
||||
|
||||
if (IS_ALTFORM(flags))
|
||||
{
|
||||
obj->put(obj, '.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* print the integer */
|
||||
|
||||
i = expt;
|
||||
while (i > 0)
|
||||
/* Handle the case where the value is less than 1.0 (in magnitude) and
|
||||
* will need a leading zero.
|
||||
*/
|
||||
|
||||
if (expt <= 0)
|
||||
{
|
||||
obj->put(obj, *cp);
|
||||
i--;
|
||||
cp++;
|
||||
/* Print a single zero to the left of the decimal point */
|
||||
|
||||
obj->put(obj, '0');
|
||||
|
||||
/* Print the decimal point */
|
||||
|
||||
obj->put(obj, '.');
|
||||
|
||||
/* Print any leading zeros to the right of the decimal point */
|
||||
|
||||
if (expt < 0)
|
||||
{
|
||||
nchars = MIN(-expt, prec);
|
||||
zeroes(obj, nchars);
|
||||
prec -= nchars;
|
||||
}
|
||||
}
|
||||
|
||||
/* print the decimal place */
|
||||
/* Handle the general case where the value is greater than 1.0 (in
|
||||
* magnitude).
|
||||
*/
|
||||
|
||||
obj->put(obj, '.');
|
||||
|
||||
/* print the decimal */
|
||||
|
||||
i = ndig - expt;
|
||||
while (i > 0)
|
||||
else
|
||||
{
|
||||
obj->put(obj, *cp);
|
||||
i--;
|
||||
cp++;
|
||||
/* Print the integer part to the left of the decimal point */
|
||||
|
||||
for (i = expt; i > 0; i--)
|
||||
{
|
||||
obj->put(obj, *digits);
|
||||
digits++;
|
||||
}
|
||||
|
||||
/* Get the length of the fractional part */
|
||||
|
||||
numlen -= expt;
|
||||
|
||||
/* If there is no fractional part, then a decimal point is printed
|
||||
* only in the alternate form or if a particular precision is
|
||||
* requested.
|
||||
*/
|
||||
|
||||
if (numlen > 0 || prec > 0 || IS_ALTFORM(flags))
|
||||
{
|
||||
/* Print the decimal point */
|
||||
|
||||
obj->put(obj, '.');
|
||||
|
||||
/* Always print at least one digit to the right of the decimal
|
||||
* point.
|
||||
*/
|
||||
|
||||
prec = MAX(1, prec);
|
||||
}
|
||||
}
|
||||
|
||||
/* If a precision was specified, then limit the number digits to the
|
||||
* right of the decimal point.
|
||||
*/
|
||||
|
||||
if (prec > 0)
|
||||
{
|
||||
nchars = MIN(numlen, prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
nchars = numlen;
|
||||
}
|
||||
|
||||
/* Print the fractional part to the right of the decimal point */
|
||||
|
||||
for (i = nchars; i > 0; i--)
|
||||
{
|
||||
obj->put(obj, *digits);
|
||||
digits++;
|
||||
}
|
||||
|
||||
/* Decremnt to get the number of trailing zeroes to print */
|
||||
|
||||
prec -= nchars;
|
||||
}
|
||||
|
||||
/* Finally, print any trailing zeroes */
|
||||
|
||||
zeroes(obj, prec);
|
||||
|
||||
/* Is this memory supposed to be freed or not? */
|
||||
|
||||
#if 0
|
||||
if (digalloc)
|
||||
{
|
||||
free(digalloc);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
@ -1587,7 +1587,7 @@ int lib_vsprintf(FAR struct lib_outstream_s *obj, FAR const char *src, va_list a
|
|||
|
||||
/* Perform left field justification actions */
|
||||
|
||||
prejustify(obj, fmt, flags, width, dblsize);
|
||||
prejustify(obj, fmt, 0, width, dblsize);
|
||||
|
||||
/* Output the number */
|
||||
|
||||
|
@ -1595,7 +1595,7 @@ int lib_vsprintf(FAR struct lib_outstream_s *obj, FAR const char *src, va_list a
|
|||
|
||||
/* Perform right field justification actions */
|
||||
|
||||
postjustify(obj, fmt, flags, width, dblsize);
|
||||
postjustify(obj, fmt, 0, width, dblsize);
|
||||
#else
|
||||
/* Output the number with a fixed precision */
|
||||
|
||||
|
|
Loading…
Reference in New Issue