Linux字符设备驱动
+ -

LINUX 大小端字节序宏

2024-04-30 42 0

在查看Linux源代码的时候,经常会遇到一些宏le16_to_cpu之类的。如以下代码:

  1. static int
  2. uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
  3. {
  4. struct uvc_device *uvc = to_uvc(f);
  5. struct v4l2_event v4l2_event;
  6. struct uvc_event *uvc_event = (void *)&v4l2_event.u.data;
  7. if ((ctrl->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS) {
  8. uvcg_info(f, "invalid request type\n");
  9. return -EINVAL;
  10. }
  11. /* Stall too big requests. */
  12. if (le16_to_cpu(ctrl->wLength) > UVC_MAX_REQUEST_SIZE)
  13. return -EINVAL;
  14. /* Tell the complete callback to generate an event for the next request
  15. * that will be enqueued by UVCIOC_SEND_RESPONSE.
  16. */
  17. uvc->event_setup_out = !(ctrl->bRequestType & USB_DIR_IN);
  18. uvc->event_length = le16_to_cpu(ctrl->wLength);
  19. memset(&v4l2_event, 0, sizeof(v4l2_event));
  20. v4l2_event.type = UVC_EVENT_SETUP;
  21. memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req));
  22. v4l2_event_queue(&uvc->vdev, &v4l2_event);
  23. return 0;
  24. }

这种其实就是大小端的问题。

在Windows编程中一般在搞网络时才会进行大小端转换,其它默认都是小端,故可以直接怱略掉。
但由于Linux要兼容各个硬件平台,有的CPU默认是小端,如X86,X64,但有些是大端的,如Power PC,故系统在外部设备如网络或者固件设备进行数据交换时,需要进行大小端的转换。

  1. #if __BYTE_ORDER == __BIG_ENDIAN
  2. #define cpu_to_le16 bswap_16
  3. #define cpu_to_le32 bswap_32
  4. #define cpu_to_le64 bswap_64
  5. #define le16_to_cpu bswap_16
  6. #define le32_to_cpu bswap_32
  7. #define le64_to_cpu bswap_64
  8. #define cpu_to_be16
  9. #define cpu_to_be32
  10. #define cpu_to_be64
  11. #define be16_to_cpu
  12. #define be32_to_cpu
  13. #define be64_to_cpu
  14. #else
  15. #define cpu_to_le16
  16. #define cpu_to_le32
  17. #define cpu_to_le64
  18. #define le16_to_cpu
  19. #define le32_to_cpu
  20. #define le64_to_cpu
  21. #define cpu_to_be16 bswap_16
  22. #define cpu_to_be32 bswap_32
  23. #define cpu_to_be64 bswap_64
  24. #define be16_to_cpu bswap_16
  25. #define be32_to_cpu bswap_32
  26. #define be64_to_cpu bswap_64
  27. #endif

可以看到,当大小不同时,需要转换的。

  • CPU就是处理器,可大端,可小端。根据架构决定
  • le就是little endian

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!