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 }