PDA

View Full Version : Speedtouch 330 under SuSE 9 Pro


qxh
Wed 12th Nov '03, 1:11pm
Has anyone managed to get the speedtouch 330 modem working under SuSE 9 Pro?

Thanks.

qxh
Thu 13th Nov '03, 4:36pm
Alright, I noticed it appears when I look at the devices. Does that means it's already working and has a driver built into SuSE or something? :confused:

MrNase
Fri 14th Nov '03, 2:15am
it should be supported, what exactly isn't working?

qxh
Fri 14th Nov '03, 12:27pm
The modem, heh. I don't know exactly how to setup my ADSL.

louisl
Fri 14th Nov '03, 12:58pm
Hey Scott I came across a few of links that might help you get the modem going. Maybe you can pick something up that you have not tried already.

http://portal.suse.com/sdb/en/2002/05/configSpeedTouch.html

http://www.xs4all.nl/~pschram/english.html

http://www.linux-usb.org/SpeedTouch/faq/index.html

qxh
Fri 14th Nov '03, 2:21pm
Thanks louisl. I've done loads of searching for days/weeks with no luck. Seen those links before but again thanks. :)

qxh
Fri 14th Nov '03, 5:35pm
Sweet, I managed to get it working. Here is my next problem.

Nov 14 21:30:17 linux modem_run[3256]: modem_run version 1.2-beta2 started by root uid 0
Nov 14 21:30:19 linux kernel: usb_control/bulk_msg: timeout
Nov 14 21:30:19 linux kernel: usbdevfs: USBDEVFS_BULK failed dev 7 ep 0x85 len 512 ret -110
Nov 14 21:30:22 linux modem_run[3256]: Another program/driver is already accessing the modem (interface 1 cannot be claimed)...

I have to run: modem_run -m -f /mgmt.o.

If you ain't noticed I'm running SuSE 9 Pro ;) Now, when I plug in my modem I heard a "beep". I need to deactivate this I believe, some how. This modem is plugged into a USB port. Any suggestions or ideas please?

Thanks

qxh
Fri 14th Nov '03, 5:37pm
/*
* ALCATEL SpeedTouch USB : Portable USB user library -- Linux implementation
* Copyright (C) 2001 Benoit PAPILLAULT
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Author : Benoit PAPILLAULT <[EMAIL PROTECTED]>
* Creation : 29/05/2001
*
* $Id: pusb-linux.c,v 1.9 2003/01/31 21:47:02 edgomez Exp $
*/

#ifndef _PUSB_LINUX_C_
#define _PUSB_LINUX_C_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>

#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/time.h>

#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
#include <asm/page.h>

#include "pusb.h"

/************************************************** ****************************
* Structures
************************************************** ****************************/

struct pusb_device_t
{
int fd;
};

struct pusb_endpoint_t
{
int fd;
int ep;
};

static const char usb_path[] = "/proc/bus/usb";

#ifndef __LINUX_USB_CH9_H
/* Device descriptor */
struct usb_device_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u16 bcdUSB;
__u8 bDeviceClass;
__u8 bDeviceSubClass;
__u8 bDeviceProtocol;
__u8 bMaxPacketSize0;
__u16 idVendor;
__u16 idProduct;
__u16 bcdDevice;
__u8 iManufacturer;
__u8 iProduct;
__u8 iSerialNumber;
__u8 bNumConfigurations;
} __attribute__ ((packed));
#endif

/************************************************** ***************************
* Local Prototypes
************************************************** ***************************/

static int test_file(const char *path, int vendorID, int productID);
static int usbfs_search(const char *path, int vendorID, int productID);
static pusb_device_t make_device(int fd);

/************************************************** ***************************
* Library functions
************************************************** ***************************/



/*
* Function : pusb_search_open
* Return value : NULL on error, a valid pusb_device_t on success
* Description :
*/
pusb_device_t pusb_search_open(int vendorID, int productID)
{
int fd;

if ((fd = usbfs_search("/proc/bus/usb",vendorID,productID)) < 0)
return(NULL);

return(make_device(fd));

}

/*
* Function : pusb_open
* Return value : NULL on error, a valid pusb_device_t on success
* Description : Opens the USB device pointed by path
*/
pusb_device_t pusb_open(const char *path)
{
int fd;

if ((fd = open(path, O_RDWR)) < 0)
return(NULL);

return(make_device(fd));

}

/*
* Function : pusb_close
* Return value : 0 on success, -1 on error (errno is set)
* Description : Closes the USB dev
*/
int pusb_close(pusb_device_t dev)
{

int ret;

ret = close(dev->fd);
free(dev);

return(ret);

}

/*
* Function : pusb_control_msg
* Return value : ioctl returned value (see linux usb docs)
* Description : sends a control msg urb to the device
*/
int pusb_control_msg( pusb_device_t dev,
int request_type,
int request,
int value,
int index,
unsigned char *buf,
int size,
int timeout)
{

int ret;
struct usbdevfs_ctrltransfer ctrl;

ctrl.bRequestType = request_type;
ctrl.bRequest = request;
ctrl.wValue = value;
ctrl.wIndex = index;
ctrl.wLength = size;
ctrl.timeout = timeout;
ctrl.data = buf;

ret = ioctl(dev->fd,USBDEVFS_CONTROL,&ctrl);

return(ret);

}

/*
* Function : pusb_set_configuration
* Return value : ioctl returned value (see linux-usb docs)
* Description : cf function name
*/
int pusb_set_configuration(pusb_device_t dev, int config)
{

int ret;

ret = ioctl(dev->fd,USBDEVFS_SETCONFIGURATION,&config);

return(ret);

}

/*
* Function : pusb_set_interface
* Return value : ioctl returned value (see linux-usb docs)
* Description : see function name
*/
int pusb_set_interface(pusb_device_t dev, int interface, int alternate)
{

struct usbdevfs_setinterface setintf;
int ret;

setintf.interface = interface;
setintf.altsetting = alternate;

ret = ioctl(dev->fd,USBDEVFS_SETINTERFACE,&setintf);

return(ret);

}

/*
* Function : pusb_endpoint_open
* Return value : NULL on error, a valid ep on success
* Description : see function name
*/
pusb_endpoint_t pusb_endpoint_open(pusb_device_t dev, int epnum, int flags)
{

pusb_endpoint_t ep;

if ((ep = (pusb_endpoint_t) malloc(sizeof(*ep))) == NULL)
return(NULL);

ep->fd = dev->fd;
ep->ep = epnum & 0xf;

return(ep);

}

/*
* Function : pusb_endpoint_rw_no_timeout
* Return value : ioctl returned value
* Description : Writes or Read from an usb end point (without timeout value)
*/
int pusb_endpoint_rw_no_timeout(int fd,
int ep,
const unsigned char *buf,
int size)
{

struct usbdevfs_urb urb, * purb;
int ret;

memset(&urb,0,sizeof(urb));

urb.type = USBDEVFS_URB_TYPE_BULK;
urb.endpoint = ep;
urb.flags = 0;
urb.buffer = (unsigned char*)buf;
urb.buffer_length = size;
urb.signr = 0;

do {
ret = ioctl(fd,USBDEVFS_SUBMITURB,&urb);
} while(ret < 0 && errno == EINTR);

if (ret < 0)
return(ret);

do {
ret = ioctl(fd,USBDEVFS_REAPURB,&purb);
} while(ret < 0 && errno == EINTR);

if(ret < 0)
return(ret);

/*
if(purb != &urb)
fprintf(stderr, "purb=%p, &urb=%p\n",purb,&urb);

if(purb->buffer != buf)
fprintf(stderr, "purb->buffer=%p, buf=%p\n",purb->buffer,buf);
*/

return (purb->status < 0) ? purb->status : purb->actual_length;

}

/*
* Function : pusb_endpoint_rw
* Return value : ioctl returned value
* Description : Writes or Read from an usb end point (with timeout value)
*/
int pusb_endpoint_rw(
int fd,
int ep,
const unsigned char * buf,
int size,
int timeout)
{

struct usbdevfs_bulktransfer bulk;
int ret, received = 0;

do {

bulk.ep = ep;
bulk.len = (size > PAGE_SIZE)?PAGE_SIZE:size;
bulk.timeout = timeout;
bulk.data = (unsigned char*)buf;

do {
ret = ioctl(fd,USBDEVFS_BULK,&bulk);
} while (ret < 0 && errno == EINTR);

if (ret < 0)
return(ret);

buf += ret;
size -= ret;
received += ret;

} while(ret==bulk.len && size>0);

return(received);
}

/*
* Function : pusb_endpoint_write
* Return value : same as pusb_endpoint_rw
* Description : wrapper to the pusb_endpoint_rw
*/
int pusb_endpoint_write(pusb_endpoint_t ep,
const unsigned char *buf,
int size,
int timeout)
{

if(timeout == 0)
return pusb_endpoint_rw_no_timeout(ep->fd,ep->ep|USB_DIR_OUT,buf,size);

return(pusb_endpoint_rw(ep->fd,ep->ep|USB_DIR_OUT,buf,size,timeout));

}

/*
* Function : pusb_endpoint_read
* Return value : same as pusb_endpoint_rw
* Description : wrapper to the pusb_endpoint_rw
*/
int pusb_endpoint_read( pusb_endpoint_t ep,
unsigned char *buf,
int size,
int timeout)
{

if(timeout == 0)
return(pusb_endpoint_rw_no_timeout(ep->fd,ep->ep|USB_DIR_IN,buf,size));

return(pusb_endpoint_rw(ep->fd,ep->ep|USB_DIR_IN,buf,size,timeout));

}

/*
* Function : pusb_endpoint_close
* Return value : 0
* Description : Close the end pont given in parameter
*/
int pusb_endpoint_close(pusb_endpoint_t ep)
{
/* nothing to do on the struct content */
free(ep);

return(0);

}

/*
* Function : pusb_claim_interface
* Return value : ioctl returned value
* Description : Claims an interface for use
*/
int pusb_claim_interface(pusb_device_t dev, int interface)
{

return(ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE,&interface));

}

/*
* Function : pusb_release_interface
* Return value : ioctl returned value
* Description : Release the usb interface
*/
int pusb_release_interface(pusb_device_t dev, int interface)
{

return(ioctl(dev->fd,USBDEVFS_RELEASEINTERFACE,&interface));

}

int pusb_ioctl (pusb_device_t dev,int interface,int code,void *data)
{
struct usbdevfs_ioctl ctrl;

ctrl.ifno = interface;
ctrl.ioctl_code = code;
ctrl.data = data;

return(ioctl(dev->fd,USBDEVFS_IOCTL,&ctrl));
}

/************************************************** ***************************
* Local functions
************************************************** ***************************/

/*
* Function : test_file
* Return value : -1 on error, a valid filedescriptor on success
* Description : Try to open the file and get USB device information,
* if it's ok, check if it matches vendorID & productID
*/
static int test_file(const char *path, int vendorID, int productID)
{

int fd;
struct usb_device_descriptor desc;

if((fd = open(path, O_RDWR)) == -1) {
perror(path);
return(-1);
}

if(read(fd,&desc,sizeof(desc)) == sizeof(desc)) {

/*
* Great, we read something
* check, it match the correct structure
*/
if(desc.bLength == sizeof(desc)) {

/*
fprintf(stderr, "=== %s ===\n",path);
fprintf(stderr, " bLength = %u\n",desc.bLength);
fprintf(stderr, " bDescriptorType =
%u\n",desc.bDescriptorType);
fprintf(stderr, " bcdUSB = %04x\n",desc.bcdUSB);
fprintf(stderr, " idVendor = %04x\n",desc.idVendor);
fprintf(stderr, " idProduct = %04x\n",desc.idProduct);
fprintf(stderr, " bcdDevice = %04x\n",desc.bcdDevice);
*/
if( vendorID == desc.idVendor &&
productID == desc.idProduct)
return(fd);
}

}

close(fd);

return(-1);

}

/*
* Function : usbfs_search
* Return value : -1 on error, a valid filedescriptor on success
* Description : Search for a vendorID, productID.
*/
static int usbfs_search(const char *path, int vendorID, int productID)
{

int result = -1;

DIR * dir;
struct dirent * dirp;

if((dir = opendir(path)) == NULL) {
perror(path);
return(-1);
}

while((dirp=readdir(dir)) != NULL) {

struct stat statbuf;
char file[PATH_MAX+1];

if (strlen(dirp->d_name) != 3)
continue;

if (!isdigit(dirp->d_name[0]) ||
!isdigit(dirp->d_name[1]) ||
!isdigit(dirp->d_name[2]))
continue;

sprintf(file,"%s/%s",path,dirp->d_name);

if (stat(file,&statbuf) != 0) {
perror(file);
continue;
}

if (S_ISDIR(statbuf.st_mode)) {

if((result = usbfs_search(file,vendorID,productID)) < 0)
continue;
else
break;
}

if (S_ISREG(statbuf.st_mode)) {

if ((result=test_file(file,vendorID,productID)) < 0)
continue;
else
break;
}

}

closedir(dir);

return(result);

}

/*
* Function : make_device
* Return value : NULL on error, a valid pusb_device_t
* Description : Allocates a pusb_device_t data structure
*/
static pusb_device_t make_device(int fd)
{

pusb_device_t dev;

if((dev = malloc(sizeof(*dev))) == NULL) {
close (fd);
return(NULL);
}

dev->fd = fd;
return(dev);

}

#endif /* _PUSB_LINUX_C_ */

For anyone having the same problem with an error when running "make", above is the code which you should replace src/pusb-linux.c with. :).

Good luck.

Psst..don't forget teh question in the above post, please. ;)