Wednesday, March 11, 2009

How I connected to Internet from Linux via Airtel GPRS

First of all, I needed to activate Airtel's MO (Mobile Office) GPRS service. At the moment, they provide a form of this service by which I will be charged @ 30p/50KB (at least that's what I understood from their website). So, here is what I did:

Activating the MO service

Dialed *567*1# to activate (*567*2# to deactivate) the service on my prepaid Airtel connection.

Configuring the mobile

To configure the mobile for the MO service, I needed to set the active GPRS access point to airtelgprs.com. I have a Nokia 3220. There I had to set airtelgprs.com under Settings -> Connectivity -> GPRS -> GPRS Modem Settings -> Edit Active Access Point -> GPRS Access Point. Also, I set the Alias for Access Point, and Active Access Point to airtelgprs.com. That was all I had to do on the mobile side.

Connecting the Mobile to my Linux box

I connected the mobile (Nokia 3220) using the Nokia CA-42 cable to an USB port on my 4 yr old Compaq Presario 2203AL Laptop running Fedora 10. I made sure that the kernel had recognized my mobile as an USB modem. I checked that using the command dmesg. Among the several lines of output, the following lines appeared:


usb 2-2: new full speed USB device using uhci_hcd and address 2
usb 2-2: configuration #1 chosen from 1 choice
usb 2-2: New USB device found, idVendor=0421, idProduct=0802
usb 2-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
cdc_acm: This device cannot do calls on its own. It is no modem.
cdc_acm 2-2:1.0: ttyACM0: USB ACM device
usbcore: registered new interface driver cdc_acm
cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters


Thus, my mobile was detected as an USB modem with device name ttyACM0 under the /dev directory.

Linux side configuration

First of all, I made sure that I had turned off my wi-fi connectivity on this laptop. Also, I don't use ethernet on this laptop. So, basically, I got totally offline. All I had to do now was to use wvdial program to connect to the internet via the mobile. For that I needed to create the file wvdial.conf in /etc/ directory, and put the following lines in it:


[Dialer Defaults]
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = USB Modem
Phone = *99***1#
Stupid Mode = 1
ISDN = 0
Username = "none"
Init1 = ATZ
Password = "none"
Modem = /dev/ttyACM0
Baud = 230400


Once that was done, I ran the command wvdial from a terminal with root privileges. (Of course, later I intend to write a suitable udev rules file so that the permissions of the ttyACM0 device will be set such that I will be able to run wvdial as a normal user.) Connectivity was established, ppp was started, and along with several lines of output from wvdial, I found the following lines of information:


--> local IP address 117.99.41.9
--> remote IP address 10.6.6.6
--> primary DNS address 202.56.230.5
--> secondary DNS address 202.56.250.6



I checked using ifconfig that ppp was up. Also, the command route -n showed that my default gateway was 10.6.6.6 as expected from the above output. I then manually set the nameservers in the file /etc/resolv.conf.

That's all I had to do. I could now successfully ping any website, and surf the net, although very slowly... but who cares, it was fun :-)

To stop the connection, I just had to stop wvdial by pressing Control-C.

Sunday, March 8, 2009

Making Xmonad to show up in gdm session list

I am now for some reason having to use Fedora 10 on my home laptop... partly by choice, partly due to circumstances. As I expected, xmonad is not in yum repos (neither Fedora nor RPMFusion)... but thankfully, ghc and haskell libraries are. Anyways, I found an easy way to install haskell packages once ghc and friends are installed (more about that in a later post... probably). Well, installed xmonad, xmobar, etc. along with gmrun (this was in yum repos).

But now that I have xmonad installed, I needed xmonad to show up in gdm session list so that I could choose it over gnome. I had done this quite a while ago, before I started using debian based distros... so I had to re-learn the process (Xmonad FAQ page made the process trivial). Now that I know how it works, I thought I should blog about it so that I can look it up here again in case I forget again.

Well, after so much blah blah, the process is pretty straightforward. As with most Unixy ways of doing things, you just have to add a .desktop file, say, xmonad.desktop to "/usr/share/xsessions/".
The contents of this file is also quite straightforward:


[Desktop Entry]
Encoding=UTF-8
Name=xmonad
Comment=This session starts xmonad
Exec=/home/sc/.cabal/bin/xmonad
Type=Application


(OK, so you (assuming somebody other than me reads this) probably figured out by now that I used cabal to install xmonad... well, that saves me a blog post I guess :-)

xmonad should show up along with others in your gdm session list.

Monday, February 16, 2009

Creating a Calendar in Linux

Today I found a great program called "pcal". It can create good looking postscript calendars. Most importantly, it can mark holidays in the postscript output if a 'date file' (normally named .calendar) is provided to it.

I created a holiday list in my .calendar file as follows (the * after the dates indicate a holiday):

8/1/09* "Muharram"
23/1/09* "Netaji's Birthday"
26/1/09* "Republic Day"
31/1/09* "Saraswati Puja"
10/3/09* "Fateh-Duaz-Duham"
....

and then used pcal as follows to generate a nice single a4 page calendar for 2009:

pcal -P a4 -o cal2009.ps -E -f .calendar -g holiday -w 2009

Here,
'-P a4' generates output for A4 sheet,
'-o cal2009.ps' names the output file,
'-E' lets pcal know that my "date file" has dates in European format,
'-f .calendar' tells pcal the name of my "date file",
'-g holidays' tells pcal to use a particular color (in my case the default grey) for holidays,
'-w' tells pcal to create a whole year calendar (i.e. a full year on a single page).

Saturday, February 14, 2009

Setting "SHMConfig" to "true" for synclient to work in recent Linux distros

Situation:
==========

1. You use a synaptics touchpad on your laptop/netbook.

2. You use a recent Linux distro (like Fedora 10) that comes with a
blank /etc/X11/xorg.conf.

3. You don't like the way your distro has configured your touchpad by
default. For example, you would like to get a middle click by
tapping the upper right corner of the touchpad.

Solution:
=========

To change the synaptics touchpad options at runtime (i.e. while the X
Server is running), you need to use the command line program
"synclient" (or graphical programs like gsynaptics, etc.).

I prefer the command line "synclient" because it allows me to tweak a
lot of things that gsynaptics does not allow me to.

For example, to get a middle click by tapping the upper right corner
of your touchpad, run synclient with the following option:

synclient TapButton2=2 RTCornerButton=2

Read the synclient manual page for more details. Do a 'synclient -l'
to get the current user settings.

In Ubuntu 8.10, synclient is provided by the package
xserver-xorg-input-synaptics.

In Fedora 10, synclient is provided by the package
xorg-x11-drv-synaptics.

But to get synclient working, you need to have the option "SHMConfig"
set as "true" in your options to Xorg. This was earlier done by adding
the line:

Option "SHMConfig" "on"

in your /etc/X11/xorg.conf file in the Synaptics InputDevice section.
Now that this file is being deprecated, you need to find out how you
can provide this option to Xorg. If you are on Fedora 10 like me
(maybe this is also the case in Ubuntu 8.10, Fedora 9, etc.), you can
put this option in a hal configuration file in /etc/hal/fdi/policy/

Using root privileges, create a file named say, synaptics.fdi, in
/etc/hal/fdi/policy/ using your favorite editor, and put the following
there:


<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
<device>
<match key="info.capabilities" contains="input.touchpad">
<match key="info.product" contains="Synaptics TouchPad">
<merge key="input.x11_options.SHMConfig" type="string">true</merge>
</match>
</match>
</device>
</deviceinfo>


Next, restart by using the command (as root):

/etc/init.d/haldaemon restart

(The above command is for Fedora users. Use hal instead of haldaemon
if you are on Ubuntu)

Next, restart X Server using the command:

killall -HUP Xorg

Once X Server restarts, you should be able to use synclient without
any problems.

For more information regarding Synaptics Touchpad configuration
and configuring other devices under Xorg, see
http://wiki.ubuntu.com/X/Config/Input

Friday, December 5, 2008

Hacked an old driver to work under new linux kernels

Yesterday, I had to purchase a "PCI to parallel port" multi-I/O card to get the Xilinx Parallel IV cable to work on the Dell machines in our Lab (these PCs did not come with a parallel port, only USBs).

The card was from EnterMultimedia based on WCH352 chip. I am currently on Ubuntu 8.10 with 2.6.27 kernel. But after connecting the card and rebooting, the card was not detected by Linux. Well, actually it did detect it, but as some serial device for which no driver was found, and I could not find any /dev/lp0 or /dev/parport0. So, I looked into the driver CD that came with it, and found a linux driver (I did not expect to find it though)!
Tried to install it, but it turned out to be trying to use lp.o and parport_pc.o modules, both for old 2.4 linux kernels. No wonder the modules were not found in my system (and would not load even if they were present). To make matters worse, the 'installer' (well, hardly an installer... seemed to me more like a program that acted as some kind of wrapper using lp and parport_pc kernel modules for their work) was a compiled binary file without any source code provided on the CD.

So, after some head scratching, I decided to open the binary file using vim, and searched for 'parport_pc.o' and 'lp.o'. Found it, and then replaced them with 'parport_pc.ko' and 'lp.ko' respectively. Tried to run the file again, and it promptly responded with a segmentation fault. I had definitely jumbled up the addresses of different instruction in the binary, which the linker had worked hard to setup.

Then I did two things. First, changed the binary file so that now, 'parport_pc.ko' became 'parprt_pc.ko' and 'lp.ko' became 'l.ko' so that their length became same as their original names in the binary. Second, made a copy of the corresponding modules in my system and renamed them to reflect the new names for the binary file to be able to load them. Then, I ran depmod (I don't think it was required though, but well, did not hurt anyway).

Now I ran the binary file again, and voila, new devices /dev/lp0, /dev/lp1, /dev/parport0 and /dev/parport1 (dunno how lp1 and parport1 appeared though) have now appeared in my system :-)