LINUX 大小端字节序宏
			 2024-04-30
			  180
			 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
 Linux字符设备驱动
			Linux字符设备驱动
			




