[Balloon] Using /dev/ttyS1 (the BTUART) on Balloon 3

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Paul Fidler
Date:  
To: balloon
Subject: [Balloon] Using /dev/ttyS1 (the BTUART) on Balloon 3

Over the last couple of days I've been trying to use the BTUART on the
Ballon 3 without much success. All I want is to be able to listen to bytes
coming in on the BTRXD line. It appears that the PXA is actually holding
this line low[1].

After some musing between Wookey, Peter Clifton and myself we decided that
the appropriate GPIO Alternate Function Register were not being set
anywhere[2]. After figuring out how and where they should be set, Wookey
dutifully came up with a patch that adds:

        pxa_gpio_mode(GPIO42_BTRXD_MD);
        pxa_gpio_mode(GPIO43_BTTXD_MD);
        pxa_gpio_mode(GPIO44_BTCTS_MD);
        pxa_gpio_mode(GPIO45_BTRTS_MD);


to balloon_init() in linux/arch/arm/mach-pxa/balloon3.c. There is similar
code in lubbock.c and idp.c, although they put the above lines in their
foo_map_io() functions, which get called earlier. (I've also seen code that
assigns the GPIOs to the HWUART RXD and TXD lines, but this was on a PXA255
based board, and a 2.4 vintage kernel.)


Anyway - the patch does not appear to have achieved anything. The BTRXD line
is still being pulled down...

The kernel clearly thinks it has a BTUART. There is code in
linux/drivers/serial/pxa.c that declares it, and the FFUART, BTUART and
STUART are all listed during boot and all the /dev/ttyS* entries get
mknod'ed. The BTUART isn't listed in /proc/interrupts until you actually
try using it (cat /dev/ttyS1), and disappears again when you give up. The
number of interrupts received is always zero.

Electrically, it looks like the line goes straight from the PXA, through a
68R resistor, and on to the outside world. It doesn't look like it goes
anywhere near the FPGA or anything else that could affect it.

Any suggestions? I'm a bit stumped.

Paul.


[1] It's a bit fiddly trying to put a scope or meter on the line, and I can
    really only measure anything after the BTRXD line has gone through a 
    68R resistor pack. With nothing else connected, the line appears to be 
held
    at 0V. If I connect something (the TX line of the device that I'm 
trying
    to listen to - which I can measure quite easily) then the line is 
pulled
    up, but only to about 2.5V or less.


    A further puzzle is when the Balloon is first powered up, I can measure
    3.3V on the line, but this drops to 2.5Vish after about 3 seconds. This
    would suggest that it isn't an issue with any hardware, but is something
    software related in the bootldr and/or kernel.


[2] It may actually be being set in bootldr. There is code in there that 
does:
        ldr     r1, GAFR1L_Init_BALLOON3
        str     r1, [r0, #__OFFSET(GAFR1_L)]


    where GAFR1L_Init_BALLOON3 is defined as:
        GAFR1L_Init_BALLOON3:   .long GAFR1L_InitValue


    which in turn is computed in bootldr/asm-arm/arch-pxa/balloon3-init.h
    which lists all the GPIO Alternate functions and default directions -
    but it's hard to see what actually gets used and what doesn't with all
    the #ifdef everywhere...




Paul Fidler
--
Cambridge University Engineering Department | Tel: +44 1223 332816
Trumpington Street, Cambridge, CB2 1PZ, UK | Fax: +44 1223 332662