Skip to content

Commit c6bc6e3

Browse files
committed
bsp: k230: add mem device
Provide mem devices to facilitate the user layer to directly map physical addresses to virtual addresses through ioctrl, mainly to accelerate data access during image processing. Signed-off-by: Wang Chen <[email protected]>
1 parent 5fc1da6 commit c6bc6e3

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# RT-Thread building script for component
2+
3+
from building import *
4+
5+
cwd = GetCurrentDir()
6+
src = Glob('*.c')
7+
CPPPATH = [cwd]
8+
9+
group = DefineGroup('dev_mem', src, depend = ['RT_USING_DEVMEM'], CPPPATH = CPPPATH)
10+
11+
objs = [group]
12+
13+
list = os.listdir(cwd)
14+
15+
for item in list:
16+
if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
17+
objs = objs + SConscript(os.path.join(item, 'SConscript'))
18+
19+
Return('objs')
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/**
2+
* @file rt_mem.c
3+
* @author
4+
* @brief
5+
* @version 1.0
6+
* @date 2022-10-25
7+
*
8+
* @copyright Copyright (c) 2022 Canaan Inc.
9+
*
10+
*/
11+
#include <time.h>
12+
#include <string.h>
13+
#include <rtthread.h>
14+
#include <dfs_file.h>
15+
#include "lwp_user_mm.h"
16+
17+
#ifndef PAGE_OFFSET_BIT
18+
#define PAGE_OFFSET_BIT 12
19+
#endif
20+
21+
static struct rt_device mem_dev;
22+
23+
static int mem_open(struct dfs_file *file)
24+
{
25+
return 0;
26+
}
27+
28+
static int mem_close(struct dfs_file *file)
29+
{
30+
return 0;
31+
}
32+
33+
static int mem_ioctl(struct dfs_file *file, int cmd, void *args)
34+
{
35+
struct dfs_mmap2_args *mmap_args;
36+
unsigned long offset;
37+
int cached = 1;
38+
39+
if(cmd != RT_FIOMMAP2)
40+
return RT_EOK;
41+
42+
if(file->flags & O_SYNC)
43+
cached = 0;
44+
45+
mmap_args = (struct dfs_mmap2_args *)(args);
46+
offset = mmap_args->pgoffset << PAGE_OFFSET_BIT;
47+
void *mmap_addr;
48+
49+
mmap_addr = lwp_map_user_phy(lwp_self(), RT_NULL,
50+
(void *)(size_t)(mmap_args->pgoffset << PAGE_OFFSET_BIT),
51+
mmap_args->length, cached);
52+
mmap_args->ret = mmap_addr;
53+
54+
return 0;
55+
}
56+
57+
static const struct dfs_file_ops mem_fops = {
58+
.open = mem_open,
59+
.close = mem_close,
60+
.ioctl = mem_ioctl,
61+
};
62+
63+
64+
int mem_device_init(void)
65+
{
66+
RT_ASSERT(!rt_device_find("mem"));
67+
mem_dev.type = RT_Device_Class_Miscellaneous;
68+
69+
/* no private */
70+
mem_dev.user_data = RT_NULL;
71+
72+
rt_device_register(&mem_dev, "mem", RT_DEVICE_FLAG_RDWR);
73+
74+
mem_dev.fops = &mem_fops;
75+
76+
return 0;
77+
}
78+
INIT_DEVICE_EXPORT(mem_device_init);
79+

0 commit comments

Comments
 (0)