staging: comedi: USB devs not working / some comedi core reorganization
Bernd Porr
mail at berndporr.me.uk
Wed Dec 11 00:08:15 UTC 2013
>> hacked cfc_check_trigger_src:
>> -----------------------------
>>
>> static inline int cfc_check_trigger_src(unsigned int *src, unsigned int
>> flags)
>> {
>> unsigned int orig_src = *src;
>>
>> *src = orig_src & flags;
>> printk("cfc_check_trigger_src: orig_src=%x, *src=%x
>> \n",orig_src,*src );
>> if (*src == TRIG_INVALID || *src != orig_src)
>> return -EINVAL;
>> return 0;
>> }
>>
>>
>> Any ideas?
>
> I don't know off-hand, but I'll take a look when I get the chance.
This is the first time comedi_command_test is called in generic_timed
(in comedilib / userspace). That assumes that the subdevice is
initialised, in particular the cmd_mask. Can it be that this sometimes
won't happen? The behaviour is pretty random so it might be an
uninitialised struct. Return value of generic_timed is -1 just now but
had also 1 in the past.
/Bernd
EXPORT_ALIAS_DEFAULT(_comedi_get_cmd_src_mask,comedi_get_cmd_src_mask,0.7.18);
int _comedi_get_cmd_src_mask(comedi_t *it,unsigned int subd,comedi_cmd *cmd)
{
subdevice *s;
int ret;
if(!valid_subd(it,subd))return -1;
s=it->subdevices+subd;
if(s->cmd_mask_errno){
errno = s->cmd_mask_errno;
return -1;
}
if(!s->cmd_mask){
comedi_cmd *mask;
mask = malloc(sizeof(comedi_cmd));
memset(mask,0,sizeof(*cmd));
mask->subdev = subd;
mask->flags = 0;
mask->start_src = TRIG_ANY;
mask->scan_begin_src = TRIG_ANY;
mask->convert_src = TRIG_ANY;
mask->scan_end_src = TRIG_ANY;
mask->stop_src = TRIG_ANY;
s->cmd_mask = mask;
ret = comedi_command_test(it,mask);
if(ret<0){
s->cmd_mask_errno = errno;
return -1;
}
static int __generic_timed(comedi_t *it, unsigned s,
comedi_cmd *cmd, unsigned chanlist_len, unsigned scan_period_ns)
{
int ret;
unsigned convert_period_ns;
if(chanlist_len < 1) return -EINVAL;
ret = comedi_get_cmd_src_mask(it,s,cmd);
if(ret<0)return ret;
__comedi_errno = ENOTSUPPORTED;
if(cmd->start_src&TRIG_NOW){
cmd->start_src=TRIG_NOW;
cmd->start_arg=0;
}else if(cmd->start_src&TRIG_INT){
cmd->start_src=TRIG_INT;
cmd->start_arg=0;
}else{
COMEDILIB_DEBUG(3,"can't find good start_src\n");
return -1;
}
convert_period_ns = (scan_period_ns + chanlist_len / 2) /
chanlist_len;
if((cmd->convert_src & TRIG_TIMER) &&
(cmd->scan_begin_src & TRIG_FOLLOW))
{
cmd->convert_src = TRIG_TIMER;
cmd->convert_arg = convert_period_ns;
cmd->scan_begin_src = TRIG_FOLLOW;
cmd->scan_begin_arg = 0;
}else if((cmd->convert_src & TRIG_NOW) &&
(cmd->scan_begin_src & TRIG_TIMER))
{
--
www: http://www.berndporr.me.uk/
http://www.linux-usb-daq.co.uk/
http://www.imdb.com/name/nm3293421/
Mobile: +44 (0)7840 340069
Work: +44 (0)141 330 5237
University of Glasgow
School of Engineering
Rankine Building, Oakfield Avenue,
Glasgow, G12 8LT
More information about the devel
mailing list