some first impressions

Mitch Bradley wmb at laptop.org
Thu Aug 16 15:24:32 EDT 2007


Yoshiki Ohshima wrote:
>   Mitch,
>
>   
>>>   Thank you.  As I wrote on http://dev.laptop.org/ticket/2800, what we
>>> would like to have is C functions.  Then, I can wrap them as Squeak
>>> primitives.  Probably I can just rip these functions from amixer, but
>>> if you can tell me which, that would be good!
>>>   
>>>       
>> This is the relevant excerpt from the reference cited above.  The 
>> correspondence between this and C code should be obvious (os.system() -> 
>> system()), and it also implicitly answers the second question too.
>>     
>
>   Yes, I know. But calling system() is not quite nice in various ways.
> I'd rather would like to have a minimal C-code that can be a part of
> the Squeak VM.
>   
The controls in question reside in registers that cannot be accessed 
directly from userland programs

The mechanisms for accessing those registers are rather dependent on the 
programming environment and its facilities for interacting with the OS.

The AC/DC control is the 0x02 bit in the Cs5536 GPIO register.    The 
GPIO output value register is a 32-bit register at location 0x1000 in 
I/O space. Conceptually, the operation you would have to perform is either:

   outl(0x02, 0x1000);  // AC mode
or
  outl(0x02 << 16, 0x1000);   // DC mode

The catch is that you can't do I/O space accesses from userland, unless

a) You use iopl() to grant the process extra permissions
b) You use ioperm() to grant access to specific I/O registers (which 
doesn't work in this case because the register number is too high)
c) You access the I/O space via write() to /dev/port - which requires 
extra permissions to open.

Which of these approaches is appropriate for your environement, I cannot 
guess.

It might be nice if there were a driver to access the GPIO, but I didn't 
see one in a quick scan of the kernel source.

The bias control is the 0x04 bit of codec register 0x76.  Accessing 
codec registers requires a complicated dance involving some protected 
(in the sense that they are not trivially accessible from userland) 
registers in the AC97 hardware block.

As far as I know, the only extant C code for twiddling those registers 
is the alsamixer code, which I presume that you can read as easily as we 
can.





More information about the Devel mailing list