1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
Commit Graph

264 Commits

Author SHA1 Message Date
Yegor Yefremov
41db161162 doxygen/I2C: don't include overridden typedefs
Add missing #ifndefs to overridden I2C typedefs for lpc2387 CPU.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
2020-03-05 15:31:06 +01:00
Benjamin Valentin
937c954d92 cpu/lpc2387: implement periph/i2c
The lpc23xx MCU has up to three I2C interfaces.
This adds a driver for it.
The peripheral works in interrupt mode, each change of the state machine
will generate an interrupt.
The response to the states are laid out in the data sheet.

This replaces the old driver that was removed in c560e28eb6
2020-02-26 23:41:38 +01:00
benpicco
99f3f67e67
Merge pull request #13317 from benpicco/arm7-event_thread
tests/event_threads: remove arch_arm7 from blacklist
2020-02-26 08:39:00 +01:00
Gunar Schorcht
f688f84a15
Merge pull request #12928 from benpicco/newlib-multiheap
sys/newlib: enable multiple heaps in _sbrk_r()
2020-02-25 19:16:42 +01:00
Benjamin Valentin
24ed1bbb70 cpu/lpc2387: hook up extra memory sections as heap
This enables the USB, Ethernet and Backup memory regions to be used
as heap memory.
2020-02-20 17:11:25 +01:00
Benjamin Valentin
ceee5b1809 cpu/lpc2387: don't define interrupt stack size in linkerscript
Define the interrupt stacks in C code like it is done for Cortex-M.
2020-02-11 15:39:34 +01:00
Benjamin Valentin
9f4920329b cpu/lpc2387: clear BODR if POR is set
From the data sheet:

> **Note:** Only in case when a reset occurs and the POR = 0, the BODR bit
indicates if the V DD(DCDC)(3V3) voltage was below 2.6 V or not.

So the value of BODR is undefined if POR is set.
Clear it to bring it to a defined state.
2020-02-10 23:04:47 +01:00
Benjamin Valentin
76e19602a2 cpu/lpc2387: rename cpu_woke_from_backup()
The function would always return `true` after early boot, so it
is not very useful for applications.

Now it will only (but always) return true when we woke from Deep Sleep
*after* early boot. This makes it behave the same ways as the function
of the same name on SAME54.

Rename the existing function to cpu_backup_ram_is_initialized() to better
match it's semantics.
2020-02-10 23:04:47 +01:00
Benjamin Valentin
64107dd3a9 cpu/lpc2387: rtc: only initialize RTC after cold boot or external reset
On the MCB2388 plugging the power will result in both the POR and EXTR
bit being set.
Not sure if this is a property of the board, but it means RTC is also
reset after programming, so it behaves just like Backup RAM.

If we woke from Deep Sleep the POR bit will be cleared, so the RTC is not
reset.
2020-02-10 23:04:47 +01:00
Benjamin Valentin
80dde82c86 cpu/lpc2387: clear POR bit if we woke from Deep Sleep
RSIR is 0x1 (POR) if we woke from Deep Sleep.
This makes it hard to distinguish between real power-on and waking from
Deep Sleep, which is why the Backup RAM signature was introduced.

However, calling cpu_woke_from_backup() a second time will always return
true, as the signature will have been set up by early boot then.

Thus, clear the POR bit if the signature was already in place.
The result is:

	RSIR == 0 -> woke from sleep
	RSIR == 1 -> cold boot
2020-02-10 23:04:46 +01:00
Benjamin Valentin
6dbbc8f33a cpu/lpc2387: rtc: remove _rtc_set()
Calling localtime() adds considerable overhead.
There are easier ways to set the date to 1970.

For tests/periph_rtc this results in this ROM change:

master:

   text    data     bss     dec     hex
  31328     240   98064  129632   1fa60

with this patch:

   text    data     bss     dec     hex
  20036     140   98168  118344   1ce48
2020-02-10 23:04:46 +01:00
benpicco
b44cf48a87
Merge pull request #13246 from benpicco/lpc23xx-spi
cpu/lpc2387: make SPI configurable
2020-02-10 17:01:41 +01:00
Benjamin Valentin
13e578bc84 cpu/lpc2387: implement periph/adc
lpc23xx has a 10 bit ADC with up to 8 channels.

The ADC should be clocked at 4.5 MHz or less, so it uses
(72MHz CCLK / 8) / 2.
2020-02-10 13:25:26 +01:00
Benjamin Valentin
3f01f4b183 cpu/lpc2387: make periph/spi configurable 2020-01-31 12:01:09 +01:00
Benjamin Valentin
a0d188fd6b cpu/lpc2387: convert periph/spi to struct based operation 2020-01-31 08:55:29 +01:00
Benjamin Valentin
c24fb242ef cpu/lpc2387: rtc: set rtc callback arg
`_cb_arg` was never set, it was simply ignored in `rtc_set_alarm()`.
The fix is trivial: just set `_cb_arg` to the assigned argument.
2020-01-29 19:49:18 +01:00
98780ea023
cpu/armv7: move dependencies to Makefile.dep 2020-01-28 13:20:52 +01:00
benpicco
b35ef08094
Merge pull request #12901 from benpicco/lpc2387-stacks
cpu/lpc2387: use the same default stack sizes as cortexm_common
2019-12-18 14:12:58 +01:00
Benjamin Valentin
a90663c9e7 cpu/lpc2387: provide ISR_STACKSIZE & thread_isr_stack_start()
Those are needed by MicroPython
2019-12-17 13:37:32 +01:00
Benjamin Valentin
b1808800ed cpu/lpc2387: align lpc2387.ld with cortexm_base.ld
For better compatibility copy most of cortexm_base.ld
and use the same section names.

Only interrupt stacks and the two additional (currently unused)
heap sections are different between the two now.
2019-12-09 15:13:53 +01:00
Benjamin Valentin
d57e03c94c cpu/lpc2387: use the same default stack sizes as cortexm_common
Both architectures are variants of the ARM architecture and use the same
toolchain.
There is no reason to have such wildly different defaults.

This results in some tests passing that would crash before:

 - [x] `tests/pkg_libcose`
 - [x] `tests/pkg_qdsa`
 - [x] `tests/pkg_relic`
 - [x] `tests/pkg_tweetnacl`
 - [x] `tests/pthread_tls`

`THREAD_EXTRA_STACKSIZE_PRINTF_FLOAT` is not used anywhere in RIOT
anymore, so just drop it.
2019-12-08 22:07:57 +01:00
Benjamin Valentin
f89b852c1d cpu/lpc2387: clean up lpc2387.ld
Clean up the linkerfile and bring it more in line with cortexm_base.ld
(so far only for the ROM part)

As a bonus, tests/cpp_ctors works now.
2019-11-29 12:13:21 +01:00
Benjamin Valentin
ed0f72c856 cpu/lpc2387: startup.s: remove dead code
Setting up the .data and .bss section happens in arm7_init.c now.
The code was commented out anyway, so just remove it.
Also remove leftover variable declarations that were only used in
the dead code.
2019-11-29 12:00:52 +01:00
Benjamin Valentin
32bbba2fc5 cpu/lpc2387: add support for backup RAM
lpc23xx has 2k of battery RAM that is retained in Deep Power Down mode.

To not overwrite that data it must only be initialized on Power On Reset.
However, RSIR looks the same when waking up from Deep Power Down as it does
on the power-on case.

So use 4 bytes of the backup RAM to keep a signature that is only valid if
memory was retained (no power-on Reset).

A small change to the linker script is required so two sections can be
placed into flash.
2019-11-28 11:33:03 +01:00
Benjamin Valentin
15fcbe837a cpu/lpc2387: add definition of RSIR bits
Add the bits of the Reset Source Identification Register
2019-11-28 11:30:38 +01:00
Benjamin Valentin
964725259a cpu/lpc2387: implement periph/dac
The 10 bit DAC on the lpc23xx is very simple.
It only has one channel and can only be mapped to a single pin (P0.26).

After setting the pin mode to DAC no further configuration in needed.
2019-11-26 01:49:45 +01:00
Benjamin Valentin
8337ab111e cpu/arm7_common: hook up puf_sram
puf_sram only relies on an uninitialized chunk of memory.
This means to enable it we just have to hook up puf_sram_init().

All memory after __bss_end should be uninitialized at startup, so
just use that.
2019-11-25 02:04:34 +01:00
c6a80b4f4b cpu/lpc2387: fix typos 2019-11-23 22:39:36 +01:00
Francois Berder
4a31f94cfc many typo fixes
Signed-off-by: Francois Berder <18538310+francois-berder@users.noreply.github.com>
2019-11-23 22:39:07 +01:00
Benjamin Valentin
8424d1845b cpu/lpc2387: fix doxygen errors
Document macros and remove an unused function.
2019-11-22 09:11:39 +01:00
Benjamin Valentin
a9d1825e2e cpu/lpc2387: implement periph/pm
Enable IDLE and Deep Powerdown mode.

IDLE is pretty straightforward - insteady of busy waiting, the CPU will
enter an idle state from which it will resume on any event.

Deep Power Down shuts off the entite system except for the battery backup
power domain.
That means the CPU will reset on resume and can be woken by e.g. RTC.

SLEEP and POWERDOWN disable the PLL and the PLL and Flash respectively.
This requires some proper wake-up handling.

Since this turned out to be a major time sink and those modes are never
currently never used in RIOT outside of tests, I left this as an exercise
for a future reader.
2019-11-22 09:11:39 +01:00
Yegor Yefremov
fa3b0ff04b doxygen/SPI: don't include overridden typedefs
Add missing #ifndefs to overridden SPI typedefs.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
2019-11-15 10:35:32 +01:00
Marian Buschsieweke
72714aefea
cpu/lpc2387: Added MCU provided features
Added features provided by the LPC2387 MCU to cpu/lpc2387/Makefile.features
2019-11-08 14:02:35 +01:00
Benjamin Valentin
9e68556393 boards/msba2: configure remaining UARTs
All UARTs on the MSBA2 are exposed through pin headers on the board.
Configure them according to the data sheet.
2019-11-07 21:55:25 +01:00
Benjamin Valentin
c544c41804 cpu/lpc2387: fix indent 2019-11-07 21:55:24 +01:00
Benjamin Valentin
d6a94d4e18 cpu/lpc2387: uart driver overhaul
This converts the hard-coded UART driver to the new ways.

 - allow the board to configure the RX & TX pins
 - allow for more than one UART
 - allow setting the baudrate
 - implement poweron()/poweroff() functions
2019-11-07 21:55:24 +01:00
Benjamin Valentin
5ec9f62a0b cpu/lpc2387: add UART register map 2019-11-04 01:21:08 +01:00
Martine Lenders
ea4b78654f
Merge pull request #12285 from JulianHolzwarth/pr/posix/pthread/pthread_reaper_fix
sys/posix/pthread/pthread.c: fix pthread reaper
2019-10-29 18:56:36 +01:00
Marian Buschsieweke
d4adcfd92d
Merge pull request #12581 from benpicco/lpc2387-xtal_select
cpu/lpc2387: allow for more flexible clock selection
2019-10-28 12:32:11 +01:00
Benjamin Valentin
d6ca62576d cpu/lpc2387: allow use of other XTALs
Currently the cpu/lpc2387 init code hard-codes a 16 MHz
external oscillator.
Instead, calculate the PLL multiplier based on the board define
and also allow to run without an external oscillator.
2019-10-28 11:11:40 +01:00
Benjamin Valentin
985fb53c9f cpu/lpc2387: enable RTC on init
All other CPU implementations have the RTC running after
rtc_init() was called.

Fix this for lpc2387.
2019-10-27 01:33:13 +02:00
Gaëtan Harter
1e561e9f63 cpu/lpc2387: increase 'pthread_reaper' stacksize
At the time of configuration, the pthread-reaper uses '164' bytes of
stack when 'idle' stack is only '160'. By having double it gives some
margin.

ps
        pid | name                 | state    Q | pri | stack  ( used) | base addr  | current
          1 | idle                 | pending  Q |  15 |    160 (  128) | 0x4000007c | 0x4000009c
          2 | main                 | running  Q |   7 |   2560 ( 1232) | 0x4000011c | 0x4000095c
          3 | pthread-reaper       | bl rx    _ |   0 |    320 (  164) | 0x40000bac | 0x40000c48
            | SUM                  |            |     |   3040 ( 1524)
2019-09-25 16:17:01 +02:00
Benjamin Valentin
e3b0874305 cpu/lpc2387: clean up the platform
- move clock setup from boards/ to cpu/
 - reduce code duplication
2019-09-16 13:08:56 +02:00
Benjamin Valentin
b1724a7d1b periph/rtc: normalize struct tm before usage
A naive implementation may set a RTC alarm in 30s by calling

	struct tm now;
	rtc_get_time(&now);
	now.tm_sec += 30;
	rtc_set_alarm(&now, _cb, NULL);

This works for RTC implementations that use a RTT internally and call
mktime() to convert the struct tm to a unix timestamp, as mktime() will
normalize the struct in the process.

Call rtc_tm_normalize() when the RTC uses separate registers for time / date
components to ensure it is normalized.

This also modifies tests/periph_rtc to exercise this case.
2019-09-12 11:32:31 +02:00
Marian Buschsieweke
2d415d16c9
cpu/arm7_common: Cleaned up interrupt vectors
- split up interrupt vector code from bootloader.c to vectors.c
- moved bootloader.c to arm7_init.c
- Use consistent naming:
    - use lower case for everything but preprocessor stuff
    - ISRs now named isr_foo()
2019-07-25 22:41:08 +02:00
smlng
2de4b3011b periph_common: add as dependency to periph drivers
Rational: the periph_common module is required by (most) other periph drivers
and also during startup of the CPU/MCU to run periph_init. The latter is only
required if other periph drivers are used, hence periph_common should be a
depency of periph_* modules and *not* of the CPU/MCU. This PR fixes that
by making periph_common a depency of periph_* and removing the explicit
include in the CPU/MCU implementation.
2019-06-03 13:44:10 +02:00
Benjamin Valentin
1c3f96495d ldscripts: move .noinit section behind .bss section
If the .noinit section starts at the beginning of the RAM,
a bootloader that is unaware of it will clear it.
Instead, move it behind the .bss section, hoping that a bootloader
will always use less .bss memory than RIOT proper.
2019-05-16 23:11:45 +02:00
Martine Lenders
0ed57df4b5 lpc2387: mark closing #endif for MODULE_PERIPH_GPIO_IRQ 2018-10-09 15:11:00 +02:00
Hauke Petersen
72986ecb9b cpu/lpc2387/gpio: use gpio_irq feature 2018-09-21 08:19:15 +02:00
Marian Buschsieweke
f31375a152
cpu/lpc2387: Use PRIu32 in DEBUG() in mci 2018-08-14 15:35:12 +02:00