-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
10 changed files
with
1,063 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# | ||
# Makefile for Phoenix-RTOS 3 device drivers | ||
# | ||
# MCX N94x drivers | ||
# | ||
# Copyright 2019, 2020, 2024 Phoenix Systems | ||
# | ||
|
||
# MCXTODO | ||
|
||
DEFAULT_COMPONENTS := mcxn94x-multi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# | ||
# Makefile for Phoenix-RTOS mcxn94x-multi | ||
# | ||
# Copyright 2024 Phoenix Systems | ||
# | ||
|
||
NAME := mcxn94x-multi | ||
|
||
LOCAL_PATH := $(call my-dir) | ||
|
||
LOCAL_SRCS = mcxn94x-multi.c dev.c uart.c dummyfs.c | ||
DEP_LIBS := libtty libklog libpseudodev | ||
LIBS := libdummyfs libklog libpseudodev libposixsrv | ||
LOCAL_HEADERS := mcxn94x-multi.h | ||
|
||
include $(binary.mk) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/* | ||
* Phoenix-RTOS | ||
* | ||
* MCX N94x common | ||
* | ||
* Copyright 2017, 2018, 2024 Phoenix Systems | ||
* Author: Aleksander Kaminski, Hubert Buczynski | ||
* | ||
* This file is part of Phoenix-RTOS. | ||
* | ||
* %LICENSE% | ||
*/ | ||
|
||
#ifndef _COMMON_H_ | ||
#define _COMMON_H_ | ||
|
||
#include <arch.h> | ||
#include <board_config.h> | ||
#include <phoenix/arch/armv8m/mcx/n94x/mcxn94x.h> | ||
|
||
#include "mcxn94x-multi.h" | ||
|
||
|
||
#define NELEMS(x) (sizeof(x) / sizeof(*(x))) | ||
|
||
|
||
static inline void common_dataBarrier(void) | ||
{ | ||
__asm__ volatile ("dmb"); | ||
} | ||
|
||
|
||
static inline void common_dataSyncBarrier(void) | ||
{ | ||
__asm__ volatile ("dsb"); | ||
} | ||
|
||
|
||
static inline void common_instrBarrier(void) | ||
{ | ||
__asm__ volatile ("isb"); | ||
} | ||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
/* | ||
* Phoenix-RTOS | ||
* | ||
* Multidriver device manager | ||
* | ||
* Copyright 2024 Phoenix Systems | ||
* Author: Aleksander Kaminski | ||
* | ||
* This file is part of Phoenix-RTOS. | ||
* | ||
* %LICENSE% | ||
*/ | ||
|
||
#include <stddef.h> | ||
#include <errno.h> | ||
#include <sys/msg.h> | ||
#include <posix/utils.h> | ||
|
||
#include "common.h" | ||
#include "dev.h" | ||
|
||
|
||
#define MAJOR_MAX 16 | ||
|
||
|
||
static struct { | ||
oid_t oid; | ||
devHandler *devices[MAJOR_MAX]; | ||
} dev_common = { .devices = { NULL } }; | ||
|
||
|
||
static void dev_oid2mm(oid_t *oid, unsigned int *major, unsigned int *minor) | ||
{ | ||
*major = (oid->id >> 16) & 0xffff; | ||
*minor = oid->id & 0xffff; | ||
} | ||
|
||
|
||
static void dev_mm2oid(oid_t *oid, unsigned int major, unsigned int minor) | ||
{ | ||
oid->id = (major << 16) | minor; | ||
} | ||
|
||
|
||
/* To be used only in constructors - no lock needed */ | ||
int dev_allocMajor(unsigned int *major) | ||
{ | ||
static unsigned int counter = 0; | ||
|
||
if (counter == NELEMS(dev_common.devices)) { | ||
return -1; | ||
} | ||
|
||
*major = counter++; | ||
|
||
return 0; | ||
} | ||
|
||
|
||
int dev_registerFile(const char *fname, unsigned int major, unsigned int minor) | ||
{ | ||
oid_t oid = { .port = dev_common.oid.port }; | ||
|
||
dev_mm2oid(&oid, major, minor); | ||
|
||
return create_dev(&oid, fname); | ||
} | ||
|
||
|
||
int dev_msgReceive(msg_t *msg, msg_rid_t *rid) | ||
{ | ||
return msgRecv(dev_common.oid.port, msg, rid); | ||
} | ||
|
||
|
||
void dev_handle(msg_t *msg, msg_rid_t rid) | ||
{ | ||
unsigned int major, minor; | ||
|
||
dev_oid2mm(&msg->oid, &major, &minor); | ||
|
||
if ((major < NELEMS(dev_common.devices)) && (dev_common.devices[major] != NULL)) { | ||
dev_common.devices[major](msg, rid, major, minor); | ||
} | ||
else { | ||
msg->o.err = -ENOSYS; | ||
msgRespond(dev_common.oid.port, msg, rid); | ||
} | ||
} | ||
|
||
|
||
void dev_register(devHandler *handler, unsigned int major) | ||
{ | ||
dev_common.devices[major] = handler; | ||
} | ||
|
||
|
||
/* Has to be executed first! */ | ||
static void __attribute__((constructor(101))) dev_init(void) | ||
{ | ||
portCreate(&dev_common.oid.port); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* Phoenix-RTOS | ||
* | ||
* Multidriver device manager | ||
* | ||
* Copyright 2024 Phoenix Systems | ||
* Author: Aleksander Kaminski | ||
* | ||
* This file is part of Phoenix-RTOS. | ||
* | ||
* %LICENSE% | ||
*/ | ||
|
||
#ifndef MULTI_DEV_H_ | ||
#define MULTI_DEV_H_ | ||
|
||
#include <sys/msg.h> | ||
|
||
typedef void devHandler(msg_t *msg, msg_rid_t rid, unsigned int major, unsigned int minor); | ||
|
||
|
||
int dev_allocMajor(unsigned int *major); | ||
|
||
|
||
int dev_registerFile(const char *fname, unsigned int major, unsigned int minor); | ||
|
||
|
||
int dev_msgReceive(msg_t *msg, msg_rid_t *rid); | ||
|
||
|
||
void dev_handle(msg_t *msg, msg_rid_t rid); | ||
|
||
|
||
void dev_register(devHandler *handler, unsigned int major); | ||
|
||
#endif /* MULTI_DEV_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,183 @@ | ||
/* | ||
* Phoenix-RTOS | ||
* | ||
* MCX N94x multi driver buit-in dummyds | ||
* | ||
* Copyright 2021, 2024 Phoenix Systems | ||
* Author: Maciej Purski, Aleksander Kaminski | ||
* | ||
* This file is part of Phoenix-RTOS. | ||
* | ||
* %LICENSE% | ||
*/ | ||
|
||
#include <board_config.h> | ||
|
||
#if defined(BUILTIN_DUMMYFS) && BUILTIN_DUMMYFS != 0 | ||
|
||
#include <errno.h> | ||
#include <sys/file.h> | ||
#include <sys/mman.h> | ||
#include <sys/msg.h> | ||
#include <sys/threads.h> | ||
#include <stdlib.h> | ||
|
||
#include <phoenix/sysinfo.h> | ||
|
||
#include <dummyfs.h> | ||
|
||
struct { | ||
char stack[2048] __attribute__((aligned(8))); | ||
unsigned port; | ||
} dummy_common; | ||
|
||
|
||
static int syspage_create(void *ctx, oid_t *root) | ||
{ | ||
oid_t sysoid = { 0 }; | ||
|
||
int progsz = syspageprog(NULL, -1); | ||
if (progsz < 0) { | ||
return progsz; | ||
} | ||
|
||
if (dummyfs_create(ctx, root, "syspage", &sysoid, 0666, otDir, NULL) != 0) { | ||
return -ENOMEM; | ||
} | ||
|
||
for (int i = 0; i < progsz; i++) { | ||
syspageprog_t prog; | ||
oid_t toid; | ||
|
||
if (syspageprog(&prog, i) != 0) { | ||
continue; | ||
} | ||
|
||
dummyfs_createMapped(ctx, &sysoid, prog.name, (void *)prog.addr, prog.size, &toid); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
|
||
static void msgthr(void *ctx) | ||
{ | ||
msg_t msg; | ||
msg_rid_t rid; | ||
|
||
for (;;) { | ||
if (msgRecv(dummy_common.port, &msg, &rid) < 0) | ||
continue; | ||
|
||
switch (msg.type) { | ||
|
||
case mtOpen: | ||
msg.o.err = dummyfs_open(ctx, &msg.oid); | ||
break; | ||
|
||
case mtClose: | ||
msg.o.err = dummyfs_close(ctx, &msg.oid); | ||
break; | ||
|
||
case mtRead: | ||
msg.o.err = dummyfs_read(ctx, &msg.oid, msg.i.io.offs, msg.o.data, msg.o.size); | ||
break; | ||
|
||
case mtWrite: | ||
msg.o.err = dummyfs_write(ctx, &msg.oid, msg.i.io.offs, msg.i.data, msg.i.size); | ||
break; | ||
|
||
case mtTruncate: | ||
msg.o.err = dummyfs_truncate(ctx, &msg.oid, msg.i.io.len); | ||
break; | ||
|
||
case mtDevCtl: | ||
msg.o.err = -ENOSYS; | ||
break; | ||
|
||
case mtCreate: | ||
msg.o.err = dummyfs_create(ctx, &msg.oid, msg.i.data, &msg.o.create.oid, msg.i.create.mode, msg.i.create.type, &msg.i.create.dev); | ||
break; | ||
|
||
case mtDestroy: | ||
msg.o.err = dummyfs_destroy(ctx, &msg.oid); | ||
break; | ||
|
||
case mtSetAttr: | ||
msg.o.err = dummyfs_setattr(ctx, &msg.oid, msg.i.attr.type, msg.i.attr.val, msg.i.data, msg.i.size); | ||
break; | ||
|
||
case mtGetAttr: | ||
msg.o.err = dummyfs_getattr(ctx, &msg.oid, msg.i.attr.type, &msg.o.attr.val); | ||
break; | ||
|
||
case mtGetAttrAll: { | ||
struct _attrAll *attrs = msg.o.data; | ||
if ((attrs == NULL) || (msg.o.size < sizeof(struct _attrAll))) { | ||
msg.o.err = -EINVAL; | ||
break; | ||
} | ||
msg.o.err = dummyfs_getattrAll(ctx, &msg.oid, attrs); | ||
break; | ||
} | ||
|
||
case mtLookup: | ||
msg.o.err = dummyfs_lookup(ctx, &msg.oid, msg.i.data, &msg.o.lookup.fil, &msg.o.lookup.dev); | ||
break; | ||
|
||
case mtLink: | ||
msg.o.err = dummyfs_link(ctx, &msg.oid, msg.i.data, &msg.i.ln.oid); | ||
break; | ||
|
||
case mtUnlink: | ||
msg.o.err = dummyfs_unlink(ctx, &msg.oid, msg.i.data); | ||
break; | ||
|
||
case mtReaddir: | ||
msg.o.err = dummyfs_readdir(ctx, &msg.oid, msg.i.readdir.offs, msg.o.data, msg.o.size); | ||
break; | ||
|
||
default: | ||
msg.o.err = -EINVAL; | ||
break; | ||
} | ||
msgRespond(dummy_common.port, &msg, rid); | ||
} | ||
} | ||
|
||
|
||
void __attribute__((constructor(102))) dummyfs_init(void) | ||
{ | ||
void *ctx; | ||
oid_t root = { 0 }; | ||
|
||
if (portCreate(&dummy_common.port) != 0) { | ||
return; | ||
} | ||
|
||
if (portRegister(dummy_common.port, "/", &root)) { | ||
portDestroy(dummy_common.port); | ||
return; | ||
} | ||
|
||
root.port = dummy_common.port; | ||
if (dummyfs_mount(&ctx, NULL, 0, &root) != 0) { | ||
printf("dummyfs mount failed\n"); | ||
portDestroy(dummy_common.port); | ||
return; | ||
} | ||
|
||
if (syspage_create(ctx, &root) != 0) { | ||
dummyfs_unmount(ctx); | ||
portDestroy(dummy_common.port); | ||
return; | ||
} | ||
|
||
if (beginthread(msgthr, 4, dummy_common.stack, sizeof(dummy_common.stack), ctx) != 0) { | ||
dummyfs_unmount(ctx); | ||
portDestroy(dummy_common.port); | ||
return; | ||
} | ||
} | ||
|
||
#endif /* BUILTIN_DUMMYFS */ |
Oops, something went wrong.