glib.c 1.3 KB

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