port 0.9.0-x86-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README ADDED
@@ -0,0 +1,40 @@
1
+ = Installation
2
+
3
+ === Installing from a gem
4
+ gem install port
5
+
6
+ === Manual installation -- if you have rake.
7
+ rake
8
+ sudo rake install
9
+
10
+ To uninstall: sudo rake uninstall
11
+
12
+ === Manual installation -- if you do NOT have rake.
13
+ change directory to ext sub-directory.
14
+ ruby extconf.rb -> generates the Makefile.
15
+ make -> compiles the extension. Requires gcc .
16
+ copy port.so to:
17
+ /usr/lib/ruby/site_ruby/1.8/i386-linux
18
+ or another path in your ruby $LOAD_PATH .
19
+
20
+ == Usage
21
+ If installed via gem:
22
+ require 'rubygems'
23
+ require 'port'
24
+
25
+ otherwise
26
+ require 'port'
27
+ will suffice.
28
+
29
+ == Example
30
+ For an example run. time.rb as follows:
31
+ sudo ./time.rb
32
+
33
+ time.rb is in the example sub-directory. This requires root permissions to access the IO ports.
34
+
35
+ time.rb listing:
36
+ :include:example/time.rb
37
+
38
+ == Who wrote port?
39
+ Port was written by Loh Siu Yin <siuyin@beyondbroadcast.com> as he needed to
40
+ control external hardware devices and he wanted to do it from ruby.
data/Rakefile ADDED
@@ -0,0 +1,94 @@
1
+ require 'rubygems'
2
+ require 'rake/rdoctask'
3
+ require 'rake/gempackagetask'
4
+
5
+ task(:default => [:build])
6
+ task :package => :build
7
+ task :build => :rdoc
8
+
9
+ spec = Gem::Specification.new do |s|
10
+ s.name = 'port'
11
+ s.version = '0.9.0'
12
+ s.files = FileList['README','doc/**/*',
13
+ 'Rakefile','ext/**/*','example/**/*'].to_a
14
+ s.summary = "Low-level port access from ruby on Linux."
15
+ s.has_rdoc=true
16
+ s.author="Loh Siu Yin"
17
+ s.email="siuyin@beyondbroadcast.com"
18
+ s.homepage="http://port.rubyforge.org/"
19
+ s.extensions.push 'ext/extconf.rb'
20
+ s.require_paths.push 'ext'
21
+ s.platform=Gem::Platform::CURRENT
22
+ s.rdoc_options << '--title' << 'Port - low-level port access for Linux.' <<
23
+ '--main' << 'Port' << '-S'
24
+ s.extra_rdoc_files = ['README']
25
+ s.requirements=['1. A linux x86 system.',
26
+ '2. gcc - the GNU C compiler must be installed.']
27
+ s.rubyforge_project = 'port'
28
+ end
29
+
30
+ Rake::GemPackageTask.new(spec) { |pkg|
31
+ pkg.need_tar=true
32
+ pkg.need_zip=false
33
+ }
34
+
35
+ Rake::RDocTask.new do |d|
36
+ d.title='Port - low-level port access for Linux.'
37
+ d.template='jamis.rb'
38
+ d.options= [ "-mPort", '-S']
39
+ d.rdoc_dir='doc'
40
+ d.rdoc_files.include("ext/port.c", "README")
41
+ end
42
+
43
+ desc "Clean out build artifacts."
44
+ #task :clean do
45
+ # sh "rm -rf lib/port.so lib/Makefile lib/port.o pkg port.o port.so Makefile doc"
46
+ #end
47
+ task(:clean) {
48
+ sh "rm -rf doc pkg"
49
+ Dir.chdir 'ext'
50
+ sh "rake clean"
51
+ Dir.chdir '..'
52
+ }
53
+
54
+ task(:build) {
55
+ Dir.chdir 'ext'
56
+ sh "rake"
57
+ Dir.chdir '..'
58
+ }
59
+
60
+ desc "Check for root permission."
61
+ task :root? do
62
+ ret = false
63
+ if Process::Sys.getuid == 0
64
+ ret = true
65
+ else
66
+ puts "*** ERROR: Root permissions required."
67
+ puts "run sudo rake #{ARGV[0]}"
68
+ exit
69
+ end
70
+ ret
71
+ end
72
+
73
+ desc "Install the port.so extension."
74
+ task :install => [:build,:root?] do
75
+ install_path = $LOAD_PATH.reject {|e| !e.include?('site') || !e.include?('linux')}.first
76
+ puts "installing to: #{install_path}"
77
+ sh "cp ext/port.so #{install_path}"
78
+ end
79
+
80
+ desc "Uninstall the port.so extension."
81
+ task :uninstall => :root? do
82
+ install_path = $LOAD_PATH.reject {|e| !e.include?('site') || !e.include?('linux')}.first
83
+ target = install_path + '/port.so'
84
+ if File.exists?(target)
85
+ sh "rm #{target}"
86
+ puts "port.so extension uninstalled."
87
+ end
88
+ end
89
+
90
+ desc "Sync doc with web-page at rubyforge.org."
91
+ task :syncdoc => :rdoc do
92
+ sh "rsync --delete --exclude .svn -avz doc/ siuyin@rubyforge.org:/var/www/gforge-projects/port/doc"
93
+ sh "rsync index.html siuyin@rubyforge.org:/var/www/gforge-projects/port/index.html"
94
+ end
@@ -0,0 +1,232 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html>
6
+ <head>
7
+ <title>Class: Port</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
10
+
11
+ <script language="JavaScript" type="text/javascript">
12
+ // <![CDATA[
13
+
14
+ function toggleSource( id )
15
+ {
16
+ var elem
17
+ var link
18
+
19
+ if( document.getElementById )
20
+ {
21
+ elem = document.getElementById( id )
22
+ link = document.getElementById( "l_" + id )
23
+ }
24
+ else if ( document.all )
25
+ {
26
+ elem = eval( "document.all." + id )
27
+ link = eval( "document.all.l_" + id )
28
+ }
29
+ else
30
+ return false;
31
+
32
+ if( elem.style.display == "block" )
33
+ {
34
+ elem.style.display = "none"
35
+ link.innerHTML = "show source"
36
+ }
37
+ else
38
+ {
39
+ elem.style.display = "block"
40
+ link.innerHTML = "hide source"
41
+ }
42
+ }
43
+
44
+ function openCode( url )
45
+ {
46
+ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
47
+ }
48
+ // ]]>
49
+ </script>
50
+ </head>
51
+
52
+ <body>
53
+ <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
54
+ <td class="file-title"><span class="file-title-prefix">Class</span><br />Port</td>
55
+ <td align="right">
56
+ <table cellspacing=0 cellpadding=2>
57
+ <tr valign="top">
58
+ <td>In:</td>
59
+ <td>
60
+ <a href="../files/ext/port_c.html">ext/port.c</a>
61
+ </td>
62
+ </tr>
63
+ <tr>
64
+ <td>Parent:</td>
65
+ <td>
66
+ Object
67
+ </td>
68
+ </tr>
69
+ </table>
70
+ </td>
71
+ </tr>
72
+ </table>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+ <div id="content">
77
+
78
+ <div class="description"><p>
79
+ <a href="Port.html">Port</a> - Ruby extension to provide low-level access
80
+ to IO ports on an x86 GNU/Linux system.
81
+ </p>
82
+ <p>
83
+ License: GPL v2 or (at your option) any later version. See <a
84
+ href="http://www.fsf.org/licensing">www.fsf.org/licensing</a> .
85
+ </p>
86
+ <p>
87
+ Copyright (C) 2008, Loh Siu Yin (siuyin@beyondbroadcast.com)
88
+ </p>
89
+ <p>
90
+ IMPORTANT NOTE: These routines require root privilege.
91
+ </p>
92
+ <pre>
93
+ Use:
94
+ sudo &lt;your_ruby_program&gt; or
95
+ su -l root, then run your_ruby_program.
96
+ </pre>
97
+ <p>
98
+ The <a href="../files/README.html">README</a> file provides further
99
+ details.
100
+ </p>
101
+ </div>
102
+
103
+
104
+
105
+ <div class="sectiontitle">Methods</div>
106
+ <ul>
107
+ <li><a href="#M000002">inb</a></li>
108
+ <li><a href="#M000001">iopl</a></li>
109
+ <li><a href="#M000003">outb</a></li>
110
+ </ul>
111
+
112
+
113
+
114
+
115
+
116
+
117
+ <div class="sectiontitle">Public Class methods</div>
118
+ <div class="method">
119
+ <div class="title">
120
+ <a name="M000002"></a><b>inb</b>(p1)
121
+ </div>
122
+ <div class="description">
123
+ <p>
124
+ <a href="Port.html#M000002">inb</a> - read a byte from a port.
125
+ </p>
126
+ <p>
127
+ Example:
128
+ </p>
129
+ <pre>
130
+ require 'rubygems'
131
+ require 'port'
132
+ my_byte_from_port_hex_71 = Port.inb(0x71)
133
+ </pre>
134
+ </div>
135
+ <div class="sourcecode">
136
+ <p class="source-link">[ <a href="javascript:toggleSource('M000002_source')" id="l_M000002_source">show source</a> ]</p>
137
+ <div id="M000002_source" class="dyn-source">
138
+ <pre>
139
+ /* inb - read a byte from a port.
140
+ *
141
+ * Example:
142
+ * require 'rubygems'
143
+ * require 'port'
144
+ * my_byte_from_port_hex_71 = Port.inb(0x71)
145
+ */
146
+ static VALUE
147
+ p_inb(VALUE self, VALUE port) {
148
+
149
+ </pre>
150
+ </div>
151
+ </div>
152
+ </div>
153
+ <div class="method">
154
+ <div class="title">
155
+ <a name="M000001"></a><b>iopl</b>(p1)
156
+ </div>
157
+ <div class="description">
158
+ <p>
159
+ <a href="Port.html#M000001">iopl</a> - set IO permission level. A level of
160
+ 3 is required for full read/write access to all ports.
161
+ </p>
162
+ <p>
163
+ Example:
164
+ </p>
165
+ <pre>
166
+ require 'rubygems'
167
+ require 'port'
168
+ Port.iopl(3)
169
+ </pre>
170
+ </div>
171
+ <div class="sourcecode">
172
+ <p class="source-link">[ <a href="javascript:toggleSource('M000001_source')" id="l_M000001_source">show source</a> ]</p>
173
+ <div id="M000001_source" class="dyn-source">
174
+ <pre>
175
+ /* iopl - set IO permission level.
176
+ * A level of 3 is required for full read/write access to all ports.
177
+ *
178
+ * Example:
179
+ * require 'rubygems'
180
+ * require 'port'
181
+ * Port.iopl(3)
182
+ */
183
+ static VALUE
184
+ p_iopl(VALUE self, VALUE level) {
185
+
186
+ </pre>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ <div class="method">
191
+ <div class="title">
192
+ <a name="M000003"></a><b>outb</b>(p1, p2)
193
+ </div>
194
+ <div class="description">
195
+ <p>
196
+ <a href="Port.html#M000003">outb</a> - write a byte to a port. Usage <a
197
+ href="Port.html#M000003">outb</a>(value,port)
198
+ </p>
199
+ <p>
200
+ Example: Setting port 0x71 to 123.
201
+ </p>
202
+ <pre>
203
+ require 'rubygems'
204
+ require 'port'
205
+ Port.outb(123,0x71)
206
+ </pre>
207
+ </div>
208
+ <div class="sourcecode">
209
+ <p class="source-link">[ <a href="javascript:toggleSource('M000003_source')" id="l_M000003_source">show source</a> ]</p>
210
+ <div id="M000003_source" class="dyn-source">
211
+ <pre>
212
+ /* outb - write a byte to a port.
213
+ * Usage outb(value,port)
214
+ *
215
+ * Example: Setting port 0x71 to 123.
216
+ * require 'rubygems'
217
+ * require 'port'
218
+ * Port.outb(123,0x71)
219
+ */
220
+ static VALUE
221
+ p_outb(VALUE self, VALUE num, VALUE port) {
222
+
223
+ </pre>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+
229
+ </div>
230
+
231
+ </body>
232
+ </html>
data/doc/created.rid ADDED
@@ -0,0 +1 @@
1
+ Thu Oct 30 16:07:40 +0800 2008
@@ -0,0 +1,175 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html>
6
+ <head>
7
+ <title>File: README</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
10
+
11
+ <script language="JavaScript" type="text/javascript">
12
+ // <![CDATA[
13
+
14
+ function toggleSource( id )
15
+ {
16
+ var elem
17
+ var link
18
+
19
+ if( document.getElementById )
20
+ {
21
+ elem = document.getElementById( id )
22
+ link = document.getElementById( "l_" + id )
23
+ }
24
+ else if ( document.all )
25
+ {
26
+ elem = eval( "document.all." + id )
27
+ link = eval( "document.all.l_" + id )
28
+ }
29
+ else
30
+ return false;
31
+
32
+ if( elem.style.display == "block" )
33
+ {
34
+ elem.style.display = "none"
35
+ link.innerHTML = "show source"
36
+ }
37
+ else
38
+ {
39
+ elem.style.display = "block"
40
+ link.innerHTML = "hide source"
41
+ }
42
+ }
43
+
44
+ function openCode( url )
45
+ {
46
+ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
47
+ }
48
+ // ]]>
49
+ </script>
50
+ </head>
51
+
52
+ <body>
53
+ <table border='0' cellpadding='0' cellspacing='0' width="100%" class='banner'>
54
+ <tr><td>
55
+ <table width="100%" border='0' cellpadding='0' cellspacing='0'><tr>
56
+ <td class="file-title" colspan="2"><span class="file-title-prefix">File</span><br />README</td>
57
+ <td align="right">
58
+ <table border='0' cellspacing="0" cellpadding="2">
59
+ <tr>
60
+ <td>Path:</td>
61
+ <td>README
62
+ </td>
63
+ </tr>
64
+ <tr>
65
+ <td>Modified:</td>
66
+ <td>Thu Oct 30 16:00:46 +0800 2008</td>
67
+ </tr>
68
+ </table>
69
+ </td></tr>
70
+ </table>
71
+ </td></tr>
72
+ </table><br>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+ <div id="content">
77
+
78
+ <div class="description"><h1>Installation</h1>
79
+ <h3>Installing from a gem</h3>
80
+ <p>
81
+ gem install port
82
+ </p>
83
+ <h3>Manual installation &#8212; if you have rake.</h3>
84
+ <pre>
85
+ rake
86
+ sudo rake install
87
+
88
+ To uninstall: sudo rake uninstall
89
+ </pre>
90
+ <h3>Manual installation &#8212; if you do NOT have rake.</h3>
91
+ <pre>
92
+ change directory to ext sub-directory.
93
+ ruby extconf.rb -&gt; generates the Makefile.
94
+ make -&gt; compiles the extension. Requires gcc .
95
+ copy port.so to:
96
+ /usr/lib/ruby/site_ruby/1.8/i386-linux
97
+ or another path in your ruby $LOAD_PATH .
98
+ </pre>
99
+ <h2>Usage</h2>
100
+ <p>
101
+ If installed via gem:
102
+ </p>
103
+ <pre>
104
+ require 'rubygems'
105
+ require 'port'
106
+ </pre>
107
+ <p>
108
+ otherwise
109
+ </p>
110
+ <pre>
111
+ require 'port'
112
+ </pre>
113
+ <p>
114
+ will suffice.
115
+ </p>
116
+ <h2>Example</h2>
117
+ <p>
118
+ For an example run. time.rb as follows:
119
+ </p>
120
+ <pre>
121
+ sudo ./time.rb
122
+ </pre>
123
+ <p>
124
+ time.rb is in the example sub-directory. This requires root permissions to
125
+ access the IO ports.
126
+ </p>
127
+ <p>
128
+ time.rb listing:
129
+ </p>
130
+ <pre>
131
+ #!/usr/bin/env ruby
132
+
133
+ # IMPORTANT REMINDER: Yon need root authority / privilege
134
+ # to run the following.
135
+
136
+ require 'rubygems'
137
+ require 'port'
138
+
139
+ # Set IO permission level to 3 - i.e. read/write all ports.
140
+ # Set Real-Time Clock register 0x70 to 0,2,4 to read ss,hh,mm
141
+ Port.iopl 3
142
+
143
+ Port.outb 4, 0x70
144
+ hh = Port.inb 0x71
145
+
146
+ Port.outb 2, 0x70
147
+ mm = Port.inb 0x71
148
+
149
+ Port.outb 0, 0x70
150
+ ss = Port.inb 0x71
151
+
152
+ printf(&quot;Real-Time Clock time is %02x:%02x:%02x\n&quot;, hh,mm,ss)
153
+ </pre>
154
+ <h2>Who wrote port?</h2>
155
+ <p>
156
+ <a href="../classes/Port.html">Port</a> was written by Loh Siu Yin
157
+ &lt;siuyin@beyondbroadcast.com&gt; as he needed to control external
158
+ hardware devices and he wanted to do it from ruby.
159
+ </p>
160
+ </div>
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+ </div>
171
+
172
+ </div>
173
+
174
+ </body>
175
+ </html>
@@ -0,0 +1,92 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html>
6
+ <head>
7
+ <title>File: port.c</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
10
+
11
+ <script language="JavaScript" type="text/javascript">
12
+ // <![CDATA[
13
+
14
+ function toggleSource( id )
15
+ {
16
+ var elem
17
+ var link
18
+
19
+ if( document.getElementById )
20
+ {
21
+ elem = document.getElementById( id )
22
+ link = document.getElementById( "l_" + id )
23
+ }
24
+ else if ( document.all )
25
+ {
26
+ elem = eval( "document.all." + id )
27
+ link = eval( "document.all.l_" + id )
28
+ }
29
+ else
30
+ return false;
31
+
32
+ if( elem.style.display == "block" )
33
+ {
34
+ elem.style.display = "none"
35
+ link.innerHTML = "show source"
36
+ }
37
+ else
38
+ {
39
+ elem.style.display = "block"
40
+ link.innerHTML = "hide source"
41
+ }
42
+ }
43
+
44
+ function openCode( url )
45
+ {
46
+ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
47
+ }
48
+ // ]]>
49
+ </script>
50
+ </head>
51
+
52
+ <body>
53
+ <table border='0' cellpadding='0' cellspacing='0' width="100%" class='banner'>
54
+ <tr><td>
55
+ <table width="100%" border='0' cellpadding='0' cellspacing='0'><tr>
56
+ <td class="file-title" colspan="2"><span class="file-title-prefix">File</span><br />port.c</td>
57
+ <td align="right">
58
+ <table border='0' cellspacing="0" cellpadding="2">
59
+ <tr>
60
+ <td>Path:</td>
61
+ <td>ext/port.c
62
+ </td>
63
+ </tr>
64
+ <tr>
65
+ <td>Modified:</td>
66
+ <td>Thu Oct 30 16:07:34 +0800 2008</td>
67
+ </tr>
68
+ </table>
69
+ </td></tr>
70
+ </table>
71
+ </td></tr>
72
+ </table><br>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+ <div id="content">
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+ </div>
88
+
89
+ </div>
90
+
91
+ </body>
92
+ </html>
@@ -0,0 +1,46 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html>
6
+ <head>
7
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
8
+ <style>
9
+ <!--
10
+ body {
11
+ background-color: #EEE;
12
+ font-family: "Bitstream Vera Sans", Verdana, Arial, Helvetica, sans-serif;
13
+ color: #000;
14
+ margin: 0px;
15
+ }
16
+ .banner {
17
+ background: #005;
18
+ color: #FFF;
19
+ padding: 0.2em;
20
+ font-size: small;
21
+ font-weight: bold;
22
+ text-align: center;
23
+ }
24
+ .entries {
25
+ margin: 0.25em 1em 0 1em;
26
+ font-size: x-small;
27
+ }
28
+ a {
29
+ color: #00F;
30
+ text-decoration: none;
31
+ white-space: nowrap;
32
+ }
33
+ a:hover {
34
+ color: #77F;
35
+ text-decoration: underline;
36
+ }
37
+ -->
38
+ </style>
39
+ <base target="docwin">
40
+ </head>
41
+ <body>
42
+ <div class="banner">Classes</div>
43
+ <div class="entries">
44
+ <a href="classes/Port.html">Port</a><br>
45
+ </div>
46
+ </body></html>
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html>
6
+ <head>
7
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
8
+ <style>
9
+ <!--
10
+ body {
11
+ background-color: #EEE;
12
+ font-family: "Bitstream Vera Sans", Verdana, Arial, Helvetica, sans-serif;
13
+ color: #000;
14
+ margin: 0px;
15
+ }
16
+ .banner {
17
+ background: #005;
18
+ color: #FFF;
19
+ padding: 0.2em;
20
+ font-size: small;
21
+ font-weight: bold;
22
+ text-align: center;
23
+ }
24
+ .entries {
25
+ margin: 0.25em 1em 0 1em;
26
+ font-size: x-small;
27
+ }
28
+ a {
29
+ color: #00F;
30
+ text-decoration: none;
31
+ white-space: nowrap;
32
+ }
33
+ a:hover {
34
+ color: #77F;
35
+ text-decoration: underline;
36
+ }
37
+ -->
38
+ </style>
39
+ <base target="docwin">
40
+ </head>
41
+ <body>
42
+ <div class="banner">Files</div>
43
+ <div class="entries">
44
+ <a href="files/README.html">README</a><br>
45
+ <a href="files/ext/port_c.html">ext/port.c</a><br>
46
+ </div>
47
+ </body></html>
@@ -0,0 +1,48 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html>
6
+ <head>
7
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
8
+ <style>
9
+ <!--
10
+ body {
11
+ background-color: #EEE;
12
+ font-family: "Bitstream Vera Sans", Verdana, Arial, Helvetica, sans-serif;
13
+ color: #000;
14
+ margin: 0px;
15
+ }
16
+ .banner {
17
+ background: #005;
18
+ color: #FFF;
19
+ padding: 0.2em;
20
+ font-size: small;
21
+ font-weight: bold;
22
+ text-align: center;
23
+ }
24
+ .entries {
25
+ margin: 0.25em 1em 0 1em;
26
+ font-size: x-small;
27
+ }
28
+ a {
29
+ color: #00F;
30
+ text-decoration: none;
31
+ white-space: nowrap;
32
+ }
33
+ a:hover {
34
+ color: #77F;
35
+ text-decoration: underline;
36
+ }
37
+ -->
38
+ </style>
39
+ <base target="docwin">
40
+ </head>
41
+ <body>
42
+ <div class="banner">Methods</div>
43
+ <div class="entries">
44
+ <a href="classes/Port.html#M000002">inb (Port)</a><br>
45
+ <a href="classes/Port.html#M000001">iopl (Port)</a><br>
46
+ <a href="classes/Port.html#M000003">outb (Port)</a><br>
47
+ </div>
48
+ </body></html>
data/doc/index.html ADDED
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
+ <head>
7
+ <title>Port - low-level port access for Linux.</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
9
+ </head>
10
+
11
+ <frameset cols="20%,*">
12
+ <frameset rows="15%,35%,50%">
13
+ <frame src="fr_file_index.html" title="Files" name="Files" />
14
+ <frame src="fr_class_index.html" name="Classes" />
15
+ <frame src="fr_method_index.html" name="Methods" />
16
+ </frameset>
17
+ <frame src="classes/Port.html" name="docwin">
18
+ </frameset>
19
+
20
+ </html>
@@ -0,0 +1,175 @@
1
+ a {
2
+ color: #00F;
3
+ text-decoration: none;
4
+ }
5
+
6
+ a:hover {
7
+ color: #77F;
8
+ text-decoration: underline;
9
+ }
10
+
11
+ body, td, p {
12
+ font-family: "Bitstream Vera Sans", Verdana, Arial, Helvetica, sans-serif;
13
+ background: #FFF;
14
+ color: #000;
15
+ margin: 0px;
16
+ font-size: 99%;
17
+ }
18
+
19
+ #content {
20
+ margin: 2em;
21
+ }
22
+
23
+ #description p {
24
+ margin-bottom: 0.5em;
25
+ }
26
+
27
+ .sectiontitle {
28
+ margin-top: 1em;
29
+ margin-bottom: 1em;
30
+ padding: 0.5em;
31
+ padding-left: 2em;
32
+ background: #005;
33
+ color: #FFF;
34
+ font-weight: bold;
35
+ border: 1px dotted black;
36
+ }
37
+
38
+ .attr-rw {
39
+ padding-left: 1em;
40
+ padding-right: 1em;
41
+ text-align: center;
42
+ color: #055;
43
+ }
44
+
45
+ .attr-name {
46
+ font-weight: bold;
47
+ }
48
+
49
+ .attr-desc {
50
+ }
51
+
52
+ .attr-value {
53
+ font-family: monospace;
54
+ }
55
+
56
+ .file-title-prefix {
57
+ font-size: large;
58
+ }
59
+
60
+ .file-title {
61
+ font-size: large;
62
+ font-weight: bold;
63
+ background: #005;
64
+ color: #FFF;
65
+ }
66
+
67
+ .banner {
68
+ background: #005;
69
+ color: #FFF;
70
+ border: 1px solid black;
71
+ padding: 1em;
72
+ }
73
+
74
+ .banner td {
75
+ background: transparent;
76
+ color: #FFF;
77
+ }
78
+
79
+ h1 a, h2 a, .sectiontitle a, .banner a {
80
+ color: #FF0;
81
+ }
82
+
83
+ h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover {
84
+ color: #FF7;
85
+ }
86
+
87
+ .dyn-source {
88
+ display: none;
89
+ background: #FFE;
90
+ color: #000;
91
+ border: 1px dotted black;
92
+ margin: 0.5em 2em 0.5em 2em;
93
+ padding: 0.5em;
94
+ }
95
+
96
+ .dyn-source .cmt {
97
+ color: #00F;
98
+ font-style: italic;
99
+ }
100
+
101
+ .dyn-source .kw {
102
+ color: #070;
103
+ font-weight: bold;
104
+ }
105
+
106
+ .method {
107
+ margin-left: 1em;
108
+ margin-right: 1em;
109
+ margin-bottom: 1em;
110
+ }
111
+
112
+ .description pre {
113
+ padding: 0.5em;
114
+ border: 1px dotted black;
115
+ background: #FFE;
116
+ }
117
+
118
+ .method .title {
119
+ font-family: monospace;
120
+ font-size: large;
121
+ border-bottom: 1px dashed black;
122
+ margin-bottom: 0.3em;
123
+ padding-bottom: 0.1em;
124
+ }
125
+
126
+ .method .description, .method .sourcecode {
127
+ margin-left: 1em;
128
+ }
129
+
130
+ .description p, .sourcecode p {
131
+ margin-bottom: 0.5em;
132
+ }
133
+
134
+ .method .sourcecode p.source-link {
135
+ text-indent: 0em;
136
+ margin-top: 0.5em;
137
+ }
138
+
139
+ .method .aka {
140
+ margin-top: 0.3em;
141
+ margin-left: 1em;
142
+ font-style: italic;
143
+ text-indent: 2em;
144
+ }
145
+
146
+ h1 {
147
+ padding: 1em;
148
+ border: 1px solid black;
149
+ font-size: x-large;
150
+ font-weight: bold;
151
+ color: #FFF;
152
+ background: #007;
153
+ }
154
+
155
+ h2 {
156
+ padding: 0.5em 1em 0.5em 1em;
157
+ border: 1px solid black;
158
+ font-size: large;
159
+ font-weight: bold;
160
+ color: #FFF;
161
+ background: #009;
162
+ }
163
+
164
+ h3, h4, h5, h6 {
165
+ padding: 0.2em 1em 0.2em 1em;
166
+ border: 1px dashed black;
167
+ color: #000;
168
+ background: #AAF;
169
+ }
170
+
171
+ .sourcecode > pre {
172
+ padding: 0.5em;
173
+ border: 1px dotted black;
174
+ background: #FFE;
175
+ }
data/example/time.rb ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # IMPORTANT REMINDER: Yon need root authority / privilege
4
+ # to run the following.
5
+
6
+ require 'rubygems'
7
+ require 'port'
8
+
9
+ # Set IO permission level to 3 - i.e. read/write all ports.
10
+ # Set Real-Time Clock register 0x70 to 0,2,4 to read ss,hh,mm
11
+ Port.iopl 3
12
+
13
+ Port.outb 4, 0x70
14
+ hh = Port.inb 0x71
15
+
16
+ Port.outb 2, 0x70
17
+ mm = Port.inb 0x71
18
+
19
+ Port.outb 0, 0x70
20
+ ss = Port.inb 0x71
21
+
22
+ printf("Real-Time Clock time is %02x:%02x:%02x\n", hh,mm,ss)
data/ext/Makefile ADDED
@@ -0,0 +1,143 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /usr/lib/ruby/1.8/i386-linux
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
10
+ prefix = $(DESTDIR)/usr
11
+ exec_prefix = $(DESTDIR)/usr
12
+ sitedir = $(DESTDIR)/usr/lib/ruby/site_ruby
13
+ rubylibdir = $(prefix)/lib/ruby/$(ruby_version)
14
+ archdir = $(libdir)/ruby/$(ruby_version)/$(arch)
15
+ sbindir = $(DESTDIR)/usr/sbin
16
+ datadir = $(DESTDIR)/usr/share
17
+ includedir = $(DESTDIR)/usr/include
18
+ infodir = $(DESTDIR)/usr/share/info
19
+ sysconfdir = $(DESTDIR)/etc
20
+ mandir = $(DESTDIR)/usr/share/man
21
+ libdir = $(DESTDIR)/usr/lib
22
+ sharedstatedir = $(DESTDIR)/usr/com
23
+ oldincludedir = $(DESTDIR)/usr/include
24
+ sitearchdir = $(_fc_sitedir)/$(ruby_version)/$(sitearch)
25
+ bindir = $(DESTDIR)/usr/bin
26
+ localstatedir = $(DESTDIR)/var
27
+ sitelibdir = $(sitedir)/$(ruby_version)
28
+ libexecdir = $(DESTDIR)/usr/libexec
29
+ _fc_sitedir = $(DESTDIR)/usr/lib/ruby/site_ruby
30
+
31
+ CC = gcc
32
+ LIBRUBY = $(LIBRUBY_SO)
33
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
34
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
35
+ LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
36
+
37
+ RUBY_EXTCONF_H =
38
+ CFLAGS = -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -Wall -fPIC
39
+ INCFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir)
40
+ CPPFLAGS =
41
+ CXXFLAGS = $(CFLAGS)
42
+ DLDFLAGS =
43
+ LDSHARED = $(CC) -shared
44
+ AR = ar
45
+ EXEEXT =
46
+
47
+ RUBY_INSTALL_NAME = ruby
48
+ RUBY_SO_NAME = ruby
49
+ arch = i386-linux
50
+ sitearch = i386-linux
51
+ ruby_version = 1.8
52
+ ruby = /usr/bin/ruby
53
+ RUBY = $(ruby)
54
+ RM = rm -f
55
+ MAKEDIRS = mkdir -p
56
+ INSTALL = /usr/bin/install -c
57
+ INSTALL_PROG = $(INSTALL) -m 0755
58
+ INSTALL_DATA = $(INSTALL) -m 644
59
+ COPY = cp
60
+
61
+ #### End of system configuration section. ####
62
+
63
+ preload =
64
+
65
+ libpath = $(libdir)
66
+ LIBPATH = -L"$(libdir)"
67
+ DEFFILE =
68
+
69
+ CLEANFILES = mkmf.log
70
+ DISTCLEANFILES =
71
+
72
+ extout =
73
+ extout_prefix =
74
+ target_prefix =
75
+ LOCAL_LIBS =
76
+ LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc
77
+ SRCS = port.c
78
+ OBJS = port.o
79
+ TARGET = port
80
+ DLLIB = $(TARGET).so
81
+ EXTSTATIC =
82
+ STATIC_LIB =
83
+
84
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
85
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
86
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
87
+
88
+ TARGET_SO = $(DLLIB)
89
+ CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map
90
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
91
+
92
+ all: $(DLLIB)
93
+ static: $(STATIC_LIB)
94
+
95
+ clean:
96
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
97
+
98
+ distclean: clean
99
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
100
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
101
+
102
+ realclean: distclean
103
+ install: install-so install-rb
104
+
105
+ install-so: $(RUBYARCHDIR)
106
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
107
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
108
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
109
+ install-rb: pre-install-rb install-rb-default
110
+ install-rb-default: pre-install-rb-default
111
+ pre-install-rb: Makefile
112
+ pre-install-rb-default: Makefile
113
+ $(RUBYARCHDIR):
114
+ $(MAKEDIRS) $@
115
+
116
+ site-install: site-install-so site-install-rb
117
+ site-install-so: install-so
118
+ site-install-rb: install-rb
119
+
120
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
121
+
122
+ .cc.o:
123
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
124
+
125
+ .cxx.o:
126
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
127
+
128
+ .cpp.o:
129
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
130
+
131
+ .C.o:
132
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
133
+
134
+ .c.o:
135
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
136
+
137
+ $(DLLIB): $(OBJS)
138
+ @-$(RM) $@
139
+ $(LDSHARED) $(DLDFLAGS) $(LIBPATH) -o $@ $(OBJS) $(LOCAL_LIBS) $(LIBS)
140
+
141
+
142
+
143
+ $(OBJS): ruby.h defines.h
data/ext/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ task :default => :build
2
+
3
+ file "Makefile" => "extconf.rb" do
4
+ sh "ruby extconf.rb"
5
+ end
6
+
7
+ task :build => ["Makefile","port.c"] do
8
+ sh "make"
9
+ end
10
+
11
+ task :clean do
12
+ sh "rm -f Makefile port.o port.so"
13
+ end
14
+
data/ext/extconf.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'mkmf'
2
+ create_makefile('port')
data/ext/port.c ADDED
@@ -0,0 +1,69 @@
1
+ #include <ruby.h>
2
+ #include <sys/io.h>
3
+
4
+
5
+
6
+ /* iopl - set IO permission level.
7
+ * A level of 3 is required for full read/write access to all ports.
8
+ *
9
+ * Example:
10
+ * require 'rubygems'
11
+ * require 'port'
12
+ * Port.iopl(3)
13
+ */
14
+ static VALUE
15
+ p_iopl(VALUE self, VALUE level) {
16
+ return INT2NUM(iopl(NUM2INT(level)));
17
+ }
18
+
19
+ /* inb - read a byte from a port.
20
+ *
21
+ * Example:
22
+ * require 'rubygems'
23
+ * require 'port'
24
+ * my_byte_from_port_hex_71 = Port.inb(0x71)
25
+ */
26
+ static VALUE
27
+ p_inb(VALUE self, VALUE port) {
28
+ return INT2NUM(inb(NUM2INT(port)));
29
+ }
30
+
31
+ /* outb - write a byte to a port.
32
+ * Usage outb(value,port)
33
+ *
34
+ * Example: Setting port 0x71 to 123.
35
+ * require 'rubygems'
36
+ * require 'port'
37
+ * Port.outb(123,0x71)
38
+ */
39
+ static VALUE
40
+ p_outb(VALUE self, VALUE num, VALUE port) {
41
+ outb(NUM2INT(num),NUM2INT(port));
42
+ return Qnil;
43
+ }
44
+
45
+
46
+ /* Init_port - startup routine loaded when require 'port' is
47
+ * issued within ruby.
48
+ */
49
+ VALUE cPort;
50
+
51
+ /* Port - Ruby extension to provide low-level
52
+ * access to IO ports on an x86 GNU/Linux system.
53
+ *
54
+ * License: GPL v2 or (at your option) any later version. See http://www.fsf.org/licensing .
55
+ *
56
+ * Copyright (C) 2008, Loh Siu Yin (siuyin@beyondbroadcast.com)
57
+ *
58
+ * IMPORTANT NOTE: These routines require root privilege.
59
+ * Use:
60
+ * sudo <your_ruby_program> or
61
+ * su -l root, then run your_ruby_program.
62
+ * The README[link:files/README.html] file provides further details.
63
+ */
64
+ void Init_port() {
65
+ cPort = rb_define_class("Port", rb_cObject);
66
+ rb_define_singleton_method(cPort, "iopl", p_iopl, 1);
67
+ rb_define_singleton_method(cPort, "inb", p_inb, 1);
68
+ rb_define_singleton_method(cPort, "outb", p_outb, 2);
69
+ }
data/ext/port.o ADDED
Binary file
data/ext/port.so ADDED
Binary file
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: port
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: x86-linux
6
+ authors:
7
+ - Loh Siu Yin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-30 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: siuyin@beyondbroadcast.com
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/extconf.rb
22
+ extra_rdoc_files:
23
+ - README
24
+ files:
25
+ - README
26
+ - doc/index.html
27
+ - doc/created.rid
28
+ - doc/fr_file_index.html
29
+ - doc/rdoc-style.css
30
+ - doc/fr_class_index.html
31
+ - doc/fr_method_index.html
32
+ - doc/files
33
+ - doc/classes
34
+ - doc/files/ext
35
+ - doc/files/README.html
36
+ - doc/files/ext/port_c.html
37
+ - doc/classes/Port.html
38
+ - Rakefile
39
+ - ext/port.o
40
+ - ext/port.so
41
+ - ext/extconf.rb
42
+ - ext/Makefile
43
+ - ext/port.c
44
+ - ext/Rakefile
45
+ - example/time.rb
46
+ has_rdoc: true
47
+ homepage: http://port.rubyforge.org/
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --title
51
+ - Port - low-level port access for Linux.
52
+ - --main
53
+ - Port
54
+ - -S
55
+ require_paths:
56
+ - lib
57
+ - ext
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements:
71
+ - 1. A linux x86 system.
72
+ - 2. gcc - the GNU C compiler must be installed.
73
+ rubyforge_project: port
74
+ rubygems_version: 1.3.0
75
+ signing_key:
76
+ specification_version: 2
77
+ summary: Low-level port access from ruby on Linux.
78
+ test_files: []
79
+