Skip to content

Commit 652b7b6

Browse files
committed
PRK Firmware for RP2350
1 parent afed5e1 commit 652b7b6

File tree

8 files changed

+157
-50
lines changed

8 files changed

+157
-50
lines changed

CMakeLists.txt

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,27 @@ if(DEFINED ENV{PICORUBY_SQLITE3})
4343
add_definitions(-DPICORUBY_SQLITE3)
4444
endif()
4545

46-
project("prk_firmware-${MSC_NAME}-${PRK_VERSION}-${PRK_BUILDDATE}-${PRK_REVISION}")
46+
if(DEFINED ENV{PICO2})
47+
set(PICO_BOARD pico2)
48+
set(R2P2_NAME R2P2_PICO2)
49+
set(BUILD_CONFIG prk_firmware-cortex-m33)
50+
set(BUILD_DIR build_pico2)
51+
add_compile_options(
52+
-mcpu=cortex-m33
53+
#-march=armv8-m.main+fp+dsp
54+
#-mabi=aapcs-linux
55+
#-mfloat-abi=softfp
56+
-fno-strict-aliasing
57+
-fno-unroll-loops
58+
-mslow-flash-data
59+
)
60+
else()
61+
set(R2P2_NAME R2P2)
62+
set(BUILD_CONFIG prk_firmware-cortex-m0plus)
63+
set(BUILD_DIR build_pico)
64+
endif()
65+
66+
project("prk_firmware-${PICO_BOARD}-${MSC_NAME}-${PRK_VERSION}-${PRK_BUILDDATE}-${PRK_REVISION}")
4767

4868
# Initializing the Raspberry Pi Pico SDK should happen after project created
4969
pico_sdk_init()
@@ -99,7 +119,7 @@ if(DEFINED ENV{PICORUBY_NO_MSC})
99119
endif()
100120

101121
add_custom_target(mrbdir ALL
102-
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/build/mrb
122+
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/${BUILD_DIR}/mrb
103123
)
104124

105125
set(RUBY_TASK_FILES
@@ -108,7 +128,7 @@ set(RUBY_TASK_FILES
108128
foreach(rb ${RUBY_TASK_FILES})
109129
add_custom_target(${rb}
110130
COMMAND ${PICORBC} -B${rb}
111-
-o${CMAKE_SOURCE_DIR}/build/mrb/${rb}.c
131+
-o${CMAKE_SOURCE_DIR}/${BUILD_DIR}/mrb/${rb}.c
112132
${CMAKE_SOURCE_DIR}/mrblib/${rb}.rb
113133
)
114134
endforeach(rb)
@@ -124,21 +144,21 @@ target_include_directories(${PROJECT_NAME} PRIVATE
124144
${CMAKE_SOURCE_DIR}/lib/picoruby/mrbgems/picoruby-mrubyc/lib/mrubyc/src
125145
${CMAKE_SOURCE_DIR}/lib/picoruby/mrbgems/picoruby-filesystem-fat/lib/ff14b/source
126146
${CMAKE_SOURCE_DIR}/lib/picoruby/mrbgems
127-
${CMAKE_SOURCE_DIR}/lib/picoruby/build/$ENV{MRUBY_CONFIG}/mrbgems
147+
${CMAKE_SOURCE_DIR}/lib/picoruby/build/${BUILD_CONFIG}/mrbgems
128148
${CMAKE_SOURCE_DIR}/lib/picoruby/build/repos/${BUILD_CONFIG}/mruby-compiler2/include
149+
${CMAKE_SOURCE_DIR}/${BUILD_DIR}/mrb
129150
)
130151

131152
target_link_directories(${PROJECT_NAME} PRIVATE
132-
${CMAKE_SOURCE_DIR}/lib/picoruby/build/$ENV{MRUBY_CONFIG}/lib
153+
${CMAKE_SOURCE_DIR}/lib/picoruby/build/${BUILD_CONFIG}/lib
133154
)
134155

135-
target_link_libraries(${PROJECT_NAME}
156+
target_link_libraries(${PROJECT_NAME} PRIVATE
136157
pico_stdlib
137158
pico_bootsel_via_double_reset
138159
tinyusb_device
139160
tinyusb_board
140161
hardware_pio
141-
hardware_sleep
142162
hardware_flash
143163
hardware_adc
144164
hardware_uart
@@ -150,6 +170,12 @@ target_link_libraries(${PROJECT_NAME}
150170
hardware_pwm
151171
mruby
152172
)
173+
# Workaround for Pico2
174+
if(NOT DEFINED ENV{PICO2})
175+
target_link_libraries(${PROJECT_NAME} PRIVATE
176+
hardware_sleep
177+
)
178+
endif()
153179

154180
# create map/bin/hex/uf2 file in addition to ELF.
155181
pico_add_extra_outputs(${PROJECT_NAME})

Rakefile

Lines changed: 101 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,50 @@
11
require "fileutils"
22

3-
ENV['MRUBY_CONFIG'] = "prk_firmware-cortex-m0plus"
4-
PICO_SDK_TAG = "2.0.0"
3+
PICO_SDK_TAG = "2.1.0"
54

6-
task :default => :production
5+
def mruby_config
6+
case ENV['BOARD']&.downcase
7+
when 'pico2'
8+
'prk_firmware-cortex-m33'
9+
else
10+
'prk_firmware-cortex-m0plus'
11+
end
12+
end
13+
14+
def cmake_flags
15+
flags = []
16+
case ENV['BOARD']&.downcase
17+
when 'pico2'
18+
flags << "PICO2=yes"
19+
end
20+
flags.join(" ")
21+
end
22+
23+
def def_board
24+
case ENV['BOARD']&.downcase
25+
when 'pico2'
26+
'-DPICO_PLATFORM=rp2350 -DPICO_BOARD=pico2'
27+
else
28+
'-DPICO_PLATFORM=rp2040 -DPICO_BOARD=pico'
29+
end
30+
end
31+
32+
def build_dir
33+
dir = case ENV['BOARD']&.downcase
34+
when 'pico2'
35+
"#{ENV['WITH_KEYMAP_DIR']}build_pico2"
36+
else
37+
"#{ENV['WITH_KEYMAP_DIR']}build_pico"
38+
end
39+
FileUtils.mkdir_p dir
40+
dir
41+
end
42+
43+
task :default do
44+
puts "Specify a task:"
45+
puts " rake pico # build for RP2040"
46+
puts " rake pico2 # build for RP2350"
47+
end
748

849
task :setup do
950
sh "bundle install"
@@ -15,36 +56,65 @@ end
1556

1657
task :all => [:libmruby, :cmake, :build]
1758

18-
desc "build debug (you may need to rake clean before this)"
19-
task :debug do
59+
desc "build debug for RP2040 (you may need to rake clean before this)"
60+
task :pico_debug do
2061
ENV['PICORUBY_DEBUG'] = '1'
62+
ENV['BOARD'] = 'pico'
2163
ENV['CMAKE_BUILD_TYPE'] = 'Debug'
2264
Rake::Task[:all].invoke
2365
end
2466

25-
desc "build production"
26-
task :production do
67+
desc "build production for RP2040"
68+
task :pico do
69+
ENV['BOARD'] = 'pico'
2770
ENV['CMAKE_BUILD_TYPE'] = 'Release'
2871
Rake::Task[:all].invoke
2972
end
3073

31-
desc "build PRK Firmware inclusive of keymap.rb (without mass storage)"
32-
task :build_with_keymap, ['keyboard_name'] do |_t, args|
74+
desc "build debug for RP2350 (you may need to rake clean before this)"
75+
task :pico2_debug do
76+
ENV['PICORUBY_DEBUG'] = '1'
77+
ENV['BOARD'] = 'pico2'
78+
ENV['CMAKE_BUILD_TYPE'] = 'Debug'
79+
Rake::Task[:all].invoke
80+
end
81+
82+
desc "build production for RP2350"
83+
task :pico2 do
84+
ENV['BOARD'] = 'pico2'
85+
ENV['CMAKE_BUILD_TYPE'] = 'Release'
86+
Rake::Task[:all].invoke
87+
end
88+
89+
def with_keymap(board)
90+
ENV['BOARD'] = board
91+
ENV['PICORUBY_NO_MSC'] = '1'
92+
ENV['WITH_KEYMAP_DIR'] = "keyboards/#{args.keyboard_name}/"
93+
Rake::Task[:all].invoke
94+
end
95+
96+
desc "build PRK Firmware inclusive of keymap.rb (without mass storage) for RP2040"
97+
task :build_with_keymap_pico, ['keyboard_name'] do |_t, args|
3398
unless args.keyboard_name
3499
raise "Argument `keyboard_name` missing.\nUsage: rake build_with_keymap[prk_meishi2]"
35100
end
36-
dir = "keyboards/#{args.keyboard_name}"
37-
FileUtils.mkdir_p "#{dir}/build"
38-
ENV['PICORUBY_NO_MSC'] = '1'
39-
ENV['PRK_BUILD_DIR'] = "#{dir}/"
40-
Rake::Task[:all].invoke
101+
with_keymap('pico')
102+
end
103+
104+
desc "build PRK Firmware inclusive of keymap.rb (without mass storage) for RP2350 (Pico2)"
105+
task :build_with_keymap_pico2, ['keyboard_name'] do |_t, args|
106+
unless args.keyboard_name
107+
raise "Argument `keyboard_name` missing.\nUsage: rake build_with_keymap[prk_meishi2]"
108+
end
109+
with_keymap('pico2')
41110
end
42111

43-
desc "build production with SQLite3 and SD card"
112+
desc "build production with SQLite3 and SD card for RP2350 (Pico2)"
44113
task :sqlite3 do
45114
ENV['PICORUBY_SQLITE3'] = '1'
46115
ENV['PICORUBY_SD_CARD'] = '1'
47116
ENV['PICORUBY_MSC_SD'] = '1'
117+
ENV['BOARD'] = 'pico2'
48118
Rake::Task[:all].invoke
49119
end
50120

@@ -55,12 +125,12 @@ end
55125
task :libmruby => "lib/picoruby" do
56126
FileUtils.cd "lib/picoruby" do
57127
sh "MRUBY_CONFIG=default rake test"
58-
sh "rake"
128+
sh "MRUBY_CONFIG=#{mruby_config} rake"
59129
end
60130
end
61131

62132
task :cmake do
63-
sh "cmake -DCMAKE_BUILD_TYPE=#{ENV['CMAKE_BUILD_TYPE']} -B #{ENV['PRK_BUILD_DIR']}build"
133+
sh "#{cmake_flags} cmake #{def_board} -DCMAKE_BUILD_TYPE=#{ENV['CMAKE_BUILD_TYPE']} -B #{build_dir}"
64134
end
65135

66136
task :check_pico_sdk => :check_pico_sdk_path do
@@ -85,29 +155,23 @@ end
85155

86156
desc "build without cmake preparation"
87157
task :build => :check_pico_sdk do
88-
sh "cmake --build #{ENV['PRK_BUILD_DIR']}build"
89-
end
90-
91-
desc "clean built that includes keymap"
92-
task :clean_with_keymap , ['keyboard_name'] do |_t, args|
93-
unless args.keyboard_name
94-
raise "Argument `keyboard_name` missing.\nUsage: rake clean_with_keymap[prk_meishi2]"
95-
end
96-
FileUtils.rm_r Dir.glob("keyboards/#{args.keyboard_name}/build/*")
158+
sh "cmake --build #{build_dir}"
97159
end
98160

99161
desc "clean built"
100162
task :clean do
101163
FileUtils.cd "lib/picoruby" do
102164
sh "rake clean"
103165
end
104-
FileUtils.cd "build" do
105-
FileUtils.rm_rf Dir.glob("prk_firmware-*.*")
106-
end
107-
begin
108-
sh "cmake --build build --target clean"
109-
rescue => e
110-
puts "Ignoring an error: #{e.message}"
166+
%(build_pico build_pico2).each do |dir|
167+
FileUtils.cd dir do
168+
FileUtils.rm_rf Dir.glob("prk_firmware-*.*")
169+
end
170+
begin
171+
sh "cmake --build #{dir} --target clean"
172+
rescue => e
173+
puts "Ignoring an error: #{e.message}"
174+
end
111175
end
112176
end
113177

@@ -116,8 +180,10 @@ task :deep_clean do
116180
FileUtils.cd "lib/picoruby" do
117181
sh "rake deep_clean"
118182
end
119-
FileUtils.cd "build" do
120-
FileUtils.rm_rf Dir.glob("*")
183+
%(build_pico build_pico2).each do |dir|
184+
FileUtils.cd dir do
185+
FileUtils.rm_rf Dir.glob("*")
186+
end
121187
end
122188
end
123189

File renamed without changes.
File renamed without changes.

build_pico2/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*
2+
!.keep
3+
!.gitignore

build_pico2/.keep

Whitespace-only changes.

src/main.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,31 @@
2121
#include "../include/sounder.h"
2222

2323
/* tasks */
24-
#include "../build/mrb/usb_task.c"
24+
#include "usb_task.c"
2525

2626
#ifdef PICORUBY_NO_MSC
2727
#include <keymap.c>
2828
#endif
2929

30-
#if defined(PICORUBY_SQLITE3)
31-
#define MEMORY_SIZE (1024*184)
32-
#else
33-
#define MEMORY_SIZE (1024*194)
30+
31+
#if !defined(HEAP_SIZE)
32+
#if defined(PICO_RP2040)
33+
#if defined(PICORUBY_SQLITE3)
34+
#error "Not enough memory for SQLite3 in RP2040"
35+
#endif
36+
#define HEAP_SIZE (1024 * 194)
37+
#elif defined(PICO_RP2350)
38+
#if defined(PICORUBY_SQLITE3)
39+
#define HEAP_SIZE (1024 * (194 + 240))
40+
#else
41+
#define HEAP_SIZE (1024 * (194 + 260))
42+
#endif
43+
#else
44+
#error "Unknown board"
45+
#endif
3446
#endif
3547

36-
static uint8_t memory_pool[MEMORY_SIZE];
48+
static uint8_t memory_pool[HEAP_SIZE];
3749

3850
int autoreload_state; /* from keyboard.h */
3951

@@ -83,7 +95,7 @@ main(void)
8395
stdio_init_all();
8496
board_init();
8597
/* PicoRuby */
86-
mrbc_init(memory_pool, MEMORY_SIZE);
98+
mrbc_init(memory_pool, HEAP_SIZE);
8799
prk_init_picoruby();
88100
/* Tasks */
89101
mrbc_create_task(usb_task, 0);

0 commit comments

Comments
 (0)