Linux字符设备驱动
+ -

LINUX 大小端字节序宏

2024-04-30 42 0

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

static int
uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
{
    struct uvc_device *uvc = to_uvc(f);
    struct v4l2_event v4l2_event;
    struct uvc_event *uvc_event = (void *)&v4l2_event.u.data;

    if ((ctrl->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS) {
        uvcg_info(f, "invalid request type\n");
        return -EINVAL;
    }

    /* Stall too big requests. */
    if (le16_to_cpu(ctrl->wLength) > UVC_MAX_REQUEST_SIZE)
        return -EINVAL;

    /* Tell the complete callback to generate an event for the next request
     * that will be enqueued by UVCIOC_SEND_RESPONSE.
     */
    uvc->event_setup_out = !(ctrl->bRequestType & USB_DIR_IN);
    uvc->event_length = le16_to_cpu(ctrl->wLength);

    memset(&v4l2_event, 0, sizeof(v4l2_event));
    v4l2_event.type = UVC_EVENT_SETUP;
    memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req));
    v4l2_event_queue(&uvc->vdev, &v4l2_event);

    return 0;
}

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

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


#if __BYTE_ORDER == __BIG_ENDIAN
    #define cpu_to_le16 bswap_16
    #define cpu_to_le32 bswap_32
    #define cpu_to_le64 bswap_64
    #define le16_to_cpu bswap_16
    #define le32_to_cpu bswap_32
    #define le64_to_cpu bswap_64
    #define cpu_to_be16
    #define cpu_to_be32
    #define cpu_to_be64
    #define be16_to_cpu
    #define be32_to_cpu
    #define be64_to_cpu
#else
    #define cpu_to_le16
    #define cpu_to_le32
    #define cpu_to_le64
    #define le16_to_cpu
    #define le32_to_cpu
    #define le64_to_cpu
    #define cpu_to_be16 bswap_16
    #define cpu_to_be32 bswap_32
    #define cpu_to_be64 bswap_64
    #define be16_to_cpu bswap_16
    #define be32_to_cpu bswap_32
    #define be64_to_cpu bswap_64
#endif

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

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

0 篇笔记 写笔记

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

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

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