* [Xenomai-help] driver: IOCTL command behavior @ 2009-04-16 11:47 Marcel Soulot 2009-04-16 12:59 ` Gilles Chanteperdrix 0 siblings, 1 reply; 6+ messages in thread From: Marcel Soulot @ 2009-04-16 11:47 UTC (permalink / raw) To: xenomai [-- Attachment #1: Type: text/plain, Size: 572 bytes --] Hi, I wrote a driver and used IOCTL command. When I test my driver with a test application with root access the IOCTL cmd work fine. I notice when I declared my IOCTL command that I used the _IOR for all of them. Even the IOCTL command is a read (on register) or write. So I try to correct my mistake and wants to use _IOR for read command and _IOW for write command. For the write command, I got a error -25 (not a typewriter) so I don't understand why. I also try to change the _IOW to _IOWR but same mistake. Someone can explain what is the problem, please ? Marcel. [-- Attachment #2: Type: text/html, Size: 614 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] driver: IOCTL command behavior 2009-04-16 11:47 [Xenomai-help] driver: IOCTL command behavior Marcel Soulot @ 2009-04-16 12:59 ` Gilles Chanteperdrix [not found] ` <37f89760904160654g43fde4f0l6cd228faa65d6baf@domain.hid> 0 siblings, 1 reply; 6+ messages in thread From: Gilles Chanteperdrix @ 2009-04-16 12:59 UTC (permalink / raw) To: Marcel Soulot; +Cc: xenomai Marcel Soulot wrote: > Hi, > > I wrote a driver and used IOCTL command. When I test my driver with a test > application with root access the IOCTL cmd work fine. > I notice when I declared my IOCTL command that I used the _IOR for all of > them. Even the IOCTL command is a read (on register) or write. > So I try to correct my mistake and wants to use _IOR for read command and > _IOW for write command. > For the write command, I got a error -25 (not a typewriter) so I don't > understand why. > I also try to change the _IOW to _IOWR but same mistake. > > Someone can explain what is the problem, please ? A piece of code is worth a thousand words... -- Gilles. ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <37f89760904160654g43fde4f0l6cd228faa65d6baf@domain.hid>]
* Re: [Xenomai-help] driver: IOCTL command behavior [not found] ` <37f89760904160654g43fde4f0l6cd228faa65d6baf@domain.hid> @ 2009-04-16 14:17 ` Gilles Chanteperdrix 2009-04-16 14:55 ` Marcel Soulot 0 siblings, 1 reply; 6+ messages in thread From: Gilles Chanteperdrix @ 2009-04-16 14:17 UTC (permalink / raw) To: Marcel Soulot; +Cc: Xenomai help Marcel Soulot wrote: > Hi, > sorry, i don't realise that my description is a bit fuzzy. > > Here I define two IOCTL command: > > #define RT_GPIO_RTIOC_GET_DIRECTION\ > _IOR(RTIOC_TYPE_GPIO, 0x01, int) > > #define RT_GPIO_RTIOC_SET_DIRECTION\ > _IOR(RTIOC_TYPE_GPIO, 0x02, int) > > the commands (both) works fine. For the command > RT_GPIO_RTIOC_SET_DIRECTION,I try to switch _IOR() to _IOW() according > the driver "xeno_16550A" (in the > file /usr/xenomai/include/rtdm/rtserial.h) > > #define RTSER_RTIOC_GET_CONFIG \ > _IOR(RTIOC_TYPE_SERIAL, 0x00, struct rtser_config) > > #define RTSER_RTIOC_SET_CONFIG \ > _IOW(RTIOC_TYPE_SERIAL, 0x01, struct rtser_config) > > But when I define : > > #define RT_GPIO_RTIOC_SET_DIRECTION\ > _IOW(RTIOC_TYPE_GPIO, 0x02, int) > > or > > #define RT_GPIO_RTIOC_SET_DIRECTION\ > _IOWR(RTIOC_TYPE_GPIO, 0x02, int) > > the call of "rt_dev_ioctl(my_fd,RT_GPIO_RTIOC_SET_DIRECTION,0xFF)" returns > me the error "-ENOTTY". > Which means that the command RT_GPIO_RTIOC_SET_DIRECTION is not recognized > and I drop in default error. > > Hope my explanation is better, No, please send us enough code for us to reproduce the issue. Please do not drop the mailing list from the discussion. -- Gilles. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] driver: IOCTL command behavior 2009-04-16 14:17 ` Gilles Chanteperdrix @ 2009-04-16 14:55 ` Marcel Soulot 2009-04-16 15:15 ` Jan Kiszka 0 siblings, 1 reply; 6+ messages in thread From: Marcel Soulot @ 2009-04-16 14:55 UTC (permalink / raw) To: Gilles Chanteperdrix; +Cc: Xenomai help [-- Attachment #1: Type: text/plain, Size: 2588 bytes --] Hi, here is the my ioctl function and the header file below. /*****************************************************************************************/ int rt_gpio_ioctl(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, unsigned int request, void *arg) { struct rt_gpio_context *ctx_gpio; int err = 0; unsigned long base; int mode; ctx_gpio = (struct rt_gpio_context *)context->dev_private; base = ctx_gpio->base_addr; mode = rt_gpio_io_mode_from_ctx_gpio(ctx_gpio); printk(KERN_INFO "IOCTL : request %x\n", request); switch (request) { case RT_GPIO_RTIOC_GET_DIRECTION: { /* ** 1 = input and 0 = output, by default all are inputs. */ int gpio_dir; gpio_dir = rt_gpio_reg_in(mode, base, OFF_MPIOSEL); printk(KERN_INFO "GET_DIRECTION %x\n", gpio_dir); if (user_info) { err = rtdm_safe_copy_to_user(user_info, arg, &gpio_dir, sizeof(int)); } else { *(int *)arg = gpio_dir; } break; } case RT_GPIO_RTIOC_SET_DIRECTION: { /* ** 1 = input and 0 = output, by default all are inputs. */ unsigned int gpio_dir = (unsigned int)arg; rt_gpio_reg_out(mode, base, OFF_MPIOSEL, gpio_dir); printk(KERN_INFO "SET_DIRECTION %x\n", gpio_dir); break; } default: err = -ENOTTY; } return err; } /**************************************************************************************************/ header file /**************************************************************************************************/ #ifndef _RTGPIO_H #define _RTGPIO_H #include <rtdm/rtdm.h> #define RT_GPIO_PROFILE_VER 2 #define RTIOC_TYPE_GPIO RTDM_CLASS_GPIO #define RTDM_SUBCLASS_GPIO 0 #define RT_GPIO_RTIOC_GET_DIRECTION\ _IOR(RTIOC_TYPE_GPIO, 0x00, int) #define RT_GPIO_RTIOC_SET_DIRECTION\ _IOR(RTIOC_TYPE_GPIO, 0x01, int) #endif /* _RTGPIO_H */ /**************************************************************************************************/ So for the "RT_GPIO_RTIOC_SET_DIRECTION" when I switch "_IOR(RTIOC_TYPE_GPIO, 0x01, int)" to "_IOW(RTIOC_TYPE_GPIO, 0x01, int)" or "_IOWR(RTIOC_TYPE_GPIO, 0x01, int)", the switch pass in "default". Someone as an explanation ? Thanks, Marcel. [-- Attachment #2: Type: text/html, Size: 3191 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] driver: IOCTL command behavior 2009-04-16 14:55 ` Marcel Soulot @ 2009-04-16 15:15 ` Jan Kiszka 2009-04-16 15:47 ` Marcel Soulot 0 siblings, 1 reply; 6+ messages in thread From: Jan Kiszka @ 2009-04-16 15:15 UTC (permalink / raw) To: Marcel Soulot; +Cc: Xenomai help Marcel Soulot wrote: > Hi, > here is the my ioctl function and the header file below. > > > /*****************************************************************************************/ > int rt_gpio_ioctl(struct rtdm_dev_context *context, > rtdm_user_info_t *user_info, > unsigned int request, void *arg) > { > struct rt_gpio_context *ctx_gpio; > int err = 0; > unsigned long base; > int mode; > > ctx_gpio = (struct rt_gpio_context *)context->dev_private; > base = ctx_gpio->base_addr; > mode = rt_gpio_io_mode_from_ctx_gpio(ctx_gpio); > > printk(KERN_INFO "IOCTL : request %x\n", request); > switch (request) > { > case RT_GPIO_RTIOC_GET_DIRECTION: > { > /* > ** 1 = input and 0 = output, by default all are inputs. > */ > int gpio_dir; > > gpio_dir = rt_gpio_reg_in(mode, base, OFF_MPIOSEL); > printk(KERN_INFO "GET_DIRECTION %x\n", gpio_dir); > > if (user_info) > { > err = rtdm_safe_copy_to_user(user_info, arg, > &gpio_dir, sizeof(int)); > } > else > { > *(int *)arg = gpio_dir; > } > > break; > } > > case RT_GPIO_RTIOC_SET_DIRECTION: > { > /* > ** 1 = input and 0 = output, by default all are inputs. > */ > unsigned int gpio_dir = (unsigned int)arg; > > rt_gpio_reg_out(mode, base, OFF_MPIOSEL, gpio_dir); > printk(KERN_INFO "SET_DIRECTION %x\n", gpio_dir); > > break; > } > > default: > err = -ENOTTY; > } > > return err; > } > > > /**************************************************************************************************/ > header file > /**************************************************************************************************/ > > #ifndef _RTGPIO_H > #define _RTGPIO_H > > #include <rtdm/rtdm.h> > > #define RT_GPIO_PROFILE_VER 2 > > #define RTIOC_TYPE_GPIO RTDM_CLASS_GPIO > #define RTDM_SUBCLASS_GPIO 0 > > #define RT_GPIO_RTIOC_GET_DIRECTION\ > _IOR(RTIOC_TYPE_GPIO, 0x00, int) > > #define RT_GPIO_RTIOC_SET_DIRECTION\ > _IOR(RTIOC_TYPE_GPIO, 0x01, int) > > #endif /* _RTGPIO_H */ > > /**************************************************************************************************/ > > So for the "RT_GPIO_RTIOC_SET_DIRECTION" when I switch "_IOR(RTIOC_TYPE_GPIO, > 0x01, int)" to "_IOW(RTIOC_TYPE_GPIO, 0x01, int)" or "_IOWR(RTIOC_TYPE_GPIO, > 0x01, int)", the switch pass in "default". > > Someone as an explanation ? Did you cleanly rebuild both kernel and user space after fiddling with _IO*? The numerical value of RT_GPIO_RTIOC_SET_DIRECTION changes each time. BTW, _IO* are conventions between driver and user, nothing is checked or enforced elsewhere. Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Xenomai-help] driver: IOCTL command behavior 2009-04-16 15:15 ` Jan Kiszka @ 2009-04-16 15:47 ` Marcel Soulot 0 siblings, 0 replies; 6+ messages in thread From: Marcel Soulot @ 2009-04-16 15:47 UTC (permalink / raw) To: Jan Kiszka; +Cc: Xenomai help [-- Attachment #1: Type: text/plain, Size: 74 bytes --] Thanks for the tips. I forgot to recompile the user application. Marcel. [-- Attachment #2: Type: text/html, Size: 88 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-04-16 15:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-16 11:47 [Xenomai-help] driver: IOCTL command behavior Marcel Soulot
2009-04-16 12:59 ` Gilles Chanteperdrix
[not found] ` <37f89760904160654g43fde4f0l6cd228faa65d6baf@domain.hid>
2009-04-16 14:17 ` Gilles Chanteperdrix
2009-04-16 14:55 ` Marcel Soulot
2009-04-16 15:15 ` Jan Kiszka
2009-04-16 15:47 ` Marcel Soulot
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.