master/rtdm.c
branchstable-1.5
changeset 2706 43f8e40a183d
parent 2700 93ef210e9b56
child 2707 245d8592cfdc
equal deleted inserted replaced
2705:c6e3c6d66af0 2706:43f8e40a183d
    47 /****************************************************************************/
    47 /****************************************************************************/
    48 
    48 
    49 /** Context structure for an open RTDM file handle.
    49 /** Context structure for an open RTDM file handle.
    50  */
    50  */
    51 typedef struct {
    51 typedef struct {
    52     rtdm_user_info_t *user_info; /**< RTDM user data. */
    52     struct rtdm_fd *fd; /**< RTDM user data. */
    53     ec_ioctl_context_t ioctl_ctx; /**< Context structure. */
    53     ec_ioctl_context_t ioctl_ctx; /**< Context structure. */
    54 } ec_rtdm_context_t;
    54 } ec_rtdm_context_t;
    55 
    55 
    56 /****************************************************************************/
    56 /****************************************************************************/
    57 
    57 
    58 int ec_rtdm_open(struct rtdm_dev_context *, rtdm_user_info_t *, int);
    58 int ec_rtdm_open(struct rtdm_dev_context *, struct rtdm_fd *, int);
    59 int ec_rtdm_close(struct rtdm_dev_context *, rtdm_user_info_t *);
    59 int ec_rtdm_close(struct rtdm_dev_context *, struct rtdm_fd *);
    60 int ec_rtdm_ioctl(struct rtdm_dev_context *, rtdm_user_info_t *,
    60 int ec_rtdm_ioctl(struct rtdm_dev_context *, struct rtdm_fd *,
    61         unsigned int, void __user *);
    61         unsigned int, void __user *);
    62 
    62 
    63 /****************************************************************************/
    63 /****************************************************************************/
    64 
    64 
    65 static struct rtdm_driver ec_rtdm_driver = {
    65 static struct rtdm_driver ec_rtdm_driver = {
    67 							  RTDM_CLASS_EXPERIMENTAL,
    67 							  RTDM_CLASS_EXPERIMENTAL,
    68 							  222,
    68 							  222,
    69 							  1),
    69 							  1),
    70 	.device_flags		=	RTDM_NAMED_DEVICE,
    70 	.device_flags		=	RTDM_NAMED_DEVICE,
    71 	.device_count		=	1,
    71 	.device_count		=	1,
    72 	.context_size		=	sizeof(ec_rtdm_context_t).
    72 	.context_size		=	sizeof(ec_rtdm_context_t),
    73 	.ops = {
    73 	.ops = {
    74         .open      = ec_rtdm_open;
    74         .open      = ec_rtdm_open;
    75         .close_nrt = ec_rtdm_close,
    75         .close_nrt = ec_rtdm_close,
    76         .ioctl_rt  = ec_rtdm_ioctl,
    76         .ioctl_rt  = ec_rtdm_ioctl,
    77         .ioctl_nrt = ec_rtdm_ioctl
    77         .ioctl_nrt = ec_rtdm_ioctl
   154  *
   154  *
   155  * \return Always zero (success).
   155  * \return Always zero (success).
   156  */
   156  */
   157 int ec_rtdm_open(
   157 int ec_rtdm_open(
   158         struct rtdm_dev_context *context, /**< Context. */
   158         struct rtdm_dev_context *context, /**< Context. */
   159         rtdm_user_info_t *user_info, /**< User data. */
   159         struct rtdm_fd *fd, /**< User data. */
   160         int oflags /**< Open flags. */
   160         int oflags /**< Open flags. */
   161         )
   161         )
   162 {
   162 {
   163     ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private;
   163     ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private;
   164 #if DEBUG
   164 #if DEBUG
   165     ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data;
   165     ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data;
   166 #endif
   166 #endif
   167 
   167 
   168     ctx->user_info = user_info;
   168     ctx->fd = fd;
   169     ctx->ioctl_ctx.writable = oflags & O_WRONLY || oflags & O_RDWR;
   169     ctx->ioctl_ctx.writable = oflags & O_WRONLY || oflags & O_RDWR;
   170     ctx->ioctl_ctx.requested = 0;
   170     ctx->ioctl_ctx.requested = 0;
   171     ctx->ioctl_ctx.process_data = NULL;
   171     ctx->ioctl_ctx.process_data = NULL;
   172     ctx->ioctl_ctx.process_data_size = 0;
   172     ctx->ioctl_ctx.process_data_size = 0;
   173 
   173 
   184  *
   184  *
   185  * \return Always zero (success).
   185  * \return Always zero (success).
   186  */
   186  */
   187 int ec_rtdm_close(
   187 int ec_rtdm_close(
   188         struct rtdm_dev_context *context, /**< Context. */
   188         struct rtdm_dev_context *context, /**< Context. */
   189         rtdm_user_info_t *user_info /**< User data. */
   189         struct rtdm_fd *fd /**< User data. */
   190         )
   190         )
   191 {
   191 {
   192     ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private;
   192     ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private;
   193     ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data;
   193     ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data;
   194 
   194 
   209  *
   209  *
   210  * \return ioctl() return code.
   210  * \return ioctl() return code.
   211  */
   211  */
   212 int ec_rtdm_ioctl(
   212 int ec_rtdm_ioctl(
   213         struct rtdm_dev_context *context, /**< Context. */
   213         struct rtdm_dev_context *context, /**< Context. */
   214         rtdm_user_info_t *user_info, /**< User data. */
   214         struct rtdm_fd *fd, /**< User data. */
   215         unsigned int request, /**< Request. */
   215         unsigned int request, /**< Request. */
   216         void __user *arg /**< Argument. */
   216         void __user *arg /**< Argument. */
   217         )
   217         )
   218 {
   218 {
   219     ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private;
   219     ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private;
   240 {
   240 {
   241     ec_rtdm_context_t *ctx =
   241     ec_rtdm_context_t *ctx =
   242         container_of(ioctl_ctx, ec_rtdm_context_t, ioctl_ctx);
   242         container_of(ioctl_ctx, ec_rtdm_context_t, ioctl_ctx);
   243     int ret;
   243     int ret;
   244 
   244 
   245     ret = rtdm_mmap_to_user(ctx->user_info,
   245     ret = rtdm_mmap_to_user(ctx->fd,
   246             ioctl_ctx->process_data, ioctl_ctx->process_data_size,
   246             ioctl_ctx->process_data, ioctl_ctx->process_data_size,
   247             PROT_READ | PROT_WRITE,
   247             PROT_READ | PROT_WRITE,
   248             user_address,
   248             user_address,
   249             NULL, NULL);
   249             NULL, NULL);
   250     if (ret < 0) {
   250     if (ret < 0) {