Commit 8c817685 authored by Matthieu Cattin's avatar Matthieu Cattin

Add rrlib and python wrapper sources.

parent 015ed5a1
CFLAGS = -Wall -ggdb -I../kernel
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
ALL = rrlib.so
all: $(ALL)
rrlib.so: rrlib.o
$(CC) $(CFLAGS) -o $@ -shared $^
clean:
rm -f $(ALL) *.o *~ *.so *.pyc
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: module rr</title>
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong>rr</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/dcobas/gnurabbit/python/rr.py">/home/dcobas/gnurabbit/python/rr.py</a></font></td></tr></table>
<p><tt>#&nbsp;&nbsp;&nbsp;:vi:ts=4&nbsp;sw=4&nbsp;et</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="errno.html">errno</a><br>
<a href="os.html">os</a><br>
</td><td width="25%" valign=top><a href="re.html">re</a><br>
<a href="struct.html">struct</a><br>
</td><td width="25%" valign=top><a href="sys.html">sys</a><br>
</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="rr.html#Gennum">Gennum</a>
</font></dt></dl>
</dd>
<dt><font face="helvetica, arial"><a href="_ctypes.html#Array">_ctypes.Array</a>(_ctypes._CData)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial">c_long_Array_256
</font></dt></dl>
</dd>
<dt><font face="helvetica, arial"><a href="_ctypes.html#Structure">_ctypes.Structure</a>(_ctypes._CData)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="rr.html#RR_Devsel">RR_Devsel</a>
</font></dt><dt><font face="helvetica, arial"><a href="rr.html#RR_Iocmd">RR_Iocmd</a>
</font></dt></dl>
</dd>
<dt><font face="helvetica, arial"><a href="_ctypes.html#Union">_ctypes.Union</a>(_ctypes._CData)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="rr.html#RR_U">RR_U</a>
</font></dt></dl>
</dd>
</dl>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="Gennum">class <strong>Gennum</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="Gennum-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>get&nbsp;a&nbsp;file&nbsp;descriptor&nbsp;for&nbsp;the&nbsp;<a href="#Gennum">Gennum</a>&nbsp;device</tt></dd></dl>
<dl><dt><a name="Gennum-bind"><strong>bind</strong></a>(self, device)</dt><dd><tt>bind&nbsp;the&nbsp;rawrabbit&nbsp;driver&nbsp;to&nbsp;a&nbsp;device<br>
&nbsp;<br>
The&nbsp;device&nbsp;is&nbsp;specified&nbsp;with&nbsp;a&nbsp;syntax&nbsp;described&nbsp;in&nbsp;parse_addr</tt></dd></dl>
<dl><dt><a name="Gennum-getdmasize"><strong>getdmasize</strong></a>(self)</dt><dd><tt>return&nbsp;the&nbsp;size&nbsp;of&nbsp;the&nbsp;allocated&nbsp;DMA&nbsp;buffer&nbsp;(in&nbsp;bytes)</tt></dd></dl>
<dl><dt><a name="Gennum-getplist"><strong>getplist</strong></a>(self)</dt><dd><tt>get&nbsp;a&nbsp;list&nbsp;of&nbsp;pages&nbsp;for&nbsp;DMA&nbsp;access<br>
&nbsp;<br>
The&nbsp;addresses&nbsp;returned,&nbsp;shifted&nbsp;by&nbsp;12&nbsp;bits,&nbsp;give&nbsp;the&nbsp;physical<br>
addresses&nbsp;of&nbsp;the&nbsp;allocated&nbsp;pages</tt></dd></dl>
<dl><dt><a name="Gennum-info"><strong>info</strong></a>(self)</dt><dd><tt>get&nbsp;a&nbsp;string&nbsp;describing&nbsp;the&nbsp;interface&nbsp;the&nbsp;driver&nbsp;is&nbsp;bound&nbsp;to<br>
&nbsp;<br>
The&nbsp;syntax&nbsp;of&nbsp;the&nbsp;string&nbsp;is&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;vendor:device/dubvendor:subdevice@bus:devfn</tt></dd></dl>
<dl><dt><a name="Gennum-iread"><strong>iread</strong></a>(self, bar, offset, width)</dt><dd><tt>do&nbsp;a&nbsp;read&nbsp;by&nbsp;means&nbsp;of&nbsp;the&nbsp;ioctl&nbsp;interface<br>
&nbsp;<br>
bar&nbsp;=&nbsp;0,&nbsp;2,&nbsp;4&nbsp;(or&nbsp;c&nbsp;for&nbsp;DMA&nbsp;buffer&nbsp;access<br>
offset&nbsp;=&nbsp;address&nbsp;within&nbsp;bar<br>
width&nbsp;=&nbsp;data&nbsp;size&nbsp;(1,&nbsp;2,&nbsp;4&nbsp;or&nbsp;8&nbsp;bytes)</tt></dd></dl>
<dl><dt><a name="Gennum-irqena"><strong>irqena</strong></a>(self)</dt><dd><tt>enable&nbsp;the&nbsp;interrupt&nbsp;line</tt></dd></dl>
<dl><dt><a name="Gennum-irqwait"><strong>irqwait</strong></a>(self)</dt><dd><tt>wait&nbsp;for&nbsp;an&nbsp;interrupt</tt></dd></dl>
<dl><dt><a name="Gennum-iwrite"><strong>iwrite</strong></a>(self, bar, offset, width, datum)</dt><dd><tt>do&nbsp;a&nbsp;write&nbsp;by&nbsp;means&nbsp;of&nbsp;the&nbsp;ioctl&nbsp;interface<br>
&nbsp;<br>
bar&nbsp;=&nbsp;0,&nbsp;2,&nbsp;4&nbsp;(or&nbsp;c&nbsp;for&nbsp;DMA&nbsp;buffer&nbsp;access<br>
offset&nbsp;=&nbsp;address&nbsp;within&nbsp;bar<br>
width&nbsp;=&nbsp;data&nbsp;size&nbsp;(1,&nbsp;2,&nbsp;4&nbsp;or&nbsp;8&nbsp;bytes)<br>
datum&nbsp;=&nbsp;value&nbsp;to&nbsp;be&nbsp;written</tt></dd></dl>
<dl><dt><a name="Gennum-parse_addr"><strong>parse_addr</strong></a>(self, addr)</dt><dd><tt>take&nbsp;a&nbsp;string&nbsp;of&nbsp;the&nbsp;form<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vendor:device[/subvendor:subdevice][@bus:devfn]<br>
and&nbsp;return&nbsp;a&nbsp;dictionary&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;with&nbsp;the&nbsp;corresponding&nbsp;values,<br>
initialized&nbsp;to&nbsp;RR_DEVSEL_UNUSED&nbsp;when&nbsp;absent</tt></dd></dl>
<dl><dt><a name="Gennum-read"><strong>read</strong></a>(self, bar, offset, width)</dt><dd><tt>do&nbsp;a&nbsp;read&nbsp;by&nbsp;means&nbsp;of&nbsp;lseek+read<br>
&nbsp;<br>
bar&nbsp;=&nbsp;0,&nbsp;2,&nbsp;4&nbsp;(or&nbsp;c&nbsp;for&nbsp;DMA&nbsp;buffer&nbsp;access<br>
offset&nbsp;=&nbsp;address&nbsp;within&nbsp;bar<br>
width&nbsp;=&nbsp;data&nbsp;size&nbsp;(1,&nbsp;2,&nbsp;4&nbsp;or&nbsp;8&nbsp;bytes)</tt></dd></dl>
<dl><dt><a name="Gennum-write"><strong>write</strong></a>(self, bar, offset, width, datum)</dt><dd><tt>do&nbsp;a&nbsp;write&nbsp;by&nbsp;means&nbsp;of&nbsp;lseek+write<br>
&nbsp;<br>
bar&nbsp;=&nbsp;0,&nbsp;2,&nbsp;4&nbsp;(or&nbsp;c&nbsp;for&nbsp;DMA&nbsp;buffer&nbsp;access<br>
offset&nbsp;=&nbsp;address&nbsp;within&nbsp;bar<br>
width&nbsp;=&nbsp;data&nbsp;size&nbsp;(1,&nbsp;2,&nbsp;4&nbsp;or&nbsp;8&nbsp;bytes)<br>
datum&nbsp;=&nbsp;value&nbsp;to&nbsp;be&nbsp;written</tt></dd></dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<hr>
Data and other attributes defined here:<br>
<dl><dt><strong>device</strong> = '/dev/rawrabbit'</dl>
<dl><dt><strong>rrlib</strong> = './rrlib.so'</dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><strong>Plist</strong> = <a name="Plist">class c_long_Array_256</a>(<a href="_ctypes.html#Array">_ctypes.Array</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd>c_long_Array_256</dd>
<dd><a href="_ctypes.html#Array">_ctypes.Array</a></dd>
<dd>_ctypes._CData</dd>
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
</dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<hr>
Methods inherited from <a href="_ctypes.html#Array">_ctypes.Array</a>:<br>
<dl><dt><a name="c_long_Array_256-__delitem__"><strong>__delitem__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__delitem__">__delitem__</a>(y)&nbsp;&lt;==&gt;&nbsp;del&nbsp;x[y]</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__delslice__"><strong>__delslice__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__delslice__">__delslice__</a>(i,&nbsp;j)&nbsp;&lt;==&gt;&nbsp;del&nbsp;x[i:j]<br>
&nbsp;<br>
Use&nbsp;of&nbsp;negative&nbsp;indices&nbsp;is&nbsp;not&nbsp;supported.</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__getitem__">__getitem__</a>(y)&nbsp;&lt;==&gt;&nbsp;x[y]</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__getslice__">__getslice__</a>(i,&nbsp;j)&nbsp;&lt;==&gt;&nbsp;x[i:j]<br>
&nbsp;<br>
Use&nbsp;of&nbsp;negative&nbsp;indices&nbsp;is&nbsp;not&nbsp;supported.</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__init__">__init__</a>(...)&nbsp;initializes&nbsp;x;&nbsp;see&nbsp;x.__class__.__doc__&nbsp;for&nbsp;signature</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__len__"><strong>__len__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__len__">__len__</a>()&nbsp;&lt;==&gt;&nbsp;len(x)</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__setitem__"><strong>__setitem__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__setitem__">__setitem__</a>(i,&nbsp;y)&nbsp;&lt;==&gt;&nbsp;x[i]=y</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__setslice__"><strong>__setslice__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__setslice__">__setslice__</a>(i,&nbsp;j,&nbsp;y)&nbsp;&lt;==&gt;&nbsp;x[i:j]=y<br>
&nbsp;<br>
Use&nbsp;&nbsp;of&nbsp;negative&nbsp;indices&nbsp;is&nbsp;not&nbsp;supported.</tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="_ctypes.html#Array">_ctypes.Array</a>:<br>
<dl><dt><strong>__new__</strong> = &lt;built-in method __new__ of _ctypes.ArrayType object&gt;<dd><tt>T.<a href="#Plist-__new__">__new__</a>(S,&nbsp;...)&nbsp;-&gt;&nbsp;a&nbsp;new&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;with&nbsp;type&nbsp;S,&nbsp;a&nbsp;subtype&nbsp;of&nbsp;T</tt></dl>
<hr>
Methods inherited from _ctypes._CData:<br>
<dl><dt><a name="c_long_Array_256-__ctypes_from_outparam__"><strong>__ctypes_from_outparam__</strong></a>(...)</dt></dl>
<dl><dt><a name="c_long_Array_256-__hash__"><strong>__hash__</strong></a>(...)</dt><dd><tt>x.<a href="#Plist-__hash__">__hash__</a>()&nbsp;&lt;==&gt;&nbsp;hash(x)</tt></dd></dl>
<dl><dt><a name="c_long_Array_256-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
<dl><dt><a name="c_long_Array_256-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="RR_Devsel">class <strong>RR_Devsel</strong></a>(<a href="_ctypes.html#Structure">_ctypes.Structure</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="rr.html#RR_Devsel">RR_Devsel</a></dd>
<dd><a href="_ctypes.html#Structure">_ctypes.Structure</a></dd>
<dd>_ctypes._CData</dd>
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
</dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>bus</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>devfn</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>device</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>subdevice</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>subvendor</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>vendor</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<hr>
Methods inherited from <a href="_ctypes.html#Structure">_ctypes.Structure</a>:<br>
<dl><dt><a name="RR_Devsel-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#RR_Devsel-__init__">__init__</a>(...)&nbsp;initializes&nbsp;x;&nbsp;see&nbsp;x.__class__.__doc__&nbsp;for&nbsp;signature</tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="_ctypes.html#Structure">_ctypes.Structure</a>:<br>
<dl><dt><strong>__new__</strong> = &lt;built-in method __new__ of _ctypes.StructType object&gt;<dd><tt>T.<a href="#RR_Devsel-__new__">__new__</a>(S,&nbsp;...)&nbsp;-&gt;&nbsp;a&nbsp;new&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;with&nbsp;type&nbsp;S,&nbsp;a&nbsp;subtype&nbsp;of&nbsp;T</tt></dl>
<hr>
Methods inherited from _ctypes._CData:<br>
<dl><dt><a name="RR_Devsel-__ctypes_from_outparam__"><strong>__ctypes_from_outparam__</strong></a>(...)</dt></dl>
<dl><dt><a name="RR_Devsel-__hash__"><strong>__hash__</strong></a>(...)</dt><dd><tt>x.<a href="#RR_Devsel-__hash__">__hash__</a>()&nbsp;&lt;==&gt;&nbsp;hash(x)</tt></dd></dl>
<dl><dt><a name="RR_Devsel-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
<dl><dt><a name="RR_Devsel-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="RR_Iocmd">class <strong>RR_Iocmd</strong></a>(<a href="_ctypes.html#Structure">_ctypes.Structure</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="rr.html#RR_Iocmd">RR_Iocmd</a></dd>
<dd><a href="_ctypes.html#Structure">_ctypes.Structure</a></dd>
<dd>_ctypes._CData</dd>
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
</dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>address</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data16</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data32</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data64</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data8</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>datasize</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<hr>
Methods inherited from <a href="_ctypes.html#Structure">_ctypes.Structure</a>:<br>
<dl><dt><a name="RR_Iocmd-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#RR_Iocmd-__init__">__init__</a>(...)&nbsp;initializes&nbsp;x;&nbsp;see&nbsp;x.__class__.__doc__&nbsp;for&nbsp;signature</tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="_ctypes.html#Structure">_ctypes.Structure</a>:<br>
<dl><dt><strong>__new__</strong> = &lt;built-in method __new__ of _ctypes.StructType object&gt;<dd><tt>T.<a href="#RR_Iocmd-__new__">__new__</a>(S,&nbsp;...)&nbsp;-&gt;&nbsp;a&nbsp;new&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;with&nbsp;type&nbsp;S,&nbsp;a&nbsp;subtype&nbsp;of&nbsp;T</tt></dl>
<hr>
Methods inherited from _ctypes._CData:<br>
<dl><dt><a name="RR_Iocmd-__ctypes_from_outparam__"><strong>__ctypes_from_outparam__</strong></a>(...)</dt></dl>
<dl><dt><a name="RR_Iocmd-__hash__"><strong>__hash__</strong></a>(...)</dt><dd><tt>x.<a href="#RR_Iocmd-__hash__">__hash__</a>()&nbsp;&lt;==&gt;&nbsp;hash(x)</tt></dd></dl>
<dl><dt><a name="RR_Iocmd-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
<dl><dt><a name="RR_Iocmd-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="RR_U">class <strong>RR_U</strong></a>(<a href="_ctypes.html#Union">_ctypes.Union</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="rr.html#RR_U">RR_U</a></dd>
<dd><a href="_ctypes.html#Union">_ctypes.Union</a></dd>
<dd>_ctypes._CData</dd>
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
</dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>data16</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data32</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data64</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<dl><dt><strong>data8</strong></dt>
<dd><tt>Structure/Union&nbsp;member</tt></dd>
</dl>
<hr>
Methods inherited from <a href="_ctypes.html#Union">_ctypes.Union</a>:<br>
<dl><dt><a name="RR_U-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#RR_U-__init__">__init__</a>(...)&nbsp;initializes&nbsp;x;&nbsp;see&nbsp;x.__class__.__doc__&nbsp;for&nbsp;signature</tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="_ctypes.html#Union">_ctypes.Union</a>:<br>
<dl><dt><strong>__new__</strong> = &lt;built-in method __new__ of _ctypes.UnionType object&gt;<dd><tt>T.<a href="#RR_U-__new__">__new__</a>(S,&nbsp;...)&nbsp;-&gt;&nbsp;a&nbsp;new&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;with&nbsp;type&nbsp;S,&nbsp;a&nbsp;subtype&nbsp;of&nbsp;T</tt></dl>
<hr>
Methods inherited from _ctypes._CData:<br>
<dl><dt><a name="RR_U-__ctypes_from_outparam__"><strong>__ctypes_from_outparam__</strong></a>(...)</dt></dl>
<dl><dt><a name="RR_U-__hash__"><strong>__hash__</strong></a>(...)</dt><dd><tt>x.<a href="#RR_U-__hash__">__hash__</a>()&nbsp;&lt;==&gt;&nbsp;hash(x)</tt></dd></dl>
<dl><dt><a name="RR_U-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
<dl><dt><a name="RR_U-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#eeaa77">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-POINTER"><strong>POINTER</strong></a>(...)</dt></dl>
<dl><dt><a name="-addressof"><strong>addressof</strong></a>(...)</dt><dd><tt><a href="#-addressof">addressof</a>(C&nbsp;instance)&nbsp;-&gt;&nbsp;integer<br>
Return&nbsp;the&nbsp;address&nbsp;of&nbsp;the&nbsp;C&nbsp;instance&nbsp;internal&nbsp;buffer</tt></dd></dl>
<dl><dt><a name="-alignment"><strong>alignment</strong></a>(...)</dt><dd><tt><a href="#-alignment">alignment</a>(C&nbsp;type)&nbsp;-&gt;&nbsp;integer<br>
<a href="#-alignment">alignment</a>(C&nbsp;instance)&nbsp;-&gt;&nbsp;integer<br>
Return&nbsp;the&nbsp;alignment&nbsp;requirements&nbsp;of&nbsp;a&nbsp;C&nbsp;instance</tt></dd></dl>
<dl><dt><a name="-byref"><strong>byref</strong></a>(...)</dt><dd><tt><a href="#-byref">byref</a>(C&nbsp;instance[,&nbsp;offset=0])&nbsp;-&gt;&nbsp;byref-<a href="__builtin__.html#object">object</a><br>
Return&nbsp;a&nbsp;pointer&nbsp;lookalike&nbsp;to&nbsp;a&nbsp;C&nbsp;instance,&nbsp;only&nbsp;usable<br>
as&nbsp;function&nbsp;argument</tt></dd></dl>
<dl><dt><a name="-get_errno"><strong>get_errno</strong></a>(...)</dt></dl>
<dl><dt><a name="-pointer"><strong>pointer</strong></a>(...)</dt></dl>
<dl><dt><a name="-resize"><strong>resize</strong></a>(...)</dt><dd><tt>Resize&nbsp;the&nbsp;memory&nbsp;buffer&nbsp;of&nbsp;a&nbsp;ctypes&nbsp;instance</tt></dd></dl>
<dl><dt><a name="-set_conversion_mode"><strong>set_conversion_mode</strong></a>(...)</dt><dd><tt><a href="#-set_conversion_mode">set_conversion_mode</a>(encoding,&nbsp;errors)&nbsp;-&gt;&nbsp;(previous-encoding,&nbsp;previous-errors)<br>
&nbsp;<br>
Set&nbsp;the&nbsp;encoding&nbsp;and&nbsp;error&nbsp;handling&nbsp;ctypes&nbsp;uses&nbsp;when&nbsp;converting<br>
between&nbsp;unicode&nbsp;and&nbsp;strings.&nbsp;&nbsp;Returns&nbsp;the&nbsp;previous&nbsp;values.</tt></dd></dl>
<dl><dt><a name="-set_errno"><strong>set_errno</strong></a>(...)</dt></dl>
<dl><dt><a name="-sizeof"><strong>sizeof</strong></a>(...)</dt><dd><tt><a href="#-sizeof">sizeof</a>(C&nbsp;type)&nbsp;-&gt;&nbsp;integer<br>
<a href="#-sizeof">sizeof</a>(C&nbsp;instance)&nbsp;-&gt;&nbsp;integer<br>
Return&nbsp;the&nbsp;size&nbsp;in&nbsp;bytes&nbsp;of&nbsp;a&nbsp;C&nbsp;instance</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>DEFAULT_MODE</strong> = 0<br>
<strong>RR_BAR_0</strong> = 0<br>
<strong>RR_BAR_2</strong> = 536870912<br>
<strong>RR_BAR_4</strong> = 1073741824<br>
<strong>RR_BAR_BUF</strong> = 3221225472L<br>
<strong>RR_DEFAULT_DEVICE</strong> = 4<br>
<strong>RR_DEFAULT_VENDOR</strong> = 6713<br>
<strong>RR_DEVSEL_UNUSED</strong> = 65535<br>
<strong>RTLD_GLOBAL</strong> = 256<br>
<strong>RTLD_LOCAL</strong> = 0<br>
<strong>bar_map</strong> = {0: 0, 2: 536870912, 4: 1073741824, 12: 3221225472L}<br>
<strong>cdll</strong> = &lt;ctypes.LibraryLoader object&gt;<br>
<strong>fmt</strong> = {1: 'B', 2: 'H', 4: 'I', 8: 'L'}<br>
<strong>memmove</strong> = &lt;CFunctionType object&gt;<br>
<strong>memset</strong> = &lt;CFunctionType object&gt;<br>
<strong>pydll</strong> = &lt;ctypes.LibraryLoader object&gt;<br>
<strong>pythonapi</strong> = &lt;PyDLL 'None', handle b78398f8 at b73dd0ac&gt;</td></tr></table>
</body></html>
\ No newline at end of file
#! /usr/bin/env python
# :vi:ts=4 sw=4 et
from ctypes import *
import os, errno, re, sys, struct
# unsigned formats to unpack words
fmt = { 1: 'B', 2: 'H', 4: 'I', 8: 'L' }
# some defaults from rawrabbit.h
RR_DEVSEL_UNUSED = 0xffff
RR_DEFAULT_VENDOR = 0x1a39
RR_DEFAULT_DEVICE = 0x0004
RR_BAR_0 = 0x00000000
RR_BAR_2 = 0x20000000
RR_BAR_4 = 0x40000000
RR_BAR_BUF = 0xc0000000
bar_map = {
0 : RR_BAR_0,
2: RR_BAR_2,
4: RR_BAR_4,
0xc: RR_BAR_BUF }
# classes to interface with the driver via ctypes
Plist = c_int * 256
class RR_Devsel(Structure):
_fields_ = [
("vendor", c_ushort),
("device", c_ushort),
("subvendor", c_ushort),
("subdevice", c_ushort),
("bus", c_ushort),
("devfn", c_ushort),
]
class RR_U(Union):
_fields_ = [
("data8", c_ubyte),
("data16", c_ushort),
("data32", c_uint),
("data64", c_ulonglong),
]
class RR_Iocmd(Structure):
_anonymous_ = [ "data", ]
_fields_ = [
("address", c_uint),
("datasize", c_uint),
("data", RR_U),
]
class Gennum(object):
device = '/dev/rawrabbit'
rrlib = './rrlib.so'
def __init__(self):
"""get a file descriptor for the Gennum device"""
self.lib = CDLL(Gennum.rrlib)
self.fd = os.open(Gennum.device, os.O_RDWR)
def iread(self, bar, offset, width):
"""do a read by means of the ioctl interface
bar = 0, 2, 4 (or c for DMA buffer access
offset = address within bar
width = data size (1, 2, 4 or 8 bytes)
"""
address = bar_map[bar] + offset
ds = RR_Iocmd(address=address, datasize=width)
print self.lib.rr_read(self.fd, byref(ds))
return ds.data32
def read(self, bar, offset, width):
"""do a read by means of lseek+read
bar = 0, 2, 4 (or c for DMA buffer access
offset = address within bar
width = data size (1, 2, 4 or 8 bytes)
"""
address = bar_map[bar] + offset
os.lseek(self.fd, address, os.SEEK_SET)
buf = os.read(self.fd, width)
return struct.unpack(fmt[width], buf)[0]
def iwrite(self, bar, offset, width, datum):
"""do a write by means of the ioctl interface
bar = 0, 2, 4 (or c for DMA buffer access
offset = address within bar
width = data size (1, 2, 4 or 8 bytes)
datum = value to be written
"""
address = bar_map[bar] + offset
ds = RR_Iocmd(address=address, datasize=width, data32=datum)
print self.lib.rr_iwrite(self.fd, byref(ds))
return ds.data32
def write(self, bar, offset, width, datum):
"""do a write by means of lseek+write
bar = 0, 2, 4 (or c for DMA buffer access
offset = address within bar
width = data size (1, 2, 4 or 8 bytes)
datum = value to be written
"""
address = bar_map[bar] + offset
os.lseek(self.fd, address, os.SEEK_SET)
return os.write(self.fd, struct.pack(fmt[width], datum))
def irqwait(self):
"""wait for an interrupt"""
return self.lib.rr_irqwait(self.fd);
def irqena(self):
"""enable the interrupt line"""
return self.lib.rr_irqena(self.fd);
def getdmasize(self):
"""return the size of the allocated DMA buffer (in bytes)"""
return self.lib.rr_getdmasize(self.fd);
def getplist(self):
"""get a list of pages for DMA access
The addresses returned, shifted by 12 bits, give the physical
addresses of the allocated pages
"""
plist = Plist()
self.lib.rr_getplist(self.fd, plist);
return plist
def info(self):
"""get a string describing the interface the driver is bound to
The syntax of the string is
vendor:device/dubvendor:subdevice@bus:devfn
"""
ds = RR_Devsel()
self.errno = self.lib.rr_devget(self.fd, byref(ds))
for key in RR_Devsel._fields_:
setattr(self, key[0], getattr(ds, key[0], RR_DEVSEL_UNUSED))
return '%04x:%04x/%04x:%04x@%04x:%04x' % (
ds.vendor, ds.device,
ds.subvendor, ds.subdevice,
ds.bus, ds.devfn)
def parse_addr(self, addr):
"""take a string of the form
vendor:device[/subvendor:subdevice][@bus:devfn]
and return a dictionary object with the corresponding values,
initialized to RR_DEVSEL_UNUSED when absent
"""
# address format
reg = ( r'(?i)^'
r'(?P<vendor>[a-f0-9]{1,4}):(?P<device>[a-f0-9]{1,4})'
r'(/(?P<subvendor>[a-f0-9]{1,4}):(?P<subdevice>[a-f0-9]{1,4}))?'
r'(@(?P<bus>[a-f0-9]{1,4}):(?P<devfn>[a-f0-9]{1,4}))?$' )
match = re.match(reg, addr).groupdict()
if not 'sub' in match:
match['subvendor'] = match['subdevice'] = RR_DEVSEL_UNUSED
if not 'geo' in match:
match['bus'] = match['devfn'] = RR_DEVSEL_UNUSED
for k, v in match.items():
if type(v) is str:
match[k] = int(v, 16)
return match
def bind(self, device):
"""bind the rawrabbit driver to a device
The device is specified with a syntax described in parse_addr
"""
d = self.parse_addr(device)
ds = RR_Devsel(**d)
self.errno = self.lib.rr_devsel(self.fd, byref(ds))
return self.errno
if __name__ == '__main__':
g = Gennum()
print g.parse_addr('1a39:0004/1a39:0004@0020:0000')
print g.bind('1a39:0004/1a39:0004@0020:0000')
print '%x' % g.write(bar=RR_BAR_4, offset=0xa08, width=4, datum=0xdeadface)
print '%x' % g.read(bar=RR_BAR_4, offset=0xa08, width=4)
print g.getdmasize()
for page in g.getplist():
print '%08x ' % (page<<12),
#! /usr/bin/env python
# coding: utf8
import rr
import cmd
class RrCmd(cmd.Cmd):
def preloop(self):
print 'Initializing...'
self.gennum = rr.Gennum()
self.do_info('')
self.prompt = 'rr> '
def do_info(self, args):
print 'bound to ' , self.gennum.info()
def do_bind(self, args):
self.gennum.bind(args)
print 'bound to ' , self.gennum.info()
def do_irqwait(self, args):
self.gennum.irqwait()
def do_read(self, args):
try:
size, bar, offset = args.split()
size = int(size)
bar = int(bar)
offset = int(offset, 16)
except ValueError:
print "syntax: read size bar address"
return
print hex(self.gennum.read(bar, offset, size))
def do_write(self, args):
try:
size, bar, offset, datum = args.split()
size = int(size)
bar = int(bar)
offset = int(offset, 16)
datum = int(datum, 16)
except ValueError:
print "syntax: write size bar address datum"
return
self.gennum.write(bar, offset, size, datum)
def do_irqena(self, args):
self.gennum.irqena()
def do_getdmasize(self, args):
print hex(self.gennum.getdmasize())
def do_getplist(self, args):
plist = self.gennum.getplist()
width = 8
for i, addr in enumerate(plist):
if i % width == 0:
print '%08x ' % i,
addr <<= 12
print '%08x ' % addr,
if i % width == width-1:
print
else:
if i % width != width-1:
print
def emptyline(self):
pass
def do_EOF(self, args):
return True
do_quit = do_exit = do_EOF
if __name__ == '__main__':
gennum = rr.Gennum()
cmd = RrCmd()
cmd.cmdloop()
#include <sys/ioctl.h>
#include <errno.h>
#include <stdint.h>
#include <fcntl.h>
#include <rawrabbit.h>
#include <stdio.h>
int rr_devsel(int fd, struct rr_devsel *ds)
{
if (ioctl(fd, RR_DEVSEL, ds) < 0)
return -errno;
return 0;
}
int rr_devget(int fd, struct rr_devsel *ds)
{
if (ioctl(fd, RR_DEVGET, ds) < 0)
return -errno;
return 0;
}
int rr_iread(int fd, struct rr_iocmd *iocmd)
{
if (ioctl(fd, RR_READ, iocmd) < 0)
return -errno;
return 0;
}
int rr_iwrite(int fd, struct rr_iocmd *iocmd)
{
if (ioctl(fd, RR_WRITE, iocmd) < 0)
return -errno;
return 0;
}
int rr_irqwait(int fd)
{
if (ioctl(fd, RR_IRQWAIT) < 0)
return -errno;
return 0;
}
int rr_irqena(int fd)
{
if (ioctl(fd, RR_IRQENA) < 0)
return -errno;
return 0;
}
int rr_getdmasize(int fd)
{
return ioctl(fd, RR_GETDMASIZE);
}
int rr_getplist(int fd, uintptr_t *plist)
{
int i, size;
size = ioctl(fd, RR_GETDMASIZE);
if (size < 0)
return -errno;
i = ioctl(fd, RR_GETPLIST, plist);
if (i < 0)
return -errno;
return 0;
}
int main(int argc, char *argv[])
{
struct rr_iocmd cmd, *cmdp = &cmd;
int ret;
int fd = open("/dev/rawrabbit", O_RDWR);
printf("fd = %d\n", fd);
cmdp->address = 0x40000a08;
cmdp->datasize = 4;
cmdp->data32 = 0xdeadface;
cmdp->data32 = 0x00000000;
ret = rr_iread(fd, cmdp);
printf("ret = %d, errno = %d\n", ret, errno);
printf("0x%08x 0x%08x 0x%08x\n", cmdp->address, cmdp->datasize, cmdp->data32);
return 0;
}
#include <rawrabbit.h>
int rr_devsel(int fd, struct rr_devsel *ds);
int rr_devget(int fd, struct rr_devsel *ds);
int rr_read(int fd, struct rr_iocmd *iocmd);
int rr_write(int fd, struct rr_iocmd *iocmd);
int rr_irqwait(int fd);
int rr_irqena(int fd);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment