1 #include <common/glib.h>
2 #include <common/string.h>
3 
4 /**
5  * @brief 这个函数让蜂鸣器发声,目前仅用于真机调试。未来将移除,请勿依赖此函数。
6  *
7  * @param times 发声循环多少遍
8  */
__experimental_beep(uint64_t times)9 void __experimental_beep(uint64_t times)
10 {
11     io_out8(0x43, 182&0xff);
12     io_out8(0x42, 2280&0xff);
13     io_out8(0x42, (2280>>8)&0xff);
14     uint32_t x = io_in8(0x61)&0xff;
15     x |= 3;
16     io_out8(0x61, x&0xff);
17 
18     times *= 10000;
19     for(uint64_t i=0;i<times;++i)
20         pause();
21     x = io_in8(0x61);
22     x &= 0xfc;
23     io_out8(0x61, x&0xff);
24 
25     // 延迟一段时间
26     for(uint64_t i=0;i<times;++i)
27         pause();
28 }
29 
30 /**
31  * @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题
32  *
33  * @param dst 目标地址指针
34  * @param src 源地址指针
35  * @param size 大小
36  * @return void* 指向目标地址的指针
37  */
memmove(void * dst,const void * src,uint64_t size)38 void *memmove(void *dst, const void *src, uint64_t size)
39 {
40     const char *_src = src;
41 	char *_dst = dst;
42 
43 	if (!size)
44 		return dst;
45 
46 	// 当源地址大于目标地址时,使用memcpy来完成
47 	if (dst <= src)
48 		return memcpy(dst, src, size);
49 
50 	// 当源地址小于目标地址时,为防止重叠覆盖,因此从后往前拷贝
51 	_src += size;
52 	_dst += size;
53 
54 	// 逐字节拷贝
55 	while (size--)
56 		*--_dst = *--_src;
57 
58 	return dst;
59 }