some first impressions
wmb at laptop.org
Thu Aug 16 15:24:32 EDT 2007
Yoshiki Ohshima wrote:
>>> 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
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
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
More information about the Devel