Skip to content

Commit

Permalink
fix: fix alignment of mbox (#10, #11)
Browse files Browse the repository at this point in the history
fixes #10, #11
  • Loading branch information
kkebo committed Mar 22, 2024
1 parent a2df3df commit 6c46eaf
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 42 deletions.
4 changes: 3 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ let package = Package(
.target(
name: "Kernel",
dependencies: [
"Volatile"
"Volatile",
"MailboxMessage",
],
swiftSettings: [
.enableExperimentalFeature("Embedded"),
Expand All @@ -22,6 +23,7 @@ let package = Package(
]
),
.systemLibrary(name: "Volatile"),
.target(name: "MailboxMessage"),
],
swiftLanguageVersions: [.version("6")]
)
45 changes: 4 additions & 41 deletions Sources/Kernel/mbox.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
@preconcurrency import var MailboxMessage.mbox

let videocoreMbox = mmioBase + 0xB880
let mboxRead = videocoreMbox
let mboxPoll = videocoreMbox + 0x10
Expand All @@ -19,55 +21,16 @@ private func receiveMboxEmpty() -> Bool {
mmioLoad(mboxStatus) & mboxEmpty > 0
}

@_alignment(16)
struct Mbox {
var v1: UInt32
var v2: UInt32
var v3: UInt32
var v4: UInt32
var v5: UInt32
var v6: UInt32
var v7: UInt32
var v8: UInt32
var v9: UInt32

init(_ v1: UInt32, _ v2: UInt32, _ v3: UInt32, _ v4: UInt32, _ v5: UInt32, _ v6: UInt32, _ v7: UInt32, _ v8: UInt32, _ v9: UInt32) {
self.v1 = v1
self.v2 = v2
self.v3 = v3
self.v4 = v4
self.v5 = v5
self.v6 = v6
self.v7 = v7
self.v8 = v8
self.v9 = v9
}
}

#if RASPI4 || RASPI3
let mbox = Mbox(
9 * 4,
0, // request
0x38002, // set clock rate
12,
8,
2, // UART clock
3_000_000, // 3 Mhz
0, // clear turbo
0 // mbox tag last
)
#endif

func mboxCall(ch: UInt8) -> Bool {
withUnsafePointer(to: mbox) { ptr in
withUnsafePointer(to: &mbox) { ptr in
let addr = UInt32(UInt(bitPattern: ptr))
let r = addr & ~0xF | UInt32(ch & 0xF)
while transmitMboxFull() {}
mmioStore(r, to: mboxWrite)
while true {
while receiveMboxEmpty() {}
if mmioLoad(mboxRead) == r {
return ptr.pointee.v2 == mboxResponse
return mbox.1 == mboxResponse
}
}
}
Expand Down
13 changes: 13 additions & 0 deletions Sources/Kernel/uart.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
#if RASPI4 || RASPI3
@preconcurrency import var MailboxMessage.mbox
#endif

#if RASPI4
let mmioBase: UInt = 0xFE00_0000
#elseif RASPI3 || RASPI2
Expand Down Expand Up @@ -49,6 +53,15 @@ func initUART() {

#if RASPI4 || RASPI3
// set up clock to 3 MHz
mbox.0 = 9 * 4
mbox.1 = 0 // request
mbox.2 = 0x38002 // set clock rate
mbox.3 = 12
mbox.4 = 8
mbox.5 = 2 // UART clock
mbox.6 = 3_000_000 // 3 Mhz
mbox.7 = 0 // clear turbo
mbox.8 = 0 // mbox tag last
guard mboxCall(ch: 8) else { while true {} }
#endif

Expand Down
1 change: 1 addition & 0 deletions Sources/MailboxMessage/dummy.c
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "mbox.h"
3 changes: 3 additions & 0 deletions Sources/MailboxMessage/include/mbox.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#pragma once

volatile unsigned int __attribute__((aligned(16))) mbox[9];

0 comments on commit 6c46eaf

Please sign in to comment.