1
0
mirror of https://github.com/elua/elua.git synced 2025-01-08 20:56:17 +08:00

55 Commits

Author SHA1 Message Date
Bogdan Marinescu
00ee06e90f generic stdio fix: now you should be able to use your terminal emulator with any kind of line endings on send (previously it only accepted CR+LF line endings) 2009-03-10 20:39:51 +00:00
James Snyder
1f2ffb2bfd Minor rearrangements for ADC.
Removed flush function.  Setting smoothing will now flush the buffers.
2009-03-06 20:38:26 +00:00
James Snyder
b4290c4aa4 Added timer compatibility check.
Smoothing resize checks that no operations are pending.
2009-03-05 07:06:59 +00:00
James Snyder
f1feb1e113 Name change, makes more sense as prepchannel rather than primechannel. 2009-03-05 07:06:16 +00:00
James Snyder
3fc868b534 ADC Changes
- removed getsmoothing, setfreerunning, samplesready
- isdone has returned so that one can check if the reason why the buffer is
  dry is because no more samples are being collected
- smoothing should support fairly large lengths now (as long as you have the
  memory)
- added support to adc.sample to take a table as the first argument so that a
  set of channels can be started at closer to the same time.
    example:
    adcchannels = {0,1,2,3}
    adc.sample(adcchannels,8)

    this should collect samples on all 4 channels starting nearly at the same
    time.

- more comments added to elua_adc.c to describe behavior.

Misc
- remove rndpow2, not being used
2009-03-03 01:23:45 +00:00
Bogdan Marinescu
d0657f08ff More work on the docs:
- "building" page completely rewritten
- a new page about the toolchains used in eLua
- a graphical representation of the system architecture (doc/wb_img/elua_arch.png) that will be used in a soon to come page about the eLua architecture

Also:

- validate.h updated with some new tests (still needs more work)
- "arm-gcc-eabi" toolchain name changed to "codesourcery", since this is obviously way more intuitive :)
2009-02-24 22:09:22 +00:00
James Snyder
554dd7126b ADC can now run in freerunning mode (keep collecting samples after ring buffer
is full). Clock and sampling frequency have been moved to a separate function
from burst.  There is now one function to initiate sampling called sample
which takes a channel and count.  setclock takes a channel, clock_id, and
frequency.  Adjustments should be made to make channel groupings somewhat
cleaner, but this is functional.

Suggestions are welcome for simplification :-)

I'll try and make some doc updates in the coming day or so to reflect
finalized adjustments.
2009-02-24 07:58:10 +00:00
Bogdan Marinescu
59c35cc20d Added a very simple allocator to eLua. It's probably the most basic version of a chained blocks allocator. It's slow and it won't handle fragmentation nearly as well as dlmalloc(), but it's much smaller and it doesn't need the extra book-keeping space needed by dlmalloc (about 1KB for each memory space).
Recommended only for systems with very low memory (Flash/RAM), and prefferably systems running only precompiled Lua (if you need to compile the code, you might get into stack overflows, and this allocator is much more sensitive to this kind of stuff than dlmalloc()). In fact, this allocator seems to suggest that one should set the stack to at least 4k for the Lua parser to run properly even on small programs. I won't do this just yet, rather I'll keep on trying to move the Lua parser data structures from stack to heap. For now we're OK with the current configuration.
The allocator can handle multiple memory spaces.
Enable with "allocator=simple" on the scons command line.

...oh yes, also added a newline to the end of elua_adc.c :) (to avoid some annoying warnings)
2009-02-18 22:13:48 +00:00
Bogdan Marinescu
f253c9003f - fixed a small AVR32 syntax error
- added newlines to the end of some files to avoid GCC errors
2009-02-17 18:57:05 +00:00
James Snyder
5a6a4d017e Switch byte copying in buf.c to a Duff's device. This seems to work as well
for me as memcpy did.

Check out inc/utils.h, since this Duff's device is implemented as a macro
which could be used for unrolling other loops selectively.
2009-02-17 03:52:29 +00:00
James Snyder
b3f6110150 ADC bugfixes, and change to sample and burst being non-blocking. Samples are
acquired with getsamples.
2009-02-16 23:01:32 +00:00
Bogdan Marinescu
42ff856578 - the "pio" module is now called "gpio" (Dado will be finally happy :) )
- new addition to the PIO module: now you can use pin ranges in PIO expressions. For example:

  gpio.PA_3_6_DIR = gpio.OUTPUT -- make pins 3-6 from PORTA outputs
  gpio.PB_0_30_PULL = gpio.PULLUP -- activate pullups on all but the last pin of PORTB
  gpio.PB_3_6 = 11 -- set value 10 (1011) to pins 3-6 of PB (so PB.6 == 1, PB.5 == 0, PB.4 == 1, PB.3 == 1 )
  value = gpio.PB_2_9 -- read the value of pins 2-9 of PB into 'value'

  Of course, one can still specify a single pin instead of a range.
  This is still tested, but seems to work fine for now.
- romfs/ samples updated to work with the new module name and syntax
- small fix to buf.c (in the BUF_MOD_INCR macro).
2009-02-16 20:18:48 +00:00
James Snyder
db423ba662 ADC fixes and temporary workarounds for handling buffer resizing. 2009-02-16 07:37:28 +00:00
James Snyder
fbe307e12a Fairly large number of changes in here to make adc work with lua's provided
buf.c.

The smoothing buffer is still kept separate from the main buffering system,
but as samples come in via interrupt, they are placed into a "standard" elua
buf.  The size of this buf is configured according to whether one is grabbing
a bunch of samples rapidly (burst), or singly in order to accommodate the
expected number of incoming samples.  If smoothing is enabled, incoming
samples are claimed until the smoothing buffer is full, and then remaining
samples are left in the main buffer until they are collected.  This means that
whether one is collecting single samples or samples at burst rate, and
smoothing is enabled, the filter will only be providing samples that have
enough history.

Added a function to manually flush both smoothing and main buffers.
This would be useful if you know your state has changed and you only want
fresh samples that are going to be collected after a flush.

Also, a lot of functionality moved into elua_adc.c and common.c
(boundaries for what belongs where, might be evaluated), reducing the number
of platform.c specific functions dramatically.

Basic functionality seems to be working, but some more testing should be done.

Also, given that there's now a dynamic buffer behind everything, a shift in
the way sampling is handled could be done:
sample and burst functions could be made to be non-blocking, and to never
return anything except for errors.
a separate getsamples function could be used for removing samples collected by
either function from the buffer.
Suggestions are welcome as it would be nice to keep usage paradigms stable
after the 0.6 release.
2009-02-16 00:53:00 +00:00
Bogdan Marinescu
45285ea064 - LTR: even if we (obviously) can't set new keys/values in a rotable, we still respect the __newindex metamethod. This allows for interesting tricks, like the one shown below :)
- complete rewrite of the PIO module. New usage:

pio.PA = 10 -- set the value of PA to 10
pio.PB_1 = 1 -- set the value of pin 1 of PB to 1

local value = pio.PB -- get the value of PB
local value = pio.PB_3 -- get the value of pin 3 of PB

pio.PA_DIR = pio.OUTPUT/pio.INPUT - set the direction of PA
pio.dir[ pio.PA ] = pio.OUTPUT/pio.INPUT - same as above

pio.PA_2_DIR = pio.OUTPUT/pio.INPUT - set the direction of pin 2 of PA
pio.dir[ pio.PA_2 ] = pio.OUTPUT/pio.INPUT - same as above

pio.PA_PULL = pio.PULLUP/pio.PULLDOWN/pio.NOPULL - set pulls on PA
pio.pull[ pio.PA ] = pio.PULLUP/pio.PULLDOWN/pio.NOPULL - same as above

pio.P0_3_PULL = pio.PULLUP/pio.PULLDOWN/pio.NOPULL - set pulls on pin 3 of P0
pio.pull[ pio.P0_3 ] = pio.PULLUP/pio.PULLDOWN/pio.NOPULL - same as above

- samples modified to use the new PIO syntax
- bugfix in AT91SAM7X256 UART int handler
- fixed yet another bug in AVR32's libc (actually replaced strcmp (which is broken on AVR32) with a custom version).
2009-02-10 17:54:01 +00:00
James Snyder
a973e8f4e9 Modification of buf.c so that logsize^2 represents number of bytes in buffer.
Element byte counts must be a power of 2.
2009-02-10 05:50:48 +00:00
James Snyder
c6fd54ce7e - Buffer refactored to handle multibyte data.
Code which was previously using buffer has been updated to work with the
  changes.
  API has also changed in accordance:

  int buf_set(unsigned resid, unsigned resnum, u8 logsize, size_t dsize);
  int buf_is_enabled( unsigned resid, unsigned resnum );
  unsigned buf_get_size( unsigned resid, unsigned resnum );
  unsigned buf_get_count( unsigned resid, unsigned resnum );
  int buf_write( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize );
  int buf_read( unsigned resid, unsigned resnum, t_buf_data *data, size_t dsize  );

  Essentially buf_rx_cb and buf_get_char have been renamed to buf_write and
  buf_read.  For these, one now passes a pointer to where the data is coming
  from or going to, and a dsize parameter indicating how many bytes should be
  copied.  Also, buf_set takes this same dsize parameter, and keeps it in the
  struct.  This allows us to ensure that when data is read or written the
  number of bytes matches the buffer element size.

  I thought about maintaining compatibility functions to provide the original
  buf_rx_cb and buf_get_byte API calls, however there weren't a large number
  of uses of buf, so it wasn't hard to convert things.

  One caveat: BUF_MOD_INCR assumes that byte counts for alternate type sizes
  will be powers of 2.

  Also, BUF_SIZE_xx's are assumed to refer to element counts.

- UART buffering enabled on LM3S

This doesn't include switching the ADC code over to using these buffers quite
yet.

I'm open to comments on these modifications if theres a better or simpler
approach.  I've checked to make sure buffers work on LM3S, but I don't own any
other platforms to make sure there aren't unintended side-effects.
2009-02-09 03:43:47 +00:00
James Snyder
709d18c080 Updated ADC Module:
- now uses bitfields rather than HWREGBITW for keeping track of state
- started generalizing functionality for smoothing, state tracking etc... into
  separate functions
- burst mode now works, including with smoothing enabled (only operates in a
  blocking mode, non-blocking to come later)
2009-01-31 21:04:08 +00:00
James Snyder
da35498b02 - ADC now runs with an interrupt handler, which manages samples from each
channel.  Smoothing support (rolling average) has been added. adcscope has
  been updated to reflect these changes, and show output from 4 channels at
  once.

- fix for typo in stm32/platform.c
2009-01-27 20:49:45 +00:00
Bogdan Marinescu
0d9fcf9909 - lua parsing: lparser.c was modified to allocate some of its structures to
the heap instead of the stack. Also, the stack size was bumped to at least
  2048 bytes on all backends. Hopefully this will take care of most issues
  related to stack overflows.

- new buffering system available. Originally I planned to make it fully
  generic, but I came to the conclusions that this would take too much
  development work and system resources (RAM/Flash) if done properly, so
  currently it's only used on UART RX (although it could be easily extended
  for other peripherals). For an example of use check the AT91SAM7X and
  AVR32 backend (platform_init and associated interrupt handlers and also
  platform_conf.h).

- new XMODEM implementation. Better, cleaner, bug fixed, and BSD instead of
  GPL.

- AVR32 can use the huge (32MBytes) SDRAM on the board as system memory now.

- fixed an error in elua_sbrk/_sbrk_r (and revised the compilation options
  for dlmalloc).

- added the CPU module and interrupt support on the STR9 platform.

- uart module changes: 'sendstr' is out, but the regular 'send' will send
  strings instead of simple chars (which makes sense since Lua doesn't have
  a "char" type). Also, the 'timer_id' and 'timout' parameters of the 'recv'
  function are now optional.
2009-01-22 19:46:47 +00:00
James Snyder
cd2e9e1cf0 Initial ADC implementation. 2009-01-21 23:40:34 +00:00
Bogdan Marinescu
f729155fce - Lua Tiny RAM (LTR) patch is now integrated in eLua and is enabled by default
- all eLua modules updated to work with LTR
- "cpu" module added to avr32, at91sam7x, str7
- "disp" module no longer generic (now stays in src/modules/lm3s). For this reason, the "disp" platform interface was also removed.
- the "modcommon" mechanism in STM32 (ROM loader) was depreciated in favour of the Lua Tiny RAM patch (and the "stm3210lcd" module from the STM32 backend now uses LTR).
- small bugfixes
2009-01-11 20:43:02 +00:00
Bogdan Marinescu
58da9ac870 - factored out common code from all backends in src/common.c
- added virtual timers (on LM3S, AVR32 and AT91SAM7 for now)
- added interrupt handling code for AT91SAM7 and AVR32
- fixed two serious bugs that prevented the eLua image to run on both STR9 and LPC2888 (linker command file issues)
- fixed line endings (DOS->UNIX) in the STM32 library files
- fixed preprocessor errors (hopefully all of them) like #if ELUA_CPU == LM3S8962
- other minor or less than minor fixes :)
2009-01-07 20:17:18 +00:00
Bogdan Marinescu
c1d88386dc many fixed to the AVR32 backend, update if you need AVR32 support 2008-12-14 21:39:51 +00:00
Bogdan Marinescu
edac46fcd6 preliminary AVR32 port 2008-12-13 23:31:40 +00:00
Dado Sutter
9083b3171c - Added support for RIT128x96x4 OLED Display on LM3S8962 platform, on module "disp"
- ls shell command enhanced with column aligned file sizes and total size report
- New section on CHANGELOG for ongoing dev changes, to ease up next release
- pong.lua added to examples in romfs
- minor URL and e-mail updates, to reflect the new eluaproject.net domain
2008-11-30 22:30:06 +00:00
Dado Sutter
13d6993b43 Code added for an "ls" (or "dir") shell command 2008-11-24 13:48:46 +00:00
Bogdan Marinescu
967722761a ready for 0.5 2008-11-01 18:32:37 +00:00
Bogdan Marinescu
df5a678aa5 multiple changes, documentation updated, getting ready for the new release 2008-10-31 21:32:15 +00:00
Bogdan Marinescu
592b7a2ac7 changed the build system a bit; now all the configuration for a specific target is done in a file called 'platform_conf.h' from the src/platform/<target> directory. I did this because the number of mandatory target specific files was continuously increasing 2008-10-09 10:49:07 +00:00
Bogdan Marinescu
d2c5756200 - added the "CPU" module. its role: access data directly (read/write) for 32/16/8 bits variables, and also provide access to CPU constants (should be defined in platform_cpu.h, see lm3s code)
- the "clock" method is now part of the CPU module, thus is out of the platform data module. pd becomes a fully platform independent module.
2008-09-26 20:41:11 +00:00
Bogdan Marinescu
05ddf01cf3 - fixed a serious bug in the implementation of the eLua UIP support code. Now one can have multiple TCP/IP connection _without_ mixing the data buffers between them :)
- added the resolver application (src/uip/resolv.*) to eLua (configurable by BUILD_DNS in build.h) to allow DNS lookups
- more functions in the "net" module, more tests, it seems to work fine now in both "server mode" and "client mode"
- console over TCP works once again, or should I say "now works". It turns out that it never worked with the code in SVN, because I committed a wrong file a while ago.
2008-09-23 19:39:14 +00:00
Bogdan Marinescu
9ab61f0e56 the latest 'net' module broke support for console over TCP. Still investigating why. Until then I'll commit a version that at least compiles with BUILD_CON_TCP enabled 2008-09-22 22:09:12 +00:00
Bogdan Marinescu
c1c5e58904 added the 'net' module for eLua, ONLY VERY BRIEFLY TESTED. Finally, we have TCP/IP from eLua 2008-09-22 21:17:44 +00:00
Bogdan Marinescu
c28cbf108c added support for dynamic IP configuration (DHCP), enabled by default (so far) on LM3S 2008-09-20 15:14:05 +00:00
Bogdan Marinescu
4793225724 eLua now works over TCP/IP instead of serial connection. This is basically printf/scanf over TCP/IP instead of UART, so it should look&feel just like "regular" Lua, except that you don't have
ANSI terminal support (yet) and "recv" doesn't work anymore because XMODEM doesn't work over TCP/IP. Only for LM3S8962/LM3S6965 for now, but it should straightforward (not easy though)
to port it to other platforms. Only static IP for now. More TCP/IP functions need to be implemented (and an eLua module must be written to access them). To enable console over TCP:

- enable "BUILD_CON_TCP" in build.h, also disable "BUILD_XMODEM" and "BUILD_TERM" in build.h (you'll get an error if you don't)
- disable "BUILD_CON_GENERIC" in build.h (you'll get an error if you don't)
- edit your network settings in build.h
- build the image&burn it
- telnet to the address configured in build.h. Be sure to use a decent telnet client, like the one in Linux or putty. Don't try with telnet from Windows, as it surely won't work. Also, it might
  not work with the telnet client from Tera Term Pro (didn't test this).
- type 'exit' from shell to terminate the connection.

Also, note that from this point on you'll need a newer version of binutils to compile for Cortex. I'm using binutils-2.19.50.tar.bz2 (from the snapshots page). 2.18 might work too, but I didn't
test it.
2008-09-18 20:22:15 +00:00
Bogdan Marinescu
e80bed4b04 _PRELIMINARY_ TCP/IP support, for now only on Cortex, only with uIP, only ping (ICMP) handling, no actual TCP/IP data transfer. 2008-09-15 21:54:14 +00:00
Bogdan Marinescu
747da02673 - made the math lib configurable with the "platform libs" mechanism. This way one can have a floating point Lua (thus being able to use fundamental floating point operations), but without the
mathlib (sin, cos, tan and all the other functions from there).
- corrected "pwmled.lua" (removed a debug print)
- bumped version number to minor versn 0.4.1
2008-09-10 18:41:31 +00:00
Bogdan Marinescu
b54c4503f7 bumped version number 2008-09-02 10:55:52 +00:00
Bogdan Marinescu
b5f59efa8e - added "board" as a compile time parameter, it will specify a name for the board on which eLua works. This helps if the same CPU is used on more than one board with different
I/O setup. 
- the pd() module has a new method (board) and gets it CPU, platform and board name directly from the build system (command line macros). It's much easier to work like this.
- the samples (examples/) were updated to check pd.board() rather than pd.platform()/pd.cpu(), which is a much more logical way to do things, since it ties the sample to a 
  specific I/O configuration, not with a CPU.
- updated PWM code for AT91SAM7X, now the "piano" example works for both LM3Sxxxx and AT91SAM7X256.
- added 3 new methods to the PIO module: pullup(), pulldown(), ad nopullup(), their meaning is obvious.
2008-08-27 20:05:09 +00:00
Bogdan Marinescu
b6e7ade77c - malloc.c/.h are now dlmalloc.c/.h
- new shell command: mem
- new module: bit (for bit operations)
- removed UARTx, TMRx, SPIx, PWMx constants from the respectives modules, as they only waste memory space. But now the same
  modules will return an error (via luaL_error) if an invalid resource ID is used. Note that this does not apply to PIO, since
  PIO uses special encodings for ports/pins.
- new methods in pio: port and pin to return the port/pin encoded in a pio value.
2008-08-27 13:39:10 +00:00
Bogdan Marinescu
86386ae363 fixed a few unsigned->signed overflows 2008-08-19 20:21:10 +00:00
Bogdan Marinescu
3ce5487a73 added the PWM module, so far supported only on LM3S 2008-08-18 16:29:09 +00:00
Bogdan Marinescu
7f7315adfd Finally added support for multiple memory spaces (preliminary). It works on my
LPC2888 board. The allocator used is dlmalloc, just as in Newlib, but it's a 
newer version than can handle non-contiguous memory spaces (2.8.3, as opposed
to 2.6.4 in Newlib 1.16.0, I really have no idea why they're using such an
ancient version of dlmalloc). To use it add "allocator=multiple" to your scons
command line (default for LPC2888).
2008-08-16 22:27:02 +00:00
Bogdan Marinescu
660418c23d Tried two different TLSF implementations, none of them works properly. Will try to
use a different dlmalloc version for multiple memory spaces. In any case, TLSF is
OUT.
2008-08-16 15:50:16 +00:00
Bogdan Marinescu
75311aec51 TLSF allocator from rtportal, not working properly 2008-08-14 07:38:30 +00:00
Bogdan Marinescu
09ac410a02 Added support for multiple RAM spaces using the TLSF allocator.
This takes care of my LPC2888 board (any many other board out there)
that have RAM both on the CPU itself and on a separate chip.
To use it add "allocator=tlsf" to your scons build command.
Even though the code for all the platform was modified, the new code
should not modify the "old" allocator behaviour.
Also added a new "mem" command to the shell, it gives information about
the current RAM state (total, used, free).
NOT YET TESTED !!! So use with care.
2008-08-13 13:42:57 +00:00
Bogdan Marinescu
0ec2230e8e bumped version number 2008-08-09 09:56:08 +00:00
Bogdan Marinescu
f52fc32230 added ESC to term keys 2008-08-07 11:45:43 +00:00
Bogdan Marinescu
a3b3d3f7dc added term module to Lua, various fixes 2008-08-05 19:58:19 +00:00