您尚未登录。

#1 Re: 全志 SOC » T113-S4 在售没有 » 2024-04-13 20:32:18

不要使用不火的芯片,随时停产没货

#2 Re: 全志 SOC » Baremetal hardware JPEG-decoder example (F1C100S) » 2024-04-12 18:00:48

xiaorui 说:

看起来是RGB反了,或是大小端反了。
搞个RGB纯色图片来测试下看看。

确实是大小端反了

#3 Re: 全志 SOC » Baremetal hardware JPEG-decoder example (F1C100S) » 2024-04-12 14:10:20

Ozelot 说:

Simple example of hardware decoding JPEG image.
Resolution 800x480. Decoding time 3-4ms.
Sources: jpgdec.7z
https://whycan.com/files/members/4572/girl.jpg
https://whycan.com/files/members/4572/flower.jpg

大佬你好,我移植了你的代码,测试了花,结果如下图,请问可能是什么原因?
fl.jpg

花原图如下:
Data.jpg

#5 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 优惠券转让 » 2024-03-30 10:39:18

dykxjh
回复: 2

我的项目只用的2层板和4层板,用不到6层板。所以这个6层板优惠券用不着,需要的联系我

12345.jpg

#7 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » ssd202,r818平台GUI » 2023-12-28 11:24:51

android studio IDE在哪里下载呢?
是win平台hais linux平台的IDE?

#9 Re: 全志 SOC » 自制F1C200S 小板上电不启动 求大佬们帮忙看看 :( » 2023-11-30 19:49:37

先测3.3/1.2/2.5V/2.8四路电压是否正常。如果电压正常再测晶振是否启振

#10 Re: 全志 SOC » F1C100s的HPVCC要怎么接? » 2023-11-25 13:16:26

还有VRA1和VRA2

VRA1和VRA2有什么作用?为什么需要接电容,接电容的目的是什么?
为什么VRA1和VRA2的电容会不一样?为什么VRA2还需要下拉电阻?
我想知道芯片内部这两个PIN到底是连接到哪里了,是做什么用的。

VRA1.jpg

#11 全志 SOC » F1C100S 关于VRA1和VRA2 » 2023-11-22 17:28:09

dykxjh
回复: 1

下图是公版原理图

VRA1.jpg

我的疑问:
VRA1和VRA2有什么作用?为什么需要接电容,接电容的目的是什么?
为什么VRA1和VRA2的电容会不一样?为什么VRA2还需要下拉电阻?
我想知道芯片内部这两个PIN到底是连接到哪里了,是做什么用的。

有没有人能够解答的?

#12 Re: 工业芯 匠芯创 » RISC-V高性能显示控制跨界MCU D13x系列Datasheet » 2023-11-13 16:47:40

建议合封合封32MB PSRAM。这样可以与F1C100S一战。4-8MB太小了。

#14 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 长按若干秒强制重启的电路怎么做? » 2023-10-27 16:42:00

71.jpg
10年前设计的,P9按键既是开机按键,又是关键键,同时还是长按断电按键。虽然复杂,但是稳定可靠。
关机的时候按P9开机。开机的时候按P9配合软件可以关机。死机的时候长按P9直接断电,然再按P9可以再开机。

#16 Re: 全志 SOC » 嵌入式Linux是否适合做io控制来代替单片机板? » 2023-10-08 10:31:16

肯定可以啊,不跑系统的时候就是个大号的单片机。

#17 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 有啥办法能在手机不知道的情况下把屏幕数据送到电脑上? » 2023-10-03 23:20:08

从手机屏幕排线那里把信号引出来,一般是mipi或者lvds信号,然后采用fpga进行信号采集,然后再通过网口发送到电脑。

#18 Re: 哇酷地摊(跳蚤市场) » 28人民币淘的行车记录仪拆解 » 2023-08-09 15:58:10

joy95611 说:

问题是, 行车记录仪还好用吗?

好用啊,录像1080P毫无压力

#20 Re: 全志 SOC » F1C系列 TV VCC可以不接吗? » 2023-06-30 12:23:37

实践是最好的老师。不接试试能不能用就知道了。

#21 Re: 全志 SOC » 请教各位大牛,f1c100s和f1c600的差别 » 2023-06-27 18:24:25

F1C500  F1C600 还在出货吗? 据说停产了?

#22 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » SSD20X的资料怎么样 » 2023-06-13 11:01:25

开放了,不会怀孕,但是可能会侵权(IP来路不明)

#23 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 坑网的优势是F1C100S裸跑资源丰富 » 2023-06-12 15:02:16

全志的 v85x, 或者瑞芯微的 rv110x等等,价格敢和100S比一下吗?

#24 Re: 全志 SOC » 调通F1C100s的SPI DMA » 2023-06-09 09:40:13

@Quotation
DDMA一次可以传16M,NDMA一次可以256KB(文档上说是128KB)。我看文档上是128KB,那么你说的256KB是基于什么得出的结论呢?

#25 Re: 全志 SOC » 调通F1C100s的SPI DMA » 2023-06-09 09:38:57

弱弱的问一句,DDMA也能和NDAM一样使用吗?我一直没搞清楚这2者的区别。

#27 Re: Cortex M0/M3/M4/M7 » 开源小小草科技的基于STM32H7的小掌机,PCB和源码都有哦 » 2023-05-26 17:59:46

明显这个芯片很贵,把他改成F1C100S版本应该很省成本。

#28 Re: 哇酷地摊(跳蚤市场) » 28人民币淘的行车记录仪拆解 » 2023-05-22 11:56:27

只看到了1个较大的功率电感,且靠近1.2V,说明1.2V用的是DCDC,3.3V和2.8V电流较小,用的应该是LDO。
看到板子上有3.3V,2.8V,1.2V丝印,所以更加肯定里面有一颗ARM核,且内置了DDR。
要是能搞到资料,估计价格能秒f1c100s。

#29 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » @熊掌 开源的 littlevgl 读取并显示TTF字体的程序,使用 freetype ttf字体库 » 2023-05-21 22:19:07

开源的 littlevgl 读取并显示TTF字体的程序,使用 freetype ttf字体库 MARK一下,怕以后找不到了

#30 哇酷地摊(跳蚤市场) » 28人民币淘的行车记录仪拆解 » 2023-05-20 20:40:16

dykxjh
回复: 15

主控丝印:
VT22007-1
MP2UY70.00
1523
有没有人认识这颗芯片,能不能跑linux?

镜头
1_20230520-2035.jpg

正面
2_20230520-2035.jpg

视频
3.jpg

正面
4.jpg

拆开
5.jpg

特写
6.jpg

屏幕
7.jpg

主板
8.jpg

主控
主控丝印:
VT22007-1
MP2UY70.00
1523
9.jpg

主板
10.jpg

镜头
11.jpg

电池
12.jpg

#31 Re: 全志 SOC » 分享一个非常好用的逆向(po,jie)软件IDA破解版 » 2023-05-18 13:35:23

所有下载已经被和谐了,能重新放一个出来吗?

#33 Re: 全志 SOC » 【开源】YuzukiRuler 随身Linux小尺子 » 2023-05-17 11:42:14

还是太厚了,把模块和芯片设计成下沉模式,然后再贴一层超薄的电路板

#34 Re: 人工智能,深度学习,神经网络 » 最短路径算法探讨 » 2023-05-17 09:21:55

Fomalhaut 说:

这个不是NP完全问题吗?算法应该都是指数时间的。

是的,最后还是放弃了,点太多,没有找到好的算法。穷尽法CPU根本算不过来

#35 Re: 全志 SOC » 有没有人用过f1c100s芯片的spi slave模式 » 2023-05-17 09:17:41

有手册,对着改几个寄存器配置就可以了吧

#39 Re: 人工智能,深度学习,神经网络 » 最短路径算法探讨 » 2023-05-11 10:12:29

这个问题在现实生活中的应用,比如送外卖,外卖员需要把外卖送到每个客户手中,怎么走路径最短?

以下是 Dijkstra 算法的 C 语言实现:

#include <stdio.h>
#include <limits.h>

#define V                   10 // 给定点的数量
#define AMI_INT_MAX         AMI_INT

int graph[V][V] = { // 给定的邻接矩阵
    { 0, 4, 3, 0, 0, 0, 0, 8, 0, 0 },
    { 4, 0, 0, 0, 0, 0, 0, 11, 0, 0 },
    { 3, 0, 0, 7, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 7, 0, 9, 14, 0, 0, 0, 0 },
    { 0, 0, 0, 9, 0, 10, 0, 0, 0, 0 },
    { 0, 0, 0, 14, 10, 0, 2, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 2, 0, 1, 6, 0 },
    { 8, 11, 0, 0, 0, 0, 1, 0, 7, 0 },
    { 0, 0, 0, 0, 0, 0, 6, 7, 0, 5 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 },
};

int minDistance(int dist[], int visited[]) {
    int minDist = AMI_INT_MAX, minDistIndex;
    for (int i = 0; i < V; i++) {
        if (!visited[i] && dist[i] <= minDist) {
            minDist = dist[i];
            minDistIndex = i;
        }
    }
    return minDistIndex;
}

void dijkstra(int src) {
    int dist[V], visited[V];
    for (int i = 0; i < V; i++) {
        dist[i] = AMI_INT_MAX;
        visited[i] = 0;
    }
    dist[src] = 0;
    for (int i = 0; i < V - 1; i++) {
        int u = minDistance(dist, visited);
        visited[u] = 1;
        for (int v = 0; v < V; v++) {
            if (!visited[v] && graph[u][v] && dist[u] != AMI_INT_MAX
                && dist[u] + graph[u][v] < dist[v]) {
                dist[v] = dist[u] + graph[u][v];
            }
        }
    }
    printf("顶点\t距离\n");
    for (int i = 0; i < V; i++) {
        printf("%d\t%d\n", i, dist[i]);
    }
}

int main() {
    dijkstra(0);
    return 0;
}

#40 人工智能,深度学习,神经网络 » 最短路径算法探讨 » 2023-05-10 16:00:44

dykxjh
回复: 6

1.png

已知二维平面有N个点,要求遍历所有的已知点,求最短路径算法


注意:不是A点到B点的最短路径,是遍历所有点的最短路径。

#41 Re: 全志 SOC » 有没有人想出掌机开发板 » 2023-05-10 10:30:04

关键是开发出来有人要吗?市场需求有多大?

#42 Re: 全志 SOC » 分享一个自己做的T113-S3裸机IAR工程,有bootloader和led闪烁demo » 2023-04-07 11:48:05

点赞。我喜欢裸机。不喜欢系统。
裸机
1.资源占用小,尤其是RAM。
2.实时响应可控,想要实时性高的用中断,实时性低的用轮训。

#45 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 新人的提问,本人初一,对电脑很感兴趣,现在学linux是不是太早了? » 2023-03-09 09:26:09

早了。专心读书才是王道。你现在把linux学的再精通,只要没考上高中和大学,一切都是圈圈。上大学以后才是玩这些的时候。

#49 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » F1C100s 求ST7789屏幕 » 2023-02-25 16:56:01

dykxjh
回复: 8

求广大坛友推荐一个优秀的2.4寸320x240的TFT屏幕厂家,驱动IC为ST7789  SPI接口。需求量大,性能不要求,能显示就行,价格越低越好。

#50 Re: 全志 SOC » F1C200S SPI->ST7789 » 2023-02-25 09:43:27

是不是接收FIFO满了,数据没有及时取走? 可以配置忽略接收FIFO状态

#53 Re: 全志 SOC » F1C100S USB口改为TYPE-C口引发的问题? » 2023-02-18 09:17:19

不知道手机里,电脑里用的是什么芯片

#54 全志 SOC » F1C100S USB口改为TYPE-C口引发的问题? » 2023-02-11 22:30:36

dykxjh
回复: 4

以前是一个USB母口+一个充电接口,
现在将USB母口和充电接口都改为Type-c口,如下图所示。

123.png

充电和U盘不需要同时使用,是否能够把上图中的2个Type-c口合成一个Type-c口呢?
肯定是不能直接把线路连在一起的,上面的5V是输入,下面的5V是输出,直接连在一起就会出现电池自己给自己充电的情况了。

理论上应该是可以的。想想笔记本电脑上的Type-c充电口,他也是可以插U盘的。

求最优解决方案

#56 Re: 全志 SOC » F1C100S XBOOT 动态内存管理 » 2023-02-04 09:06:36

“TLSF内存分配算法”,有用的知识又增加了。

#57 全志 SOC » F1C100S XBOOT 动态内存管理 » 2023-02-03 17:36:36

dykxjh
回复: 4

F1C100S开发裸机,需要用到内存管理,于是
看了分块式内存管理源码,很容易理解。再来看Xboot的动态内存管理源码,发现很复杂。

以下是源码

/*
 * malloc.c
 */

#include <xconfigs.h>
#include <assert.h>
#include <spinlock.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <xboot/kobj.h>
#include <xboot/module.h>

/*
 * Some macros.
 */
#define tlsf_cast(t, exp)		((t)(exp))
#define tlsf_min(a, b)			((a) < (b) ? (a) : (b))
#define tlsf_max(a, b)			((a) > (b) ? (a) : (b))

#define tlsf_assert				assert
#define tlsf_insist(x)			{ tlsf_assert(x); if (!(x)) { status--; } }

#if defined(__ARM64__) || defined(__X64__) || (defined(__riscv) && (__riscv_xlen == 64))
# define TLSF_64BIT
#else
# undef TLSF_64BIT
#endif

/*
 * Public constants
 */
enum tlsf_public
{
	/*
	 * log2 of number of linear subdivisions of block sizes
	 */
	SL_INDEX_COUNT_LOG2 = 5,
};

/*
 * Private constants
 */
enum tlsf_private
{
#if defined(TLSF_64BIT)
	/*
	 * All allocation sizes and addresses are aligned to 16 bytes
	 */
	ALIGN_SIZE_LOG2 = 4,
#else
	/*
	 * All allocation sizes and addresses are aligned to 8 bytes
	 */
	ALIGN_SIZE_LOG2 = 3,
#endif
	ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2),

#if defined(TLSF_64BIT)
	FL_INDEX_MAX = 32,
#else
	FL_INDEX_MAX = 30,
#endif
	SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2),
	FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2),
	FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1),

	SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT),
};

/*
 * Block header structure
 */
typedef struct block_header_t
{
	union
	{
		/*
		 * Points to the previous physical block
		 */
		struct block_header_t * prev_phys_block;
		char align_data[ALIGN_SIZE];
	};

	/*
	 * The size of this block, excluding the block header
	 */
	size_t size;

	/*
	 * Next and previous free blocks
	 */
	struct block_header_t * next_free;
	struct block_header_t * prev_free;
} block_header_t;

/*
 * The TLSF control structure.
 */
typedef struct control_t
{
	/*
	 * Empty lists point at this block to indicate they are free.
	 */
	block_header_t block_null;

	/*
	 * Bitmaps for free lists.
	 */
	unsigned int fl_bitmap;
	unsigned int sl_bitmap[FL_INDEX_COUNT];

	/*
	 * Head of free lists.
	 */
	block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT];
} control_t;

/*
 * A type used for casting when doing pointer arithmetic.
 */
typedef ptrdiff_t	tlsfptr_t;

/*
 * Associated constants
 */
static const size_t block_header_free_bit = 1 << 0;
static const size_t block_header_prev_free_bit = 1 << 1;
static const size_t block_header_overhead = sizeof(size_t);
static const size_t block_start_offset = offsetof(block_header_t, size) + sizeof(size_t);
static const size_t block_size_min = sizeof(block_header_t) - sizeof(block_header_t *);
static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX;

#if defined(__riscv)
static int tlsf_fls_generic(unsigned int word)
{
	int bit = 32;

	if (!word) bit -= 1;
	if (!(word & 0xffff0000)) { word <<= 16; bit -= 16; }
	if (!(word & 0xff000000)) { word <<= 8; bit -= 8; }
	if (!(word & 0xf0000000)) { word <<= 4; bit -= 4; }
	if (!(word & 0xc0000000)) { word <<= 2; bit -= 2; }
	if (!(word & 0x80000000)) { word <<= 1; bit -= 1; }

	return bit;
}

static int tlsf_ffs(unsigned int word)
{
	return tlsf_fls_generic(word & (~word + 1)) - 1;
}

static int tlsf_fls(unsigned int word)
{
	return tlsf_fls_generic(word) - 1;
}
#else
static int tlsf_ffs(unsigned int word)
{
	return __builtin_ffs(word) - 1;
}

static int tlsf_fls(unsigned int word)
{
	const int bit = word ? 32 - __builtin_clz(word) : 0;
	return bit - 1;
}
#endif

#if defined(TLSF_64BIT)
static int tlsf_fls_sizet(size_t size)
{
	int high = (int)(size >> 32);
	int bits = 0;
	if(high)
	{
		bits = 32 + tlsf_fls(high);
	}
	else
	{
		bits = tlsf_fls((int)size & 0xffffffff);

	}
	return bits;
}
#else
#define tlsf_fls_sizet		tlsf_fls
#endif

static size_t block_get_size(const block_header_t * block)
{
	return block->size & ~(block_header_free_bit | block_header_prev_free_bit);
}

static void block_set_size(block_header_t * block, size_t size)
{
	const size_t oldsize = block->size;
	block->size = size | (oldsize & (block_header_free_bit | block_header_prev_free_bit));
}

static int block_is_last(const block_header_t * block)
{
	return (block_get_size(block) == 0);
}

static int block_is_free(const block_header_t * block)
{
	return tlsf_cast(int, block->size & block_header_free_bit);
}

static void block_set_free(block_header_t * block)
{
	block->size |= block_header_free_bit;
}

static void block_set_used(block_header_t * block)
{
	block->size &= ~block_header_free_bit;
}

static int block_is_prev_free(const block_header_t * block)
{
	return tlsf_cast(int, block->size & block_header_prev_free_bit);
}

static void block_set_prev_free(block_header_t * block)
{
	block->size |= block_header_prev_free_bit;
}

static void block_set_prev_used(block_header_t * block)
{
	block->size &= ~block_header_prev_free_bit;
}

static block_header_t * block_from_ptr(const void * ptr)
{
	return tlsf_cast(block_header_t *, tlsf_cast(unsigned char*, ptr) - block_start_offset);
}

static void * block_to_ptr(const block_header_t * block)
{
	return tlsf_cast(void *, tlsf_cast(unsigned char*, block) + block_start_offset);
}

static block_header_t * offset_to_block(const void * ptr, size_t size)
{
	return tlsf_cast(block_header_t *, tlsf_cast(tlsfptr_t, ptr) + size);
}

static block_header_t * block_prev(const block_header_t * block)
{
	return block->prev_phys_block;
}

static block_header_t * block_next(const block_header_t * block)
{
	block_header_t * next = offset_to_block(block_to_ptr(block), block_get_size(block) - block_header_overhead);
	tlsf_assert(!block_is_last(block));
	return next;
}

static block_header_t * block_link_next(block_header_t * block)
{
	block_header_t * next = block_next(block);
	next->prev_phys_block = block;
	return next;
}

static void block_mark_as_free(block_header_t * block)
{
	block_header_t * next = block_link_next(block);
	block_set_prev_free(next);
	block_set_free(block);
}

static void block_mark_as_used(block_header_t * block)
{
	block_header_t * next = block_next(block);
	block_set_prev_used(next);
	block_set_used(block);
}

static size_t align_up(size_t x, size_t align)
{
	tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two");
	return (x + (align - 1)) & ~(align - 1);
}

static size_t align_down(size_t x, size_t align)
{
	tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two");
	return x - (x & (align - 1));
}

static void * align_ptr(const void * ptr, size_t align)
{
	const tlsfptr_t aligned = (tlsf_cast(tlsfptr_t, ptr) + (align - 1)) & ~(align - 1);
	tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two");
	return tlsf_cast(void*, aligned);
}

static size_t adjust_request_size(size_t size, size_t align)
{
	size_t adjust = 0;
	if(size)
	{
		const size_t aligned = align_up(size, align);
		if(aligned < block_size_max)
			adjust = tlsf_max(aligned, block_size_min);
	}
	return adjust;
}

static void mapping_insert(size_t size, int * fli, int * sli)
{
	int fl, sl;
	if(size < SMALL_BLOCK_SIZE)
	{
		fl = 0;
		sl = tlsf_cast(int, size) / (SMALL_BLOCK_SIZE / SL_INDEX_COUNT);
	}
	else
	{
		fl = tlsf_fls_sizet(size);
		sl = tlsf_cast(int, size >> (fl - SL_INDEX_COUNT_LOG2)) ^ (1 << SL_INDEX_COUNT_LOG2);
		fl -= (FL_INDEX_SHIFT - 1);
	}
	*fli = fl;
	*sli = sl;
}

static void mapping_search(size_t size, int * fli, int * sli)
{
	if(size >= (1 << SL_INDEX_COUNT_LOG2))
	{
		const size_t round = (1 << (tlsf_fls_sizet(size) - SL_INDEX_COUNT_LOG2)) - 1;
		size += round;
	}
	mapping_insert(size, fli, sli);
}

static block_header_t * search_suitable_block(control_t * control, int * fli, int * sli)
{
	int fl = *fli;
	int sl = *sli;

	unsigned int sl_map = control->sl_bitmap[fl] & (~0U << sl);
	if(!sl_map)
	{
		const unsigned int fl_map = control->fl_bitmap & (~0 << (fl + 1));
		if(!fl_map)
		{
			return 0;
		}

		fl = tlsf_ffs(fl_map);
		*fli = fl;
		sl_map = control->sl_bitmap[fl];
	}
	tlsf_assert(sl_map && "internal error - second level bitmap is null");
	sl = tlsf_ffs(sl_map);
	*sli = sl;

	return control->blocks[fl][sl];
}

static void remove_free_block(control_t * control, block_header_t * block, int fl, int sl)
{
	block_header_t * prev = block->prev_free;
	block_header_t * next = block->next_free;
	tlsf_assert(prev && "prev_free field can not be null");
	tlsf_assert(next && "next_free field can not be null");
	next->prev_free = prev;
	prev->next_free = next;

	if(control->blocks[fl][sl] == block)
	{
		control->blocks[fl][sl] = next;

		if(next == &control->block_null)
		{
			control->sl_bitmap[fl] &= ~(1U << sl);

			if(!control->sl_bitmap[fl])
			{
				control->fl_bitmap &= ~(1U << fl);
			}
		}
	}
}

static void insert_free_block(control_t * control, block_header_t * block, int fl, int sl)
{
	block_header_t * current = control->blocks[fl][sl];
	tlsf_assert(current && "free list cannot have a null entry");
	tlsf_assert(block && "cannot insert a null entry into the free list");
	block->next_free = current;
	block->prev_free = &control->block_null;
	current->prev_free = block;

	tlsf_assert(block_to_ptr(block) == align_ptr(block_to_ptr(block), ALIGN_SIZE) && "block not aligned properly");

	control->blocks[fl][sl] = block;
	control->fl_bitmap |= (1U << fl);
	control->sl_bitmap[fl] |= (1U << sl);
}

static void block_remove(control_t * control, block_header_t * block)
{
	int fl, sl;
	mapping_insert(block_get_size(block), &fl, &sl);
	remove_free_block(control, block, fl, sl);
}

static void block_insert(control_t * control, block_header_t * block)
{
	int fl, sl;
	mapping_insert(block_get_size(block), &fl, &sl);
	insert_free_block(control, block, fl, sl);
}

static int block_can_split(block_header_t * block, size_t size)
{
	return block_get_size(block) >= sizeof(block_header_t) + size;
}

static block_header_t * block_split(block_header_t * block, size_t size)
{
	block_header_t * remaining = offset_to_block(block_to_ptr(block), size - block_header_overhead);
	const size_t remain_size = block_get_size(block) - (size + ALIGN_SIZE);

	tlsf_assert(block_to_ptr(remaining) == align_ptr(block_to_ptr(remaining), ALIGN_SIZE) && "remaining block not aligned properly");

	tlsf_assert(block_get_size(block) == remain_size + size + ALIGN_SIZE);
	block_set_size(remaining, remain_size);
	tlsf_assert(block_get_size(remaining) >= block_size_min && "block split with invalid size");

	block_set_size(block, size);
	block_mark_as_free(remaining);

	return remaining;
}

static block_header_t * block_absorb(block_header_t * prev, block_header_t * block)
{
	tlsf_assert(!block_is_last(prev) && "previous block can't be last!");
	prev->size += block_get_size(block) + ALIGN_SIZE;
	block_link_next(prev);
	return prev;
}

static block_header_t * block_merge_prev(control_t * control, block_header_t * block)
{
	if(block_is_prev_free(block))
	{
		block_header_t* prev = block_prev(block);
		tlsf_assert(prev && "prev physical block can't be null");
		tlsf_assert(block_is_free(prev) && "prev block is not free though marked as such");
		block_remove(control, prev);
		block = block_absorb(prev, block);
	}

	return block;
}

static block_header_t * block_merge_next(control_t * control, block_header_t * block)
{
	block_header_t* next = block_next(block);
	tlsf_assert(next && "next physical block can't be null");

	if(block_is_free(next))
	{
		tlsf_assert(!block_is_last(block) && "previous block can't be last!");
		block_remove(control, next);
		block = block_absorb(block, next);
	}

	return block;
}

static void block_trim_free(control_t * control, block_header_t * block, size_t size)
{
	tlsf_assert(block_is_free(block) && "block must be free");
	if(block_can_split(block, size))
	{
		block_header_t* remaining_block = block_split(block, size);
		block_link_next(block);
		block_set_prev_free(remaining_block);
		block_insert(control, remaining_block);
	}
}

static void block_trim_used(control_t * control, block_header_t * block, size_t size)
{
	tlsf_assert(!block_is_free(block) && "block must be used");
	if(block_can_split(block, size))
	{
		block_header_t* remaining_block = block_split(block, size);
		block_set_prev_used(remaining_block);

		remaining_block = block_merge_next(control, remaining_block);
		block_insert(control, remaining_block);
	}
}

static block_header_t * block_trim_free_leading(control_t * control, block_header_t * block, size_t size)
{
	block_header_t * remaining_block = block;
	if(block_can_split(block, size))
	{
		remaining_block = block_split(block, size - ALIGN_SIZE);
		block_set_prev_free(remaining_block);

		block_link_next(block);
		block_insert(control, block);
	}

	return remaining_block;
}

static block_header_t * block_locate_free(control_t * control, size_t size)
{
	int fl = 0, sl = 0;
	block_header_t * block = 0;

	if(size)
	{
		mapping_search(size, &fl, &sl);
		if(fl < FL_INDEX_COUNT)
			block = search_suitable_block(control, &fl, &sl);
	}

	if(block)
	{
		tlsf_assert(block_get_size(block) >= size);
		remove_free_block(control, block, fl, sl);
	}

	return block;
}

static void * block_prepare_used(control_t * control, block_header_t * block, size_t size)
{
	void * p = 0;
	if(block)
	{
		block_trim_free(control, block, size);
		block_mark_as_used(block);
		p = block_to_ptr(block);
	}
	return p;
}

static void control_construct(control_t * control)
{
	int i, j;

	control->block_null.next_free = &control->block_null;
	control->block_null.prev_free = &control->block_null;

	control->fl_bitmap = 0;
	for(i = 0; i < FL_INDEX_COUNT; ++i)
	{
		control->sl_bitmap[i] = 0;
		for(j = 0; j < SL_INDEX_COUNT; ++j)
		{
			control->blocks[i][j] = &control->block_null;
		}
	}
}

static inline void * tlsf_add_pool(void * tlsf, void * mem, size_t bytes)
{
	block_header_t * block;
	block_header_t * next;
	const size_t pool_bytes = align_down(bytes - block_header_overhead - ALIGN_SIZE, ALIGN_SIZE);

	if(((ptrdiff_t)mem % ALIGN_SIZE) != 0)
		return 0;

	if(pool_bytes < block_size_min || pool_bytes > block_size_max)
		return 0;

	block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead);
	block_set_size(block, pool_bytes);
	block_set_free(block);
	block_set_prev_used(block);
	block_insert(tlsf_cast(control_t*, tlsf), block);

	next = block_link_next(block);
	block_set_size(next, 0);
	block_set_used(next);
	block_set_prev_free(next);

	return mem;
}

static inline void tlsf_remove_pool(void * tlsf, void * mem)
{
	control_t * control = tlsf_cast(control_t *, tlsf);
	block_header_t * block = offset_to_block(mem, -(int)block_header_overhead);
	int fl = 0, sl = 0;

	tlsf_assert(block_is_free(block) && "block should be free");
	tlsf_assert(!block_is_free(block_next(block)) && "next block should not be free");
	tlsf_assert(block_get_size(block_next(block)) == 0 && "next block size should be zero");

	mapping_insert(block_get_size(block), &fl, &sl);
	remove_free_block(control, block, fl, sl);
}

static inline void * tlsf_create(void * mem)
{
	if(((tlsfptr_t)mem % ALIGN_SIZE) != 0)
		return 0;

	control_construct(tlsf_cast(control_t *, mem));
	return tlsf_cast(void *, mem);
}

static inline void * tlsf_create_with_pool(void * mem, size_t bytes)
{
	void * tlsf = tlsf_create(mem);
	tlsf_add_pool(tlsf, (char *)mem + align_up(sizeof(control_t), ALIGN_SIZE), bytes - align_up(sizeof(control_t), ALIGN_SIZE));
	return tlsf;
}

static inline void tlsf_destroy(void * mem)
{
	(void)mem;
}

static inline void * tlsf_get(void * mem)
{
	return tlsf_cast(void *, (char *)mem + align_up(sizeof(control_t), ALIGN_SIZE));
}

static inline void * tlsf_malloc(void * tlsf, size_t size)
{
	control_t * control = tlsf_cast(control_t *, tlsf);
	const size_t adjust = adjust_request_size(size, ALIGN_SIZE);
	block_header_t * block = block_locate_free(control, adjust);
	return block_prepare_used(control, block, adjust);
}

static inline void * tlsf_memalign(void * tlsf, size_t align, size_t size)
{
	control_t * control = tlsf_cast(control_t *, tlsf);
	const size_t adjust = adjust_request_size(size, ALIGN_SIZE);

	const size_t gap_minimum = sizeof(block_header_t);
	const size_t size_with_gap = adjust_request_size(adjust + align + gap_minimum, align);

	const size_t aligned_size = (adjust && align > ALIGN_SIZE) ? size_with_gap : adjust;

	block_header_t* block = block_locate_free(control, aligned_size);

	tlsf_assert(sizeof(block_header_t) == block_size_min + block_header_overhead);

	if(block)
	{
		void * ptr = block_to_ptr(block);
		void * aligned = align_ptr(ptr, align);
		size_t gap = tlsf_cast(size_t, tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr));

		if(gap && (gap < gap_minimum))
		{
			const size_t gap_remain = gap_minimum - gap;
			const size_t offset = tlsf_max(gap_remain, align);
			const void * next_aligned = tlsf_cast(void *, tlsf_cast(tlsfptr_t, aligned) + offset);

			aligned = align_ptr(next_aligned, align);
			gap = tlsf_cast(size_t, tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr));
		}

		if(gap)
		{
			tlsf_assert(gap >= gap_minimum && "gap size too small");
			block = block_trim_free_leading(control, block, gap);
		}
	}

	return block_prepare_used(control, block, adjust);
}

static inline void tlsf_free(void * tlsf, void * ptr)
{
	if(ptr)
	{
		control_t * control = tlsf_cast(control_t *, tlsf);
		block_header_t * block = block_from_ptr(ptr);
		tlsf_assert(!block_is_free(block) && "block already marked as free");
		block_mark_as_free(block);
		block = block_merge_prev(control, block);
		block = block_merge_next(control, block);
		block_insert(control, block);
	}
}

static inline void * tlsf_realloc(void * tlsf, void * ptr, size_t size)
{
	control_t * control = tlsf_cast(control_t *, tlsf);
	void * p = 0;

	if(ptr && (size == 0))
	{
		tlsf_free(tlsf, ptr);
	}
	else if(!ptr)
	{
		p = tlsf_malloc(tlsf, size);
	}
	else
	{
		block_header_t * block = block_from_ptr(ptr);
		block_header_t * next = block_next(block);

		const size_t cursize = block_get_size(block);
		const size_t combined = cursize + block_get_size(next) + block_header_overhead;
		const size_t adjust = adjust_request_size(size, ALIGN_SIZE);

		tlsf_assert(!block_is_free(block) && "block already marked as free");

		if((adjust > cursize) && (!block_is_free(next) || adjust > combined))
		{
			p = tlsf_malloc(tlsf, size);
			if(p)
			{
				const size_t minsize = tlsf_min(cursize, size);
				memcpy(p, ptr, minsize);
				tlsf_free(tlsf, ptr);
			}
		}
		else
		{
			if(adjust > cursize)
			{
				block_merge_next(control, block);
				block_mark_as_used(block);
			}

			block_trim_used(control, block, adjust);
			p = ptr;
		}
	}

	return p;
}

static inline void tlsf_info(void * tlsf, size_t * mused, size_t * mfree)
{
	block_header_t * block = offset_to_block(tlsf, -(int)block_header_overhead);

	*mused = 0;
	*mfree = 0;
	while(block && !block_is_last(block))
	{
		if(block_is_free(block))
			*mfree += block_get_size(block);
		else
			*mused += block_get_size(block);
		block = block_next(block);
	}
}

void * mm_create(void * mem, size_t bytes)
{
	return tlsf_create_with_pool(mem, bytes);
}

void mm_destroy(void * mem)
{
	tlsf_destroy(mem);
}

void * mm_get(void * mem)
{
	return tlsf_get(mem);
}

void * mm_add_pool(void * mm, void * mem, size_t bytes)
{
	return tlsf_add_pool(mm, mem, bytes);
}

void mm_remove_pool(void * mm, void * mem)
{
	tlsf_remove_pool(mm, mem);
}

void * mm_malloc(void * mm, size_t size)
{
	return tlsf_malloc(mm, size);
}

void * mm_memalign(void * mm, size_t align, size_t size)
{
	return tlsf_memalign(mm, align, size);
}

void * mm_realloc(void * mm, void * ptr, size_t size)
{
	return tlsf_realloc(mm, ptr, size);
}

void mm_free(void * mm, void * ptr)
{
	tlsf_free(mm, ptr);
}

void mm_info(void * mm, size_t * mused, size_t * mfree)
{
	if(mused && mfree)
		tlsf_info(mm, mused, mfree);
}

static void * __heap_pool = NULL;
static spinlock_t __heap_lock = SPIN_LOCK_INIT();

static void * __malloc(size_t size)
{
	void * m;

	if(__heap_pool)
	{
		spin_lock(&__heap_lock);
		m = tlsf_malloc(__heap_pool, size);
		spin_unlock(&__heap_lock);
		return m;
	}
	return NULL;
}
extern __typeof(__malloc) malloc __attribute__((weak, alias("__malloc")));

static void * __memalign(size_t align, size_t size)
{
	void * m;

	if(__heap_pool)
	{
		spin_lock(&__heap_lock);
		m = tlsf_memalign(__heap_pool, align, size);
		spin_unlock(&__heap_lock);
		return m;
	}
	return NULL;
}
extern __typeof(__memalign) memalign __attribute__((weak, alias("__memalign")));

static void * __realloc(void * ptr, size_t size)
{
	void * m;

	if(__heap_pool)
	{
		spin_lock(&__heap_lock);
		m = tlsf_realloc(__heap_pool, ptr, size);
		spin_unlock(&__heap_lock);
		return m;
	}
	return NULL;
}
extern __typeof(__realloc) realloc __attribute__((weak, alias("__realloc")));

static void * __calloc(size_t nmemb, size_t size)
{
	void * m;

	if((m = malloc(nmemb * size)))
		memset(m, 0, nmemb * size);
	return m;
}
extern __typeof(__calloc) calloc __attribute__((weak, alias("__calloc")));

static void __free(void * ptr)
{
	if(__heap_pool)
	{
		spin_lock(&__heap_lock);
		tlsf_free(__heap_pool, ptr);
		spin_unlock(&__heap_lock);
	}
}
extern __typeof(__free) free __attribute__((weak, alias("__free")));

static void __meminfo(size_t * mused, size_t * mfree)
{
	if(__heap_pool)
	{
		if(mused && mfree)
			tlsf_info(mm_get(__heap_pool), mused, mfree);
	}
}
extern __typeof(__meminfo) meminfo __attribute__((weak, alias("__meminfo")));

static struct kobj_t * search_class_memory_kobj(void)
{
	struct kobj_t * kclass = kobj_search_directory_with_create(kobj_get_root(), "class");
	return kobj_search_directory_with_create(kclass, "memory");
}

static ssize_t memory_read_meminfo(struct kobj_t * kobj, void * buf, size_t size)
{
	size_t mused = 0;
	size_t mfree = 0;
	char * p = buf;
	int len = 0;

	meminfo(&mused, &mfree);
	len += sprintf((char *)(p + len), " memory used: %ld\r\n", mused);
	len += sprintf((char *)(p + len), " memory free: %ld\r\n", mfree);
	return len;
}

void do_init_mem(void)
{
#ifndef __SANDBOX__
	extern unsigned char __heap_start[];
	extern unsigned char __heap_end[];
	spin_lock_init(&__heap_lock);
	__heap_pool = mm_create((void *)__heap_start, (size_t)(__heap_end - __heap_start));
#endif
	kobj_add_regular(search_class_memory_kobj(), "meminfo", memory_read_meminfo, NULL, NULL);
}

不知道优缺点如何,有没有xboot的大神出来介绍以下?
有没有执行效率和内存利用率都很高的内存管理系统?

#60 Re: 全志 SOC » F1C100S FreeRTOS工程,100%可用 » 2022-12-16 11:21:47

看到已经挂在坑网,我就放心了。

#62 Re: 全志 SOC » F1C100S FreeRTOS工程,100%可用 » 2022-12-14 20:38:56

绝对是来骗积分的。建议坛主要么删除帖子,要么下载一份挂到坑网。@晕哥

#63 Re: Cortex M0/M3/M4/M7 » 有认识能破解STM32F103ZET6的吗 ? 介绍成功有重谢, 不要骂我实属无奈请开发公司写的程序量起来了烧写芯片恶意加价好几次 » 2022-12-14 16:37:12

apleilx 说:

顺便问下,stm32用吧uuid按照一定算法计算一组数据序列存在flash,然后自动删除加密算法,运行过程对序列和UUID进行检查。这样的程序能破解吗?

能。就看破解成本与产生的价值。

方法一,读出转汇编,修改代码跳过对序列和UUID进行检查这段程序。
方法二,读出转汇编,修改访问UUID的地址,改成flash其他地址,然后把母片UUID写入该地址。
方法二,直接把新芯片的uuid改成和母片一样。

#64 Re: Cortex M0/M3/M4/M7 » 有认识能破解STM32F103ZET6的吗 ? 介绍成功有重谢, 不要骂我实属无奈请开发公司写的程序量起来了烧写芯片恶意加价好几次 » 2022-12-14 16:33:22

重新开发,开发前就应该谈好价格这些。擅自涨价或者不供货属于违约。不复杂的东西开发起来也快。

#65 Re: DOPI开源摄像头(HI3516/HI3518) » 全智神u f1c200s怎么就盖过了hisi3518ev200,300,hi3516ev200? » 2022-12-14 11:06:10

价格呢?3518多少钱?能干过100s? 价格才是商人首要考虑的。性能是工程师考虑的。

#69 Re: 全志 SOC » F1C100s的内置SRAM是全速么? » 2022-11-30 09:49:24

我用它做缓存,出现过随机性死机,不敢再用了。

#70 Re: 全志 SOC » F1C100s 编译 XBOOT 详细过程 » 2022-11-27 17:27:50

弱弱的问一句,有windows下得编译工具吗?

#73 Re: 全志 SOC » 关于S3 V3x PC7-PC10作为IO使用的问题 » 2022-11-24 20:29:25

实际验证了,确实可以作为普通IO口用。


结贴。

#77 Re: RISC-V » 国产riscv芯片汇总 » 2022-11-10 20:22:12

ARM多少年了, RISC-V才几年,让RISC-V再发展发展,取代ARM成为可能

#79 Re: 全志 SOC » 在小淘气开发板上移植播放器 » 2022-11-07 11:53:50

楼主只是展示成果还是想开源给大家学习?

#80 Re: RISC-V » WCH又搞了个性价比王炸CH32V003 » 2022-10-30 19:35:22

有IIC 有ID 能不能把他用来当做加密芯片

#81 Re: 司徒开源 » 开源精神值得敬佩,但是你司徒公开po 解FC3000的加密芯片就是可耻,做技术要有底线 » 2022-10-30 19:26:31

@Situ 建议司徒开发一款能运行在此硬件上的比原固件还要优秀的固件并开源

#82 Re: 全志 SOC » f1c100s lcd硬件抖动 » 2022-10-27 10:35:36

lfs911 说:

请教论坛各位大佬,f1c100s lcd的硬件抖动是否存在呢,手册说有,但是寄存器又找不到相关的配置(或者是我没找对?),现在迫不得已使用软件抖动算法,效率也太低了,多谢各位大佬解答!!!

软件抖动算法能开源分享一下吗?

#83 全志 SOC » 关于S3 V3x PC7-PC10作为IO使用的问题 » 2022-10-20 19:27:24

dykxjh
回复: 2

看数据手册,这几个IO口只能用作SD接口,并不能用作普通IO口,但是事实上呢?
到底能不能作为普通输入输出口来用呢?
谁手里有开发板的麻烦帮忙验证一下,谢谢!

.jpg

#86 Re: 全志 SOC » 哈,用JLink把全志allwinner V3s内置的BROM读出来了 » 2022-09-15 13:58:02

搞出来有啥意思呢?要是能写入自己的BROM就有意思了

#90 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 土家造-手搓sip芯片 » 2022-09-02 18:46:27

我说的就是裸片+绑定+封胶,不知道全志是否提供裸片?另外绑定和封胶也需要专门的厂吧,还是贴片厂也有绑定和封胶业务?

#92 Re: Nuvoton N32905/N32926/NUC972/N9H20/N9H26/N9H30 » MA35D1发布了。 » 2022-08-19 09:27:55

XIVN1987 说:

这么高端的芯片,,显示接口只有RGB,,没有HDMI、没有LVDS、也没有MIPI,,是什么考虑?

工业级芯片,工业上RGB足够用了!

#98 Re: 计算机图形/GUI/RTOS/FileSystem/OpenGL/DirectX/SDL2 » 发现一个轻量级UI, 移植到 STM32/STM8 不错 ----- µGUI/uGUI » 2022-07-07 20:15:18

qwert1213131 说:

nuklear不知道能不能用到普通的单片机里去

我觉得不能。

#101 Re: 全志 SOC » 利用xfel及mkz工具实现一机一镜像量产方案 » 2022-06-07 21:19:53

ne_demon 说:

我执行xfel sid,读出来的全是0,怎么回事?
还有,代码中如何获取芯片的id?(F1C200s)

F1C200s不支持唯一ID吧

#103 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » vmware pro各版本下载 » 2022-06-07 17:52:53

哪个版本是稳定版?我目前用的12.几死机卡死概率蛮高的。

#104 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 发现个比较NB的蓝牙芯片杰理AC6368A » 2022-05-26 12:02:28

有没有接项目的?基于官方SDK开发AC632N定制功能?官方SDK我已经编译通过了,现在需要在官方基础上修改实现我自己的功能。能做的联系!

#106 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-05-23 09:42:09

cube 说:

V3x 摸起来几乎不发热,
V3s 烫手,

DDR3 比 DDR2 优秀太多!

我V3x用热红外打了一下,温度在45度左右

#107 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 » 发现个比较NB的蓝牙芯片杰理AC6368A » 2022-05-23 09:13:47

好东西啊,我就喜欢便宜的东西。前段时间正考虑着要不要给产品加上蓝牙功能,一直觉得要增加成本四五块钱不划算。现在看来只需要增加2块钱不到就能搞定了。

#110 Re: RISC-V » 性能最强的 RISC-V 内核单片机:HPM6750 » 2022-05-11 13:07:46

抛开价格谈性能都是耍流氓。敢不敢扔出价格看看

#114 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 是时候告别CSDN了! » 2022-05-03 20:40:09

有没有一劳永逸的办法彻底屏蔽CSDN,真不想再搜到它的内容

#115 全志 SOC » 关于V3x芯片打磨丝印 » 2022-04-23 12:40:19

dykxjh
回复: 0

从晕哥那里买的样品,本想着把丝印打磨掉,结果打磨一层后发现很多洞洞,还能看到里面的飞线

1234.png

#116 Re: 全志 SOC » 最近准备入坑,偏向裸机,选择哪款Soc好点? » 2022-04-22 17:52:46

裸机建议新塘的nuc972,官方资料齐全!f1c100s资料零散且不全,可能会气到吐血!

#117 Re: 全志 SOC » 关于v3s关机后,使用后备电池时钟不跑的解决方法 » 2022-04-22 17:46:44

确实是的,功耗贼大,纽扣电池不经用!还是外挂RTC吧

#119 Re: 全志 SOC » 开源一个6000行的2D矢量图形库libcg,零依赖,API接口类似cairo,在某些场景可以代替cairo,特别适合裸奔场景。 » 2022-03-04 21:32:24

@xboot


void cg_memfill32(uint32_t * dst, uint32_t val, int len);
void cg_comp_solid_source(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_solid_source_over(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_solid_destination_in(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_solid_destination_out(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_source(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);
void cg_comp_source_over(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);
void cg_comp_destination_in(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);
void cg_comp_destination_out(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);

以上9个用例,我全部重写了,但是测试完所有例程,却只调用到3个,分别是:
cg_memfill32
cg_comp_solid_source_over
cg_comp_source_over

不知道剩下的那些怎么样才能用到。

#121 Re: 全志 SOC » MIPI小电脑实现离线地图显示 » 2022-02-16 13:49:02

不错不错,我以前做过测亩仪,就是根据GPS定位计算面积,如果能加入离线地图显示就不错了。学习了

#123 Re: 全志 SOC » F1C200S PDA手持机V2.0 » 2022-01-22 14:09:08

迪卡 说:
秦皇岛岛主 说:

楼主对外出售吗

做都没做出来还想买?我是想屁吃。

楼主效率低了,我从2019年认识你,你就在做PDA,经历了2年,改了无数版,最终也没有见到一个成品

#124 Re: 全志 SOC » F1C100S设计的游戏机 » 2022-01-20 14:27:38

nydxsydt 说:

楼主有后续没了

游戏能玩了

#126 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-19 16:10:49

zhang235hai 说:

楼主下一步的底板准备加哪些功能接口呢?

因为我后期是准备用这个芯片做一些商业产品的,我还是计划先把我要用到外设先跑一遍,明年再说啦,今年准备过年了

#127 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-19 15:57:49

附上底板资料和测试固件,核心板可以用了,由于时间关系,底板设计的很简单。
V3x测试固件.zip
V3x测试底板.zip

#128 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-19 15:08:34

不过经过测试,V3x的速度和V3s速度几乎一样,貌似DDR3并没有速度上的优势,应该是带宽更宽了,猜想我的测试程序并没有压榨性能到极限,所以测不出个差别来吧,当然容量比V3s也翻了一番。不知道我理解的对不对,有懂的望指正

#129 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-19 15:05:19

经过一天一夜的调试,终于跑起来了,成功点亮屏幕,来个经典的彩条测试图片
_20220119150233.jpg

#130 Re: 全志 SOC » Windows裸机程序烧录工具,烧录到SD卡 » 2022-01-19 10:16:19

偏移要是直接支持地址就好了。我一直在找一个直接支持指定地址烧录的软件。比如我想把一个镜像直接写入sd卡8MByte的地方,但是Win32DiskImager只能写入0地址,没办法我只能先把sd卡的镜像读回来,然后裁剪拼接,然后再整体写入。

#131 Re: 全志 SOC » 抽空画了一个RGB40PIN接口转VGA接口模块的板子,再也不用到处找40pin的液晶屏啦,直接拿电脑显示器调试,PCB工程分享给大家 » 2022-01-18 17:20:59

@sunxiang
这个取决于你的显示器,你的显示器收到的是480x272的信号,你的显示器可以缩放到全屏显示,也可以只在中间显示480x272的图像。不过目前绝大部分显示器都是缩放到全屏显示。

#133 Re: 全志 SOC » F1C100S设计的游戏机 » 2022-01-18 14:04:29

Rsestudio 说:

裸跑啊,上个系统是不是还可以吧GBA模拟器再移植一个

可以的,但是精力有限,这个就停这里了,玩V3x去了

#134 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-18 14:02:44

核心板已焊好,等底板到了就可以调试了。嘉立创打板最近效率越来越低了,底板等了好久。
_20220118135925.jpg
_20220118135931.jpg

#135 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-10 18:37:15

核心板板子已收到,抽时间焊接一个调试

2.jpg

#137 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-06 16:49:22

mapleft 说:

放个USB 口啊,这样拿到核心板也直接可以调试了

没打算单独使用核心板,所以端子都会留在底板上!

#139 Re: 8051/STC8/AT89C51/N76E003 » 开源一个USB切换器 » 2022-01-05 16:02:13

做过一个一样的,哈哈,我的是机械开关切换,还带指示灯!
_20220105160055.jpg

#140 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-05 15:57:54

达克罗德 说:

同样也有你这种想法,不过怎么搞统一的接口是需要好好想想的:硬件上怎样好安装,软件上怎么好处理

是啊,各个模块标准化很重要。不过呢我只是开源,不会商业,所以还是按我的标准来好了,自己用着好用就行。

#141 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-05 15:56:35

touchey 说:

建议增加usb type-c ogt 供电

没打算单独使用核心板,所以端子都会留在底板上!

#142 Re: 全志 SOC » 开源 V3x模块化开发板 » 2022-01-05 11:44:59

屏座子直接预留在核心板上了,可以直接接40PIN的屏,如果需要接50PIN的屏,再需要一个转接板接口。下下一步就是设计转接板。

#143 全志 SOC » 开源 V3x模块化开发板 » 2022-01-05 11:32:05

dykxjh
回复: 22

不同的开发者需要用到不同的外设,一个开发板要满足尽可能多的开发者就要包含尽可能多的模块,这样对于单个开发者而言又有很多模块是用不着的。怎么解决呢?
模块化开发板被提出来了。设计一个底板,底板上有很多接口,每个接口可以插不同的模块,把其他外设都模块化,类似于电脑上的主板啊,内存条啊,显卡啊都是可以插拔的。然后把V3x设计成一个核心板,这个核心板也是可插拔的,这样又方便更换V3s,类似电脑CPU I5换I3。
想法提出来了,第一步先设计一个核心板的。
_20220105110652.png
_20220105110743.png
第一板核心板已经设计好了,目前正在打样,下一步就是设计一个底板了,然后再设计模块些。

原理图为PDF格式
PCB文件为PADS95版本
gerber文件包可以直接制板
bom文件和坐标文件可以用于生产贴片

V3x核心板开源.zip
V3x PCB图.zip

未完待续。。。

#144 Re: 全志 SOC » F1C100S设计的游戏机 » 2022-01-03 15:22:37

qinxiongxu 说:

请问下,系统是用的tina还是主线linux?

裸机

#145 全志 SOC » F1C100S设计的游戏机 » 2021-12-30 11:35:10

dykxjh
回复: 24

闲来无事,就想着用F100s搞点什么玩玩,于是抱着怀旧的目的,设计了这款小时候的游戏机。
花了两个星期,搞了一款游戏机,找找小时候的乐趣。
_20211230110934.jpg

采用双层PCB设计,下层是电路板,上层是用PCB设计的盖板,没有线路。


_20211230111026.jpg
淘宝上买了2个手柄插着就能玩

_20211230111010.jpg
由于内置游戏1200多个,所以特别增加了收藏功能,玩家可以收藏自己喜欢的游戏

_20211230111017.jpg
试玩冒险岛

以下是游戏列表:
_20211230111002.png
_20211230111006.png
_20211230111127.png
_20211230110958.png
_20211230110954_20211230-1119.png
_20211230110950.png

板子上预留了一个扩展卡接口,功能还未开发
先开源硬件设计,等软件完善了再开源固件,让大家也玩一玩,找找小时候的乐趣!
游戏机硬件.zip

#146 Re: 全志 SOC » F1C200S入坑手记 » 2020-04-17 21:08:56

大神 可不可以调一下USB HOST

#149 Re: 全志 SOC » F1C100S U盘速度 » 2020-03-31 18:20:23

朋友,你好。我最近也在搞这块,也遇到和你一样的问题,想请教一下具体解决措施,希望分享一下。可以加QQ 990087812

#151 Re: 全志 SOC » KEIL可以使用 GNU 工具链,但是只能使用指定那些工具链,不是所有的GNU工具链都可以用 » 2020-03-30 19:28:29

按照晕哥的方法,不能生成hex/bin文件,提示Target no created. 又怎么解决呢?

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn