145 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * uvc_configfs.h
 | |
|  *
 | |
|  * Configfs support for the uvc function.
 | |
|  *
 | |
|  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
 | |
|  *		http://www.samsung.com
 | |
|  *
 | |
|  * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
 | |
|  */
 | |
| #ifndef UVC_CONFIGFS_H
 | |
| #define UVC_CONFIGFS_H
 | |
| 
 | |
| #include <linux/configfs.h>
 | |
| 
 | |
| #include "u_uvc.h"
 | |
| 
 | |
| static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
 | |
| {
 | |
| 	return container_of(to_config_group(item), struct f_uvc_opts,
 | |
| 			    func_inst.group);
 | |
| }
 | |
| 
 | |
| #define UVCG_STREAMING_CONTROL_SIZE	1
 | |
| 
 | |
| DECLARE_UVC_HEADER_DESCRIPTOR(1);
 | |
| 
 | |
| struct uvcg_control_header {
 | |
| 	struct config_item		item;
 | |
| 	struct UVC_HEADER_DESCRIPTOR(1)	desc;
 | |
| 	unsigned			linked;
 | |
| };
 | |
| 
 | |
| static inline struct uvcg_control_header *to_uvcg_control_header(struct config_item *item)
 | |
| {
 | |
| 	return container_of(item, struct uvcg_control_header, item);
 | |
| }
 | |
| 
 | |
| enum uvcg_format_type {
 | |
| 	UVCG_UNCOMPRESSED = 0,
 | |
| 	UVCG_MJPEG,
 | |
| 	UVCG_FRAMEBASED,
 | |
| };
 | |
| 
 | |
| struct uvcg_format {
 | |
| 	struct config_group	group;
 | |
| 	enum uvcg_format_type	type;
 | |
| 	unsigned		linked;
 | |
| 	struct list_head	frames;
 | |
| 	unsigned		num_frames;
 | |
| 	__u8			bmaControls[UVCG_STREAMING_CONTROL_SIZE];
 | |
| };
 | |
| 
 | |
| struct uvcg_format_ptr {
 | |
| 	struct uvcg_format	*fmt;
 | |
| 	struct list_head	entry;
 | |
| };
 | |
| 
 | |
| static inline struct uvcg_format *to_uvcg_format(struct config_item *item)
 | |
| {
 | |
| 	return container_of(to_config_group(item), struct uvcg_format, group);
 | |
| }
 | |
| 
 | |
| struct uvcg_streaming_header {
 | |
| 	struct config_item				item;
 | |
| 	struct uvc_input_header_descriptor		desc;
 | |
| 	unsigned					linked;
 | |
| 	struct list_head				formats;
 | |
| 	unsigned					num_fmt;
 | |
| };
 | |
| 
 | |
| static inline struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item)
 | |
| {
 | |
| 	return container_of(item, struct uvcg_streaming_header, item);
 | |
| }
 | |
| 
 | |
| struct uvcg_frame_ptr {
 | |
| 	struct uvcg_frame	*frm;
 | |
| 	struct list_head	entry;
 | |
| };
 | |
| 
 | |
| struct uvcg_frame {
 | |
| 	struct config_item	item;
 | |
| 	enum uvcg_format_type	fmt_type;
 | |
| 	struct {
 | |
| 		u8	b_length;
 | |
| 		u8	b_descriptor_type;
 | |
| 		u8	b_descriptor_subtype;
 | |
| 		u8	b_frame_index;
 | |
| 		u8	bm_capabilities;
 | |
| 		u16	w_width;
 | |
| 		u16	w_height;
 | |
| 		u32	dw_min_bit_rate;
 | |
| 		u32	dw_max_bit_rate;
 | |
| 		/*
 | |
| 		 * dw_max_video_frame_buffer_size is only for uncompressed and
 | |
| 		 * mjpeg format
 | |
| 		 */
 | |
| 		u32	dw_max_video_frame_buffer_size;
 | |
| 		u32	dw_default_frame_interval;
 | |
| 		u8	b_frame_interval_type;
 | |
| 		/* dw_bytes_perline is only for framebased format */
 | |
| 		u32	dw_bytes_perline;
 | |
| 	} __attribute__((packed)) frame;
 | |
| 	u32 *dw_frame_interval;
 | |
| };
 | |
| 
 | |
| static inline struct uvcg_frame *to_uvcg_frame(struct config_item *item)
 | |
| {
 | |
| 	return container_of(item, struct uvcg_frame, item);
 | |
| }
 | |
| 
 | |
| /* -----------------------------------------------------------------------------
 | |
|  * streaming/uncompressed/<NAME>
 | |
|  */
 | |
| 
 | |
| struct uvcg_uncompressed {
 | |
| 	struct uvcg_format		fmt;
 | |
| 	struct uvc_format_uncompressed	desc;
 | |
| };
 | |
| 
 | |
| static inline struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
 | |
| {
 | |
| 	return container_of(to_uvcg_format(item), struct uvcg_uncompressed, fmt);
 | |
| }
 | |
| 
 | |
| /* -----------------------------------------------------------------------------
 | |
|  * streaming/mjpeg/<NAME>
 | |
|  */
 | |
| 
 | |
| struct uvcg_mjpeg {
 | |
| 	struct uvcg_format		fmt;
 | |
| 	struct uvc_format_mjpeg		desc;
 | |
| };
 | |
| 
 | |
| static inline struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
 | |
| {
 | |
| 	return container_of(to_uvcg_format(item), struct uvcg_mjpeg, fmt);
 | |
| }
 | |
| 
 | |
| int uvcg_attach_configfs(struct f_uvc_opts *opts);
 | |
| 
 | |
| #endif /* UVC_CONFIGFS_H */
 |