How to 'talk' to USB modem in Linux?

You can use cu.

$ sudo apt-get install cu

You can connect to your modem with:

$ cu -l ttyACM0

(with: ttyACM0 being the device /dev/ttyACM0) You should get a response:

connected

At this point you can use any of the standard AT commands such as to test dialing:

ATDT 123-456-7890

You should have your userid set to the group dialout for permission to access the modem.

You can exit the cu application with "~." (tilde dot).

You can find other Hayese commands at:

http://en.wikipedia.org/wiki/Hayes_command_set


If by talk you mean send AT commands in the form

echo "ATi" > /dev/usbDev

try this: http://brunomgalmeida.wordpress.com/2012/04/06/send-at-commands-to-usb-modem/


Use minicom, socat or screen:

socat - /dev/ttyUSB1 
minicom -D /dev/ttyUSB1
screen /dev/ttyUSB1

NOTE: I used real device name /dev/ttyUSB1 instead of fake /dev/usbDev.


I believe the answer you're looking for is here: Using a USB winmodem with a Conexant driver in (K)Ubuntu 11.10 (Oneiric).

Important stuff (extracted from the site):

When I plugged a Conexant modem, I executed

lsusb

and it said:

[...]

Bus 006 Device 002: ID 0572:1300 Conexant Systems (Rockwell), Inc. SoftK56 Data Fax Voice CARP

[...]

so I knew that the HSF modem was recognized by the system.

As I had a previous internet connection, I upgraded the system

sudo apt-get update && sudo apt-get dist-upgrade

I checked that I had no previous Conexant drivers installed. For example: I executed

ls /usr/sbin/hsfconfig

and it said that that file did not exist; if it existed I would have thought that something was still installed.

I made sure that I had "gcc" and "make" ready, executing

sudo apt-get install gcc make

Then I executed those steps told there:

sudo -s
cd /lib/modules/$(uname -r)/build/include/linux
ln -s ../generated/utsrelease.h
ln -s ../generated/autoconf.h
exit

I prepared the files for the driver compilation, executing

mkdir ~/conexant_modem
cd ~/conexant_modem

and if I had a 64-bit operating system I executed

wget http://linux.dell.com/files/ubuntu/hardy/modem-drivers/hsf/hsfmodem-7.68.00.09x86_64oem.tar.gz
tar xzf hsfmodem-7.68.00.09x86_64oem.tar.gz
wget http://www.bargweb.net/images/2009/november/hsfmodem-7.80.02.05-DiacoEdition.zip
unzip hsfmodem-7.80.02.05-DiacoEdition.zip
cp -a hsfmodem-7.80.02.05-DiacoEdition/modules/imported/include/framewrk.h hsfmodem-7.68.00.09x86_64oem/modules/imported/include/framewrk.h
cp -a hsfmodem-7.80.02.05-DiacoEdition/modules/imported/include/osservices.h hsfmodem-7.68.00.09x86_64oem/modules/imported/include/osservices.h

else, if I had a 32-bit operating system I executed

wget http://linux.dell.com/files/ubuntu/hardy/modem-drivers/hsf/hsfmodem-7.68.00.09oem.tar.gz
tar xzf hsfmodem-7.68.00.09oem.tar.gz
wget http://www.bargweb.net/images/2009/november/hsfmodem-7.80.02.05-DiacoEdition.zip
unzip hsfmodem-7.80.02.05-DiacoEdition.zip
cp -a hsfmodem-7.80.02.05-DiacoEdition/modules/imported/include/framewrk.h hsfmodem-7.68.00.09oem/modules/imported/include/framewrk.h
cp -a hsfmodem-7.80.02.05-DiacoEdition/modules/imported/include/osservices.h hsfmodem-7.68.00.09oem/modules/imported/include/osservices.h
A note for the curious ones: those "framewrk.h" and "osservices.h" files were the different ones between the directories "hsfmodem-7.68.00.09oem/modules/imported" and "hsfmodem-7.80.02.05-DiacoEdition/modules/imported".

If I had a 64-bit operating system I executed

wget http://www.linuxant.com/drivers/hsf/full/archive/hsfmodem-7.80.02.06x86_64full/hsfmodem-7.80.02.06x86_64full.tar.gz

else, if I had a 32-bit operating system I executed

wget http://www.linuxant.com/drivers/hsf/full/archive/hsfmodem-7.80.02.06full/hsfmodem-7.80.02.06full.tar.gz

A note for the curious ones: that file was the newest one in http://www.linuxant.com/drivers/hsf/full/downloads.php

And then, if I had a 64-bit operating system I executed

tar xzf hsfmodem-7.80.02.06x86_64full.tar.gz
rm -r hsfmodem-7.80.02.06x86_64full/modules/imported
cp -R hsfmodem-7.68.00.09x86_64oem/modules/imported hsfmodem-7.80.02.06x86_64full/modules/
cp -R hsfmodem-7.68.00.09x86_64oem/modules/imported hsfmodem-7.80.02.06x86_64full/modules/

else, if I had a 32-bit operating system I executed

tar xzf hsfmodem-7.80.02.06full.tar.gz
rm -r hsfmodem-7.80.02.06full/modules/imported
cp -R hsfmodem-7.68.00.09oem/modules/imported hsfmodem-7.80.02.06full/modules/
cp -R hsfmodem-7.68.00.09oem/modules/imported hsfmodem-7.80.02.06full/modules/

The next step was to clean the present directory.

If I had a 64-bit operating system I executed

rm -rf hsfmodem-7.68.00.09x86_64oem
rm -rf hsfmodem-7.80.02.05-DiacoEdition
rm hsfmodem-7.68.00.09x86_64oem.tar.gz
rm hsfmodem-7.80.02.05-DiacoEdition.zip
rm hsfmodem-7.80.02.06x86_64full.tar.gz

else, if I had a 32-bit operating system I executed

rm -rf hsfmodem-7.68.00.09oem
rm -rf hsfmodem-7.80.02.05-DiacoEdition
rm hsfmodem-7.68.00.09oem.tar.gz
rm hsfmodem-7.80.02.05-DiacoEdition.zip
rm hsfmodem-7.80.02.06full.tar.gz

Then I had to change some files to adapt them to work with the 3.0.0 version of the Linux kernel. If I had a 64-bit operating system I executed

cd hsfmodem-7.80.02.06x86_64full
xdg-open modules/GPL/serial_cnxt.c

else, if I had a 32-bit operating system I executed

cd hsfmodem-7.80.02.06full
xdg-open modules/GPL/serial_cnxt.c

and then a text editor was launched. I searched for the string

#ifndef FOUND_UART_REGISTER_PORT

and below I found the string

static DECLARE_MUTEX(cnxt_port_sem);

I deleted that last string, and wrote there

static DEFINE_SEMAPHORE(cnxt_port_sem);

and I saved and closed that file. I executed

xdg-open modules/osdiag.c

and then a text editor was launched. I searched for the string

THIS_MODULE,

and below I found the string

.ioctl    = diag_ioctl,

I deleted that string, and wrote there

.compat_ioctl = diag_ioctl,

and I saved and closed that file. I executed

xdg-open modules/osnvm.c

and then a text editor was launched. I searched for the string

static LIST_HEAD(nvm_newinst_list);

and below I found the string

static DECLARE_MUTEX(nvmelem_writelist_sem);

I deleted that last string, and wrote there

static DEFINE_SEMAPHORE(nvmelem_writelist_sem);

and I saved and closed that file.

A note for the curious ones: the source of those changes in those files was http://www.openmamba.org/showfile.ht...l-2.6.37.patch

The user named Chiaseth helped telling those steps that I followed, this way:

  1. I executed

    xdg-open modules/osservices.c

and then a text editor was launched. I searched for the string

#include <linux/smp_lock.h>

and I deleted that string, and wrote there

#include <linux/mutex.h>
DEFINE_MUTEX(os_mutex);  // Define a mutex

In that file I searched for the strings

unlock_kernel()

replacing all of them with

mutex_unlock(&os_mutex)

Also, in that file I searched for the strings

lock_kernel()

replacing all of them with

mutex_lock(&os_mutex)

and I saved and closed that file.

  1. I executed

    xdg-open modules/osdcp.c

In that file I searched for the string

static spinlock_t dcp_lock = SPIN_LOCK_UNLOCKED;

replacing it with

static DEFINE_SPINLOCK(dcp_lock);

and I saved and closed that file.

  1. I executed

    xdg-open modules/osdiag.c

In that file I searched for the string

static spinlock_t diag_lock = SPIN_LOCK_UNLOCKED;

replacing it with

static DEFINE_SPINLOCK(diag_lock);

and I saved and closed that file.

  1. I executed

    xdg-open modules/osfloat.c

In that file I searched for the string

static spinlock_t fpstates_lock __attribute__((unused)) = SPIN_LOCK_UNLOCKED;

replacing it with

static DEFINE_SPINLOCK(fpstates_lock);

and I saved and closed that file.

  1. I executed

    xdg-open modules/osservices.c

In that file I searched for the string

static spinlock_t atomic_lock __attribute__((unused)) = SPIN_LOCK_UNLOCKED;

replacing it with

static DEFINE_SPINLOCK(atomic_lock);

and I saved and closed that file.

  1. I executed

    xdg-open modules/GPL/oscompat.h

In that file I searched for the string

static spinlock_t tqueue_lock __attribute__((unused)) = SPIN_LOCK_UNLOCKED;

replacing it with

static DEFINE_SPINLOCK(tqueue_lock);

and I saved and closed that file.

Finally... If executed

sudo make install
sudo hsfconfig

It asked "Where is the linux source build directory that matches your running kernel?", then I simply pressed the return key to accept the default answer. I also accepted the default answer in other questions.

Finally the command reported that

The /dev/modem alias (symlink) points to ttySHSF0

I executed

dmesg

and at the end I saw

[59190.782005] hsfengine: module license 'see LICENSE file distributed with driver' taints kernel.
[59190.782011] Disabling lock debugging due to kernel taint
[59192.564398] ttySHSF0 at MMIO 0x0 (irq = 0) is a Conexant HSF softmodem (USB-0572:1300)
[59192.600274] usbcore: registered new interface driver hsfusbcd2
[59194.416241] usbcore: deregistering interface driver hsfusbcd2
[59194.600064] usb 6-1: reset full speed USB device using uhci_hcd and address 2
[59194.811746] cnxthsf_DcpDestroy: units still active, waiting..
[59194.811764] cnxthsf_DcpDestroy: units still active, waiting..
[59194.811778] cnxthsf_DcpDestroy: units still active, waiting..
[59196.967466] ttySHSF0 at MMIO 0x0 (irq = 0) is a Conexant HSF softmodem (USB-0572:1300)
[59196.994150] usbcore: registered new interface driver hsfusbcd2

which meant, among other things, that the USB modem was detected at /dev/ttySHSF0.

Note: as they said in https://help.ubuntu.com/community/Di...Howto/Conexant: "do not delete or move the source tree [in our case: ~/conexant_modem] from your system after these steps, it will be required to uninstall and patch the driver."

I launched kppp (for example) and configured a new "connection", specifying that the modem was at /dev/ttySHSF0. You could also use a program like efax-gtk to send faxes through the modem.