forked from Minki/linux
Merge master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts: drivers/usb/input/Makefile drivers/usb/input/gtco.c
This commit is contained in:
commit
bc95f3669f
2
.mailmap
2
.mailmap
@ -67,6 +67,8 @@ Koushik <raghavendra.koushik@neterion.com>
|
||||
Leonid I Ananiev <leonid.i.ananiev@intel.com>
|
||||
Linas Vepstas <linas@austin.ibm.com>
|
||||
Matthieu CASTET <castet.matthieu@free.fr>
|
||||
Michael Buesch <mb@bu3sch.de>
|
||||
Michael Buesch <mbuesch@freenet.de>
|
||||
Michel Dänzer <michel@tungstengraphics.com>
|
||||
Mitesh shah <mshah@teja.com>
|
||||
Morten Welinder <terra@gnome.org>
|
||||
|
24
CREDITS
24
CREDITS
@ -317,6 +317,12 @@ S: 2322 37th Ave SW
|
||||
S: Seattle, Washington 98126-2010
|
||||
S: USA
|
||||
|
||||
N: Johannes Berg
|
||||
E: johannes@sipsolutions.net
|
||||
W: http://johannes.sipsolutions.net/
|
||||
P: 1024D/9AB78CA5 AD02 0176 4E29 C137 1DF6 08D2 FC44 CF86 9AB7 8CA5
|
||||
D: powerpc & 802.11 hacker
|
||||
|
||||
N: Stephen R. van den Berg (AKA BuGless)
|
||||
E: berg@pool.informatik.rwth-aachen.de
|
||||
D: General kernel, gcc, and libc hacker
|
||||
@ -2286,14 +2292,14 @@ S: D-90453 Nuernberg
|
||||
S: Germany
|
||||
|
||||
N: Arnaldo Carvalho de Melo
|
||||
E: acme@mandriva.com
|
||||
E: acme@ghostprotocols.net
|
||||
E: arnaldo.melo@gmail.com
|
||||
E: acme@redhat.com
|
||||
W: http://oops.ghostprotocols.net:81/blog/
|
||||
P: 1024D/9224DF01 D5DF E3BB E3C8 BCBB F8AD 841A B6AB 4681 9224 DF01
|
||||
D: IPX, LLC, DCCP, cyc2x, wl3501_cs, net/ hacks
|
||||
S: Mandriva
|
||||
S: R. Tocantins, 89 - Cristo Rei
|
||||
S: 80050-430 - Curitiba - Paraná
|
||||
S: R. Brasílio Itiberê, 4270/1010 - Água Verde
|
||||
S: 80240-060 - Curitiba - Paraná
|
||||
S: Brazil
|
||||
|
||||
N: Karsten Merker
|
||||
@ -2678,7 +2684,7 @@ S: Ottawa, Ontario
|
||||
S: Canada K2P 0X8
|
||||
|
||||
N: Mikael Pettersson
|
||||
E: mikpe@csd.uu.se
|
||||
E: mikpe@it.uu.se
|
||||
W: http://www.csd.uu.se/~mikpe/
|
||||
D: Miscellaneous fixes
|
||||
|
||||
@ -3295,6 +3301,14 @@ S: 12725 SW Millikan Way, Suite 400
|
||||
S: Beaverton, Oregon 97005
|
||||
S: USA
|
||||
|
||||
N: Li Yang
|
||||
E: leoli@freescale.com
|
||||
D: Freescale Highspeed USB device driver
|
||||
D: Freescale QE SoC support and Ethernet driver
|
||||
S: B-1206 Jingmao Guojigongyu
|
||||
S: 16 Baliqiao Nanjie, Beijing 101100
|
||||
S: People's Repulic of China
|
||||
|
||||
N: Marcelo Tosatti
|
||||
E: marcelo@kvack.org
|
||||
D: v2.4 kernel maintainer
|
||||
|
9
Documentation/ABI/obsolete/dv1394
Normal file
9
Documentation/ABI/obsolete/dv1394
Normal file
@ -0,0 +1,9 @@
|
||||
What: dv1394 (a.k.a. "OHCI-DV I/O support" for FireWire)
|
||||
Contact: linux1394-devel@lists.sourceforge.net
|
||||
Description:
|
||||
New application development should use raw1394 + userspace libraries
|
||||
instead, notably libiec61883 which is functionally equivalent.
|
||||
|
||||
Users:
|
||||
ffmpeg/libavformat (used by a variety of media players)
|
||||
dvgrab v1.x (replaced by dvgrab2 on top of raw1394 and resp. libraries)
|
41
Documentation/ABI/testing/sysfs-bus-usb
Normal file
41
Documentation/ABI/testing/sysfs-bus-usb
Normal file
@ -0,0 +1,41 @@
|
||||
What: /sys/bus/usb/devices/.../power/autosuspend
|
||||
Date: March 2007
|
||||
KernelVersion: 2.6.21
|
||||
Contact: Alan Stern <stern@rowland.harvard.edu>
|
||||
Description:
|
||||
Each USB device directory will contain a file named
|
||||
power/autosuspend. This file holds the time (in seconds)
|
||||
the device must be idle before it will be autosuspended.
|
||||
0 means the device will be autosuspended as soon as
|
||||
possible. Negative values will prevent the device from
|
||||
being autosuspended at all, and writing a negative value
|
||||
will resume the device if it is already suspended.
|
||||
|
||||
The autosuspend delay for newly-created devices is set to
|
||||
the value of the usbcore.autosuspend module parameter.
|
||||
|
||||
What: /sys/bus/usb/devices/.../power/level
|
||||
Date: March 2007
|
||||
KernelVersion: 2.6.21
|
||||
Contact: Alan Stern <stern@rowland.harvard.edu>
|
||||
Description:
|
||||
Each USB device directory will contain a file named
|
||||
power/level. This file holds a power-level setting for
|
||||
the device, one of "on", "auto", or "suspend".
|
||||
|
||||
"on" means that the device is not allowed to autosuspend,
|
||||
although normal suspends for system sleep will still
|
||||
be honored. "auto" means the device will autosuspend
|
||||
and autoresume in the usual manner, according to the
|
||||
capabilities of its driver. "suspend" means the device
|
||||
is forced into a suspended state and it will not autoresume
|
||||
in response to I/O requests. However remote-wakeup requests
|
||||
from the device may still be enabled (the remote-wakeup
|
||||
setting is controlled separately by the power/wakeup
|
||||
attribute).
|
||||
|
||||
During normal use, devices should be left in the "auto"
|
||||
level. The other levels are meant for administrative uses.
|
||||
If you want to suspend a device immediately but leave it
|
||||
free to wake up in response to I/O requests, you should
|
||||
write "0" to power/autosuspend.
|
@ -236,6 +236,12 @@ X!Ilib/string.c
|
||||
!Enet/core/dev.c
|
||||
!Enet/ethernet/eth.c
|
||||
!Iinclude/linux/etherdevice.h
|
||||
!Edrivers/net/phy/phy.c
|
||||
!Idrivers/net/phy/phy.c
|
||||
!Edrivers/net/phy/phy_device.c
|
||||
!Idrivers/net/phy/phy_device.c
|
||||
!Edrivers/net/phy/mdio_bus.c
|
||||
!Idrivers/net/phy/mdio_bus.c
|
||||
<!-- FIXME: Removed for now since no structured comments in source
|
||||
X!Enet/core/wireless.c
|
||||
-->
|
||||
|
@ -76,3 +76,7 @@ kernel patches.
|
||||
22: Newly-added code has been compiled with `gcc -W'. This will generate
|
||||
lots of noise, but is good for finding bugs like "warning: comparison
|
||||
between signed and unsigned".
|
||||
|
||||
23: Tested after it has been merged into the -mm patchset to make sure
|
||||
that it still works with all of the other queued patches and various
|
||||
changes in the VM, VFS, and other subsystems.
|
||||
|
@ -1,38 +0,0 @@
|
||||
driver/acpi/hotkey.c implement:
|
||||
1. /proc/acpi/hotkey/event_config
|
||||
(event based hotkey or event config interface):
|
||||
a. add a event based hotkey(event) :
|
||||
echo "0:bus::action:method:num:num" > event_config
|
||||
|
||||
b. delete a event based hotkey(event):
|
||||
echo "1:::::num:num" > event_config
|
||||
|
||||
c. modify a event based hotkey(event):
|
||||
echo "2:bus::action:method:num:num" > event_config
|
||||
|
||||
2. /proc/acpi/hotkey/poll_config
|
||||
(polling based hotkey or event config interface):
|
||||
a.add a polling based hotkey(event) :
|
||||
echo "0:bus:method:action:method:num" > poll_config
|
||||
this adding command will create a proc file
|
||||
/proc/acpi/hotkey/method, which is used to get
|
||||
result of polling.
|
||||
|
||||
b.delete a polling based hotkey(event):
|
||||
echo "1:::::num" > event_config
|
||||
|
||||
c.modify a polling based hotkey(event):
|
||||
echo "2:bus:method:action:method:num" > poll_config
|
||||
|
||||
3./proc/acpi/hotkey/action
|
||||
(interface to call aml method associated with a
|
||||
specific hotkey(event))
|
||||
echo "event_num:event_type:event_argument" >
|
||||
/proc/acpi/hotkey/action.
|
||||
The result of the execution of this aml method is
|
||||
attached to /proc/acpi/hotkey/poll_method, which is dynamically
|
||||
created. Please use command "cat /proc/acpi/hotkey/polling_method"
|
||||
to retrieve it.
|
||||
|
||||
Note: Use cmdline "acpi_generic_hotkey" to over-ride
|
||||
platform-specific with generic driver.
|
46
Documentation/arm/Samsung-S3C24XX/DMA.txt
Normal file
46
Documentation/arm/Samsung-S3C24XX/DMA.txt
Normal file
@ -0,0 +1,46 @@
|
||||
S3C2410 DMA
|
||||
===========
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
The kernel provides an interface to manage DMA transfers
|
||||
using the DMA channels in the cpu, so that the central
|
||||
duty of managing channel mappings, and programming the
|
||||
channel generators is in one place.
|
||||
|
||||
|
||||
DMA Channel Ordering
|
||||
--------------------
|
||||
|
||||
Many of the range do not have connections for the DMA
|
||||
channels to all sources, which means that some devices
|
||||
have a restricted number of channels that can be used.
|
||||
|
||||
To allow flexibilty for each cpu type and board, the
|
||||
dma code can be given an dma ordering structure which
|
||||
allows the order of channel search to be specified, as
|
||||
well as allowing the prohibition of certain claims.
|
||||
|
||||
struct s3c24xx_dma_order has a list of channels, and
|
||||
each channel within has a slot for a list of dma
|
||||
channel numbers. The slots are searched in order, for
|
||||
the presence of a dma channel number with DMA_CH_VALID
|
||||
orred in.
|
||||
|
||||
If the order has the flag DMA_CH_NEVER set, then after
|
||||
checking the channel list, the system will return no
|
||||
found channel, thus denying the request.
|
||||
|
||||
A board support file can call s3c24xx_dma_order_set()
|
||||
to register an complete ordering set. The routine will
|
||||
copy the data, so the original can be discared with
|
||||
__initdata.
|
||||
|
||||
|
||||
Authour
|
||||
-------
|
||||
|
||||
Ben Dooks,
|
||||
Copyright (c) 2007 Ben Dooks, Simtec Electronics
|
||||
Licensed under the GPL v2
|
@ -8,13 +8,10 @@ Introduction
|
||||
|
||||
The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported
|
||||
by the 's3c2410' architecture of ARM Linux. Currently the S3C2410,
|
||||
S3C2440 and S3C2442 devices are supported.
|
||||
S3C2412, S3C2413, S3C2440 and S3C2442 devices are supported.
|
||||
|
||||
Support for the S3C2400 series is in progress.
|
||||
|
||||
Support for the S3C2412 and S3C2413 CPUs is being merged.
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
@ -26,6 +23,22 @@ Configuration
|
||||
please check the machine specific documentation.
|
||||
|
||||
|
||||
Layout
|
||||
------
|
||||
|
||||
The core support files are located in the platform code contained in
|
||||
arch/arm/plat-s3c24xx with headers in include/asm-arm/plat-s3c24xx.
|
||||
This directory should be kept to items shared between the platform
|
||||
code (arch/arm/plat-s3c24xx) and the arch/arm/mach-s3c24* code.
|
||||
|
||||
Each cpu has a directory with the support files for it, and the
|
||||
machines that carry the device. For example S3C2410 is contained
|
||||
in arch/arm/mach-s3c2410 and S3C2440 in arch/arm/mach-s3c2440
|
||||
|
||||
Register, kernel and platform data definitions are held in the
|
||||
include/asm-arm/arch-s3c2410 directory.
|
||||
|
||||
|
||||
Machines
|
||||
--------
|
||||
|
||||
|
@ -5,10 +5,10 @@
|
||||
Introduction
|
||||
------------
|
||||
|
||||
The S3C2410 supports a low-power suspend mode, where the SDRAM is kept
|
||||
The S3C24XX supports a low-power suspend mode, where the SDRAM is kept
|
||||
in Self-Refresh mode, and all but the essential peripheral blocks are
|
||||
powered down. For more information on how this works, please look
|
||||
at the S3C2410 datasheets from Samsung.
|
||||
at the relevant CPU datasheet from Samsung.
|
||||
|
||||
|
||||
Requirements
|
||||
@ -56,6 +56,27 @@ Machine Support
|
||||
Note, the original method of adding an late_initcall() is wrong,
|
||||
and will end up initialising all compiled machines' pm init!
|
||||
|
||||
The following is an example of code used for testing wakeup from
|
||||
an falling edge on IRQ_EINT0:
|
||||
|
||||
|
||||
static irqreturn_t button_irq(int irq, void *pw)
|
||||
{
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
statuc void __init machine_init(void)
|
||||
{
|
||||
...
|
||||
|
||||
request_irq(IRQ_EINT0, button_irq, IRQF_TRIGGER_FALLING,
|
||||
"button-irq-eint0", NULL);
|
||||
|
||||
enable_irq_wake(IRQ_EINT0);
|
||||
|
||||
s3c2410_pm_init();
|
||||
}
|
||||
|
||||
|
||||
Debugging
|
||||
---------
|
||||
@ -70,6 +91,12 @@ Debugging
|
||||
care should be taken that any external clock sources that the UARTs
|
||||
rely on are still enabled at that point.
|
||||
|
||||
3) If any debugging is placed in the resume path, then it must have the
|
||||
relevant clocks and peripherals setup before use (ie, bootloader).
|
||||
|
||||
For example, if you transmit a character from the UART, the baud
|
||||
rate and uart controls must be setup beforehand.
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
@ -89,6 +116,10 @@ Configuration
|
||||
Allows the entire memory to be checksummed before and after the
|
||||
suspend to see if there has been any corruption of the contents.
|
||||
|
||||
Note, the time to calculate the CRC is dependant on the CPU speed
|
||||
and the size of memory. For an 64Mbyte RAM area on an 200MHz
|
||||
S3C2410, this can take approximately 4 seconds to complete.
|
||||
|
||||
This support requires the CRC32 function to be enabled.
|
||||
|
||||
|
||||
|
113
Documentation/cpu-load.txt
Normal file
113
Documentation/cpu-load.txt
Normal file
@ -0,0 +1,113 @@
|
||||
CPU load
|
||||
--------
|
||||
|
||||
Linux exports various bits of information via `/proc/stat' and
|
||||
`/proc/uptime' that userland tools, such as top(1), use to calculate
|
||||
the average time system spent in a particular state, for example:
|
||||
|
||||
$ iostat
|
||||
Linux 2.6.18.3-exp (linmac) 02/20/2007
|
||||
|
||||
avg-cpu: %user %nice %system %iowait %steal %idle
|
||||
10.01 0.00 2.92 5.44 0.00 81.63
|
||||
|
||||
...
|
||||
|
||||
Here the system thinks that over the default sampling period the
|
||||
system spent 10.01% of the time doing work in user space, 2.92% in the
|
||||
kernel, and was overall 81.63% of the time idle.
|
||||
|
||||
In most cases the `/proc/stat' information reflects the reality quite
|
||||
closely, however due to the nature of how/when the kernel collects
|
||||
this data sometimes it can not be trusted at all.
|
||||
|
||||
So how is this information collected? Whenever timer interrupt is
|
||||
signalled the kernel looks what kind of task was running at this
|
||||
moment and increments the counter that corresponds to this tasks
|
||||
kind/state. The problem with this is that the system could have
|
||||
switched between various states multiple times between two timer
|
||||
interrupts yet the counter is incremented only for the last state.
|
||||
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
If we imagine the system with one task that periodically burns cycles
|
||||
in the following manner:
|
||||
|
||||
time line between two timer interrupts
|
||||
|--------------------------------------|
|
||||
^ ^
|
||||
|_ something begins working |
|
||||
|_ something goes to sleep
|
||||
(only to be awaken quite soon)
|
||||
|
||||
In the above situation the system will be 0% loaded according to the
|
||||
`/proc/stat' (since the timer interrupt will always happen when the
|
||||
system is executing the idle handler), but in reality the load is
|
||||
closer to 99%.
|
||||
|
||||
One can imagine many more situations where this behavior of the kernel
|
||||
will lead to quite erratic information inside `/proc/stat'.
|
||||
|
||||
|
||||
/* gcc -o hog smallhog.c */
|
||||
#include <time.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <sys/time.h>
|
||||
#define HIST 10
|
||||
|
||||
static volatile sig_atomic_t stop;
|
||||
|
||||
static void sighandler (int signr)
|
||||
{
|
||||
(void) signr;
|
||||
stop = 1;
|
||||
}
|
||||
static unsigned long hog (unsigned long niters)
|
||||
{
|
||||
stop = 0;
|
||||
while (!stop && --niters);
|
||||
return niters;
|
||||
}
|
||||
int main (void)
|
||||
{
|
||||
int i;
|
||||
struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 },
|
||||
.it_value = { .tv_sec = 0, .tv_usec = 1 } };
|
||||
sigset_t set;
|
||||
unsigned long v[HIST];
|
||||
double tmp = 0.0;
|
||||
unsigned long n;
|
||||
signal (SIGALRM, &sighandler);
|
||||
setitimer (ITIMER_REAL, &it, NULL);
|
||||
|
||||
hog (ULONG_MAX);
|
||||
for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX);
|
||||
for (i = 0; i < HIST; ++i) tmp += v[i];
|
||||
tmp /= HIST;
|
||||
n = tmp - (tmp / 3.0);
|
||||
|
||||
sigemptyset (&set);
|
||||
sigaddset (&set, SIGALRM);
|
||||
|
||||
for (;;) {
|
||||
hog (n);
|
||||
sigwait (&set, &i);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
References
|
||||
----------
|
||||
|
||||
http://lkml.org/lkml/2007/2/12/6
|
||||
Documentation/filesystems/proc.txt (1.8)
|
||||
|
||||
|
||||
Thanks
|
||||
------
|
||||
|
||||
Con Kolivas, Pavel Machek
|
@ -557,6 +557,9 @@ Set some flags:
|
||||
Add some cpus:
|
||||
# /bin/echo 0-7 > cpus
|
||||
|
||||
Add some mems:
|
||||
# /bin/echo 0-7 > mems
|
||||
|
||||
Now attach your shell to this cpuset:
|
||||
# /bin/echo $$ > tasks
|
||||
|
||||
|
@ -60,7 +60,7 @@ Here's an example of how to use the API:
|
||||
desc.tfm = tfm;
|
||||
desc.flags = 0;
|
||||
|
||||
if (crypto_hash_digest(&desc, &sg, 2, result))
|
||||
if (crypto_hash_digest(&desc, sg, 2, result))
|
||||
fail();
|
||||
|
||||
crypto_free_hash(tfm);
|
||||
|
@ -66,7 +66,7 @@ runtime memory footprint:
|
||||
|
||||
Device Enumeration
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
As a rule, platform specific (and often board-specific) setup code wil
|
||||
As a rule, platform specific (and often board-specific) setup code will
|
||||
register platform devices:
|
||||
|
||||
int platform_device_register(struct platform_device *pdev);
|
||||
@ -106,7 +106,7 @@ It's built from two components:
|
||||
* platform_device.id ... the device instance number, or else "-1"
|
||||
to indicate there's only one.
|
||||
|
||||
These are catenated, so name/id "serial"/0 indicates bus_id "serial.0", and
|
||||
These are concatenated, so name/id "serial"/0 indicates bus_id "serial.0", and
|
||||
"serial/3" indicates bus_id "serial.3"; both would use the platform_driver
|
||||
named "serial". While "my_rtc"/-1 would be bus_id "my_rtc" (no instance id)
|
||||
and use the platform_driver called "my_rtc".
|
||||
|
@ -6,6 +6,18 @@ be removed from this file.
|
||||
|
||||
---------------------------
|
||||
|
||||
What: V4L2 VIDIOC_G_MPEGCOMP and VIDIOC_S_MPEGCOMP
|
||||
When: October 2007
|
||||
Why: Broken attempt to set MPEG compression parameters. These ioctls are
|
||||
not able to implement the wide variety of parameters that can be set
|
||||
by hardware MPEG encoders. A new MPEG control mechanism was created
|
||||
in kernel 2.6.18 that replaces these ioctls. See the V4L2 specification
|
||||
(section 1.9: Extended controls) for more information on this topic.
|
||||
Who: Hans Verkuil <hverkuil@xs4all.nl> and
|
||||
Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /sys/devices/.../power/state
|
||||
dev->power.power_state
|
||||
dpm_runtime_{suspend,resume)()
|
||||
@ -39,17 +51,6 @@ Who: Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: dv1394 driver (CONFIG_IEEE1394_DV1394)
|
||||
When: June 2007
|
||||
Why: Replaced by raw1394 + userspace libraries, notably libiec61883. This
|
||||
shift of application support has been indicated on www.linux1394.org
|
||||
and developers' mailinglists for quite some time. Major applications
|
||||
have been converted, with the exception of ffmpeg and hence xine.
|
||||
Piped output of dvgrab2 is a partial equivalent to dv1394.
|
||||
Who: Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Video4Linux API 1 ioctls and video_decoder.h from Video devices.
|
||||
When: December 2006
|
||||
Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
|
||||
@ -145,15 +146,6 @@ Who: Arjan van de Ven <arjan@linux.intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: mount/umount uevents
|
||||
When: February 2007
|
||||
Why: These events are not correct, and do not properly let userspace know
|
||||
when a file system has been mounted or unmounted. Userspace should
|
||||
poll the /proc/mounts file instead to detect this properly.
|
||||
Who: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: USB driver API moves to EXPORT_SYMBOL_GPL
|
||||
When: February 2008
|
||||
Files: include/linux/usb.h, drivers/usb/core/driver.c
|
||||
@ -222,15 +214,6 @@ Who: Adrian Bunk <bunk@stusta.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: IPv4 only connection tracking/NAT/helpers
|
||||
When: 2.6.22
|
||||
Why: The new layer 3 independant connection tracking replaces the old
|
||||
IPv4 only version. After some stabilization of the new code the
|
||||
old one will be removed.
|
||||
Who: Patrick McHardy <kaber@trash.net>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: ACPI hooks (X86_SPEEDSTEP_CENTRINO_ACPI) in speedstep-centrino driver
|
||||
When: December 2006
|
||||
Why: Speedstep-centrino driver with ACPI hooks and acpi-cpufreq driver are
|
||||
@ -253,29 +236,6 @@ Who: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
<<<<<<< test:Documentation/feature-removal-schedule.txt
|
||||
What: ACPI hotkey driver (CONFIG_ACPI_HOTKEY)
|
||||
When: 2.6.21
|
||||
Why: hotkey.c was an attempt to consolidate multiple drivers that use
|
||||
ACPI to implement hotkeys. However, hotkeys are not documented
|
||||
in the ACPI specification, so the drivers used undocumented
|
||||
vendor-specific hooks and turned out to be more different than
|
||||
the same.
|
||||
|
||||
Further, the keys and the features supplied by each platform
|
||||
are different, so there will always be a need for
|
||||
platform-specific drivers.
|
||||
|
||||
So the new plan is to delete hotkey.c and instead, work on the
|
||||
platform specific drivers to try to make them look the same
|
||||
to the user when they supply the same features.
|
||||
|
||||
hotkey.c has always depended on CONFIG_EXPERIMENTAL
|
||||
|
||||
Who: Len Brown <len.brown@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /sys/firmware/acpi/namespace
|
||||
When: 2.6.21
|
||||
Why: The ACPI namespace is effectively the symbol list for
|
||||
@ -306,13 +266,6 @@ Who: Len Brown <len.brown@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: JFFS (version 1)
|
||||
When: 2.6.21
|
||||
Why: Unmaintained for years, superceded by JFFS2 for years.
|
||||
Who: Jeff Garzik <jeff@garzik.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: sk98lin network driver
|
||||
When: July 2007
|
||||
Why: In kernel tree version of driver is unmaintained. Sk98lin driver
|
||||
@ -334,3 +287,30 @@ Why: The code says it was obsolete when it was written in 2001.
|
||||
Who: Richard Purdie <rpurdie@rpsys.net>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: i8xx_tco watchdog driver
|
||||
When: in 2.6.22
|
||||
Why: the i8xx_tco watchdog driver has been replaced by the iTCO_wdt
|
||||
watchdog driver.
|
||||
Who: Wim Van Sebroeck <wim@iguana.be>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Multipath cached routing support in ipv4
|
||||
When: in 2.6.23
|
||||
Why: Code was merged, then submitter immediately disappeared leaving
|
||||
us with no maintainer and lots of bugs. The code should not have
|
||||
been merged in the first place, and many aspects of it's
|
||||
implementation are blocking more critical core networking
|
||||
development. It's marked EXPERIMENTAL and no distribution
|
||||
enables it because it cause obscure crashes due to unfixable bugs
|
||||
(interfaces don't return errors so memory allocation can't be
|
||||
handled, calling contexts of these interfaces make handling
|
||||
errors impossible too because they get called after we've
|
||||
totally commited to creating a route object, for example).
|
||||
This problem has existed for years and no forward progress
|
||||
has ever been made, and nobody steps up to try and salvage
|
||||
this code, so we're going to finally just get rid of it.
|
||||
Who: David S. Miller <davem@davemloft.net>
|
||||
|
||||
---------------------------
|
||||
|
@ -4,6 +4,8 @@ Exporting
|
||||
- explanation of how to make filesystems exportable.
|
||||
Locking
|
||||
- info on locking rules as they pertain to Linux VFS.
|
||||
9p.txt
|
||||
- 9p (v9fs) is an implementation of the Plan 9 remote fs protocol.
|
||||
adfs.txt
|
||||
- info and mount options for the Acorn Advanced Disc Filing System.
|
||||
afs.txt
|
||||
@ -82,8 +84,6 @@ udf.txt
|
||||
- info and mount options for the UDF filesystem.
|
||||
ufs.txt
|
||||
- info on the ufs filesystem.
|
||||
v9fs.txt
|
||||
- v9fs is a Unix implementation of the Plan 9 9p remote fs protocol.
|
||||
vfat.txt
|
||||
- info on using the VFAT filesystem used in Windows NT and Windows 95
|
||||
vfs.txt
|
||||
|
@ -40,6 +40,10 @@ OPTIONS
|
||||
aname=name aname specifies the file tree to access when the server is
|
||||
offering several exported file systems.
|
||||
|
||||
cache=mode specifies a cacheing policy. By default, no caches are used.
|
||||
loose = no attempts are made at consistency,
|
||||
intended for exclusive, read-only mounts
|
||||
|
||||
debug=n specifies debug level. The debug level is a bitmask.
|
||||
0x01 = display verbose error messages
|
||||
0x02 = developer debug (DEBUG_CURRENT)
|
||||
|
@ -1,31 +1,82 @@
|
||||
====================
|
||||
kAFS: AFS FILESYSTEM
|
||||
====================
|
||||
|
||||
ABOUT
|
||||
=====
|
||||
Contents:
|
||||
|
||||
This filesystem provides a fairly simple AFS filesystem driver. It is under
|
||||
development and only provides very basic facilities. It does not yet support
|
||||
the following AFS features:
|
||||
- Overview.
|
||||
- Usage.
|
||||
- Mountpoints.
|
||||
- Proc filesystem.
|
||||
- The cell database.
|
||||
- Security.
|
||||
- Examples.
|
||||
|
||||
|
||||
========
|
||||
OVERVIEW
|
||||
========
|
||||
|
||||
This filesystem provides a fairly simple secure AFS filesystem driver. It is
|
||||
under development and does not yet provide the full feature set. The features
|
||||
it does support include:
|
||||
|
||||
(*) Security (currently only AFS kaserver and KerberosIV tickets).
|
||||
|
||||
(*) File reading.
|
||||
|
||||
(*) Automounting.
|
||||
|
||||
It does not yet support the following AFS features:
|
||||
|
||||
(*) Write support.
|
||||
(*) Communications security.
|
||||
|
||||
(*) Local caching.
|
||||
|
||||
(*) pioctl() system call.
|
||||
(*) Automatic mounting of embedded mountpoints.
|
||||
|
||||
|
||||
===========
|
||||
COMPILATION
|
||||
===========
|
||||
|
||||
The filesystem should be enabled by turning on the kernel configuration
|
||||
options:
|
||||
|
||||
CONFIG_AF_RXRPC - The RxRPC protocol transport
|
||||
CONFIG_RXKAD - The RxRPC Kerberos security handler
|
||||
CONFIG_AFS - The AFS filesystem
|
||||
|
||||
Additionally, the following can be turned on to aid debugging:
|
||||
|
||||
CONFIG_AF_RXRPC_DEBUG - Permit AF_RXRPC debugging to be enabled
|
||||
CONFIG_AFS_DEBUG - Permit AFS debugging to be enabled
|
||||
|
||||
They permit the debugging messages to be turned on dynamically by manipulating
|
||||
the masks in the following files:
|
||||
|
||||
/sys/module/af_rxrpc/parameters/debug
|
||||
/sys/module/afs/parameters/debug
|
||||
|
||||
|
||||
=====
|
||||
USAGE
|
||||
=====
|
||||
|
||||
When inserting the driver modules the root cell must be specified along with a
|
||||
list of volume location server IP addresses:
|
||||
|
||||
insmod rxrpc.o
|
||||
insmod af_rxrpc.o
|
||||
insmod rxkad.o
|
||||
insmod kafs.o rootcell=cambridge.redhat.com:172.16.18.73:172.16.18.91
|
||||
|
||||
The first module is a driver for the RxRPC remote operation protocol, and the
|
||||
second is the actual filesystem driver for the AFS filesystem.
|
||||
The first module is the AF_RXRPC network protocol driver. This provides the
|
||||
RxRPC remote operation protocol and may also be accessed from userspace. See:
|
||||
|
||||
Documentation/networking/rxrpc.txt
|
||||
|
||||
The second module is the kerberos RxRPC security driver, and the third module
|
||||
is the actual filesystem driver for the AFS filesystem.
|
||||
|
||||
Once the module has been loaded, more modules can be added by the following
|
||||
procedure:
|
||||
@ -33,7 +84,7 @@ procedure:
|
||||
echo add grand.central.org 18.7.14.88:128.2.191.224 >/proc/fs/afs/cells
|
||||
|
||||
Where the parameters to the "add" command are the name of a cell and a list of
|
||||
volume location servers within that cell.
|
||||
volume location servers within that cell, with the latter separated by colons.
|
||||
|
||||
Filesystems can be mounted anywhere by commands similar to the following:
|
||||
|
||||
@ -42,11 +93,6 @@ Filesystems can be mounted anywhere by commands similar to the following:
|
||||
mount -t afs "#root.afs." /afs
|
||||
mount -t afs "#root.cell." /afs/cambridge
|
||||
|
||||
NB: When using this on Linux 2.4, the mount command has to be different,
|
||||
since the filesystem doesn't have access to the device name argument:
|
||||
|
||||
mount -t afs none /afs -ovol="#root.afs."
|
||||
|
||||
Where the initial character is either a hash or a percent symbol depending on
|
||||
whether you definitely want a R/W volume (hash) or whether you'd prefer a R/O
|
||||
volume, but are willing to use a R/W volume instead (percent).
|
||||
@ -60,55 +106,66 @@ named volume will be looked up in the cell specified during insmod.
|
||||
Additional cells can be added through /proc (see later section).
|
||||
|
||||
|
||||
===========
|
||||
MOUNTPOINTS
|
||||
===========
|
||||
|
||||
AFS has a concept of mountpoints. These are specially formatted symbolic links
|
||||
(of the same form as the "device name" passed to mount). kAFS presents these
|
||||
to the user as directories that have special properties:
|
||||
AFS has a concept of mountpoints. In AFS terms, these are specially formatted
|
||||
symbolic links (of the same form as the "device name" passed to mount). kAFS
|
||||
presents these to the user as directories that have a follow-link capability
|
||||
(ie: symbolic link semantics). If anyone attempts to access them, they will
|
||||
automatically cause the target volume to be mounted (if possible) on that site.
|
||||
|
||||
(*) They cannot be listed. Running a program like "ls" on them will incur an
|
||||
EREMOTE error (Object is remote).
|
||||
Automatically mounted filesystems will be automatically unmounted approximately
|
||||
twenty minutes after they were last used. Alternatively they can be unmounted
|
||||
directly with the umount() system call.
|
||||
|
||||
(*) Other objects can't be looked up inside of them. This also incurs an
|
||||
EREMOTE error.
|
||||
Manually unmounting an AFS volume will cause any idle submounts upon it to be
|
||||
culled first. If all are culled, then the requested volume will also be
|
||||
unmounted, otherwise error EBUSY will be returned.
|
||||
|
||||
(*) They can be queried with the readlink() system call, which will return
|
||||
the name of the mountpoint to which they point. The "readlink" program
|
||||
will also work.
|
||||
This can be used by the administrator to attempt to unmount the whole AFS tree
|
||||
mounted on /afs in one go by doing:
|
||||
|
||||
(*) They can be mounted on (which symbolic links can't).
|
||||
umount /afs
|
||||
|
||||
|
||||
===============
|
||||
PROC FILESYSTEM
|
||||
===============
|
||||
|
||||
The rxrpc module creates a number of files in various places in the /proc
|
||||
filesystem:
|
||||
|
||||
(*) Firstly, some information files are made available in a directory called
|
||||
"/proc/net/rxrpc/". These list the extant transport endpoint, peer,
|
||||
connection and call records.
|
||||
|
||||
(*) Secondly, some control files are made available in a directory called
|
||||
"/proc/sys/rxrpc/". Currently, all these files can be used for is to
|
||||
turn on various levels of tracing.
|
||||
|
||||
The AFS modules creates a "/proc/fs/afs/" directory and populates it:
|
||||
|
||||
(*) A "cells" file that lists cells currently known to the afs module.
|
||||
(*) A "cells" file that lists cells currently known to the afs module and
|
||||
their usage counts:
|
||||
|
||||
[root@andromeda ~]# cat /proc/fs/afs/cells
|
||||
USE NAME
|
||||
3 cambridge.redhat.com
|
||||
|
||||
(*) A directory per cell that contains files that list volume location
|
||||
servers, volumes, and active servers known within that cell.
|
||||
|
||||
[root@andromeda ~]# cat /proc/fs/afs/cambridge.redhat.com/servers
|
||||
USE ADDR STATE
|
||||
4 172.16.18.91 0
|
||||
[root@andromeda ~]# cat /proc/fs/afs/cambridge.redhat.com/vlservers
|
||||
ADDRESS
|
||||
172.16.18.91
|
||||
[root@andromeda ~]# cat /proc/fs/afs/cambridge.redhat.com/volumes
|
||||
USE STT VLID[0] VLID[1] VLID[2] NAME
|
||||
1 Val 20000000 20000001 20000002 root.afs
|
||||
|
||||
|
||||
=================
|
||||
THE CELL DATABASE
|
||||
=================
|
||||
|
||||
The filesystem maintains an internal database of all the cells it knows and
|
||||
the IP addresses of the volume location servers for those cells. The cell to
|
||||
which the computer belongs is added to the database when insmod is performed
|
||||
by the "rootcell=" argument.
|
||||
The filesystem maintains an internal database of all the cells it knows and the
|
||||
IP addresses of the volume location servers for those cells. The cell to which
|
||||
the system belongs is added to the database when insmod is performed by the
|
||||
"rootcell=" argument or, if compiled in, using a "kafs.rootcell=" argument on
|
||||
the kernel command line.
|
||||
|
||||
Further cells can be added by commands similar to the following:
|
||||
|
||||
@ -118,6 +175,50 @@ Further cells can be added by commands similar to the following:
|
||||
No other cell database operations are available at this time.
|
||||
|
||||
|
||||
========
|
||||
SECURITY
|
||||
========
|
||||
|
||||
Secure operations are initiated by acquiring a key using the klog program. A
|
||||
very primitive klog program is available at:
|
||||
|
||||
http://people.redhat.com/~dhowells/rxrpc/klog.c
|
||||
|
||||
This should be compiled by:
|
||||
|
||||
make klog LDLIBS="-lcrypto -lcrypt -lkrb4 -lkeyutils"
|
||||
|
||||
And then run as:
|
||||
|
||||
./klog
|
||||
|
||||
Assuming it's successful, this adds a key of type RxRPC, named for the service
|
||||
and cell, eg: "afs@<cellname>". This can be viewed with the keyctl program or
|
||||
by cat'ing /proc/keys:
|
||||
|
||||
[root@andromeda ~]# keyctl show
|
||||
Session Keyring
|
||||
-3 --alswrv 0 0 keyring: _ses.3268
|
||||
2 --alswrv 0 0 \_ keyring: _uid.0
|
||||
111416553 --als--v 0 0 \_ rxrpc: afs@CAMBRIDGE.REDHAT.COM
|
||||
|
||||
Currently the username, realm, password and proposed ticket lifetime are
|
||||
compiled in to the program.
|
||||
|
||||
It is not required to acquire a key before using AFS facilities, but if one is
|
||||
not acquired then all operations will be governed by the anonymous user parts
|
||||
of the ACLs.
|
||||
|
||||
If a key is acquired, then all AFS operations, including mounts and automounts,
|
||||
made by a possessor of that key will be secured with that key.
|
||||
|
||||
If a file is opened with a particular key and then the file descriptor is
|
||||
passed to a process that doesn't have that key (perhaps over an AF_UNIX
|
||||
socket), then the operations on the file will be made with key that was used to
|
||||
open the file.
|
||||
|
||||
|
||||
========
|
||||
EXAMPLES
|
||||
========
|
||||
|
||||
@ -125,8 +226,9 @@ Here's what I use to test this. Some of the names and IP addresses are local
|
||||
to my internal DNS. My "root.afs" partition has a mount point within it for
|
||||
some public volumes volumes.
|
||||
|
||||
insmod -S /tmp/rxrpc.o
|
||||
insmod -S /tmp/kafs.o rootcell=cambridge.redhat.com:172.16.18.73:172.16.18.91
|
||||
insmod /tmp/rxrpc.o
|
||||
insmod /tmp/rxkad.o
|
||||
insmod /tmp/kafs.o rootcell=cambridge.redhat.com:172.16.18.91
|
||||
|
||||
mount -t afs \%root.afs. /afs
|
||||
mount -t afs \%cambridge.redhat.com:root.cell. /afs/cambridge.redhat.com/
|
||||
@ -141,15 +243,7 @@ mount -t afs "#grand.central.org:root.service." /afs/grand.central.org/service
|
||||
mount -t afs "#grand.central.org:root.software." /afs/grand.central.org/software
|
||||
mount -t afs "#grand.central.org:root.user." /afs/grand.central.org/user
|
||||
|
||||
umount /afs/grand.central.org/user
|
||||
umount /afs/grand.central.org/software
|
||||
umount /afs/grand.central.org/service
|
||||
umount /afs/grand.central.org/project
|
||||
umount /afs/grand.central.org/doc
|
||||
umount /afs/grand.central.org/contrib
|
||||
umount /afs/grand.central.org/archive
|
||||
umount /afs/grand.central.org
|
||||
umount /afs/cambridge.redhat.com
|
||||
umount /afs
|
||||
rmmod kafs
|
||||
rmmod rxkad
|
||||
rmmod rxrpc
|
||||
|
@ -41,6 +41,7 @@ Table of Contents
|
||||
2.11 /proc/sys/fs/mqueue - POSIX message queues filesystem
|
||||
2.12 /proc/<pid>/oom_adj - Adjust the oom-killer score
|
||||
2.13 /proc/<pid>/oom_score - Display current oom-killer score
|
||||
2.14 /proc/<pid>/io - Display the IO accounting fields
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Preface
|
||||
@ -1420,6 +1421,15 @@ fewer messages that will be written. Message_burst controls when messages will
|
||||
be dropped. The default settings limit warning messages to one every five
|
||||
seconds.
|
||||
|
||||
warnings
|
||||
--------
|
||||
|
||||
This controls console messages from the networking stack that can occur because
|
||||
of problems on the network like duplicate address or bad checksums. Normally,
|
||||
this should be enabled, but if the problem persists the messages can be
|
||||
disabled.
|
||||
|
||||
|
||||
netdev_max_backlog
|
||||
------------------
|
||||
|
||||
@ -1990,3 +2000,107 @@ need to recompile the kernel, or even to reboot the system. The files in the
|
||||
command to write value into these files, thereby changing the default settings
|
||||
of the kernel.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
2.14 /proc/<pid>/io - Display the IO accounting fields
|
||||
-------------------------------------------------------
|
||||
|
||||
This file contains IO statistics for each running process
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
test:/tmp # dd if=/dev/zero of=/tmp/test.dat &
|
||||
[1] 3828
|
||||
|
||||
test:/tmp # cat /proc/3828/io
|
||||
rchar: 323934931
|
||||
wchar: 323929600
|
||||
syscr: 632687
|
||||
syscw: 632675
|
||||
read_bytes: 0
|
||||
write_bytes: 323932160
|
||||
cancelled_write_bytes: 0
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
rchar
|
||||
-----
|
||||
|
||||
I/O counter: chars read
|
||||
The number of bytes which this task has caused to be read from storage. This
|
||||
is simply the sum of bytes which this process passed to read() and pread().
|
||||
It includes things like tty IO and it is unaffected by whether or not actual
|
||||
physical disk IO was required (the read might have been satisfied from
|
||||
pagecache)
|
||||
|
||||
|
||||
wchar
|
||||
-----
|
||||
|
||||
I/O counter: chars written
|
||||
The number of bytes which this task has caused, or shall cause to be written
|
||||
to disk. Similar caveats apply here as with rchar.
|
||||
|
||||
|
||||
syscr
|
||||
-----
|
||||
|
||||
I/O counter: read syscalls
|
||||
Attempt to count the number of read I/O operations, i.e. syscalls like read()
|
||||
and pread().
|
||||
|
||||
|
||||
syscw
|
||||
-----
|
||||
|
||||
I/O counter: write syscalls
|
||||
Attempt to count the number of write I/O operations, i.e. syscalls like
|
||||
write() and pwrite().
|
||||
|
||||
|
||||
read_bytes
|
||||
----------
|
||||
|
||||
I/O counter: bytes read
|
||||
Attempt to count the number of bytes which this process really did cause to
|
||||
be fetched from the storage layer. Done at the submit_bio() level, so it is
|
||||
accurate for block-backed filesystems. <please add status regarding NFS and
|
||||
CIFS at a later time>
|
||||
|
||||
|
||||
write_bytes
|
||||
-----------
|
||||
|
||||
I/O counter: bytes written
|
||||
Attempt to count the number of bytes which this process caused to be sent to
|
||||
the storage layer. This is done at page-dirtying time.
|
||||
|
||||
|
||||
cancelled_write_bytes
|
||||
---------------------
|
||||
|
||||
The big inaccuracy here is truncate. If a process writes 1MB to a file and
|
||||
then deletes the file, it will in fact perform no writeout. But it will have
|
||||
been accounted as having caused 1MB of write.
|
||||
In other words: The number of bytes which this process caused to not happen,
|
||||
by truncating pagecache. A task can cause "negative" IO too. If this task
|
||||
truncates some dirty pagecache, some IO which another task has been accounted
|
||||
for (in it's write_bytes) will not be happening. We _could_ just subtract that
|
||||
from the truncating task's write_bytes, but there is information loss in doing
|
||||
that.
|
||||
|
||||
|
||||
Note
|
||||
----
|
||||
|
||||
At its current implementation state, this is a bit racy on 32-bit machines: if
|
||||
process A reads process B's /proc/pid/io while process B is updating one of
|
||||
those 64-bit counters, process A could see an intermediate result.
|
||||
|
||||
|
||||
More information about this can be found within the taskstats documentation in
|
||||
Documentation/accounting.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
@ -65,7 +65,7 @@ Accessing legacy resources through sysfs
|
||||
----------------------------------------
|
||||
|
||||
Legacy I/O port and ISA memory resources are also provided in sysfs if the
|
||||
underlying platform supports them. They're located in the PCI class heirarchy,
|
||||
underlying platform supports them. They're located in the PCI class hierarchy,
|
||||
e.g.
|
||||
|
||||
/sys/class/pci_bus/0000:17/
|
||||
|
@ -617,6 +617,11 @@ struct address_space_operations {
|
||||
In this case the prepare_write will be retried one the lock is
|
||||
regained.
|
||||
|
||||
Note: the page _must not_ be marked uptodate in this function
|
||||
(or anywhere else) unless it actually is uptodate right now. As
|
||||
soon as a page is marked uptodate, it is possible for a concurrent
|
||||
read(2) to copy it to userspace.
|
||||
|
||||
commit_write: If prepare_write succeeds, new data will be copied
|
||||
into the page and then commit_write will be called. It will
|
||||
typically update the size of the file (if appropriate) and
|
||||
|
@ -27,7 +27,7 @@ The exact capabilities of GPIOs vary between systems. Common options:
|
||||
- Output values are writable (high=1, low=0). Some chips also have
|
||||
options about how that value is driven, so that for example only one
|
||||
value might be driven ... supporting "wire-OR" and similar schemes
|
||||
for the other value.
|
||||
for the other value (notably, "open drain" signaling).
|
||||
|
||||
- Input values are likewise readable (1, 0). Some chips support readback
|
||||
of pins configured as "output", which is very useful in such "wire-OR"
|
||||
@ -105,12 +105,15 @@ setting up a platform_device using the GPIO, is mark its direction:
|
||||
|
||||
/* set as input or output, returning 0 or negative errno */
|
||||
int gpio_direction_input(unsigned gpio);
|
||||
int gpio_direction_output(unsigned gpio);
|
||||
int gpio_direction_output(unsigned gpio, int value);
|
||||
|
||||
The return value is zero for success, else a negative errno. It should
|
||||
be checked, since the get/set calls don't have error returns and since
|
||||
misconfiguration is possible. (These calls could sleep.)
|
||||
|
||||
For output GPIOs, the value provided becomes the initial output value.
|
||||
This helps avoid signal glitching during system startup.
|
||||
|
||||
Setting the direction can fail if the GPIO number is invalid, or when
|
||||
that particular GPIO can't be used in that mode. It's generally a bad
|
||||
idea to rely on boot firmware to have set the direction correctly, since
|
||||
@ -244,6 +247,35 @@ with gpio_get_value(), for example to initialize or update driver state
|
||||
when the IRQ is edge-triggered.
|
||||
|
||||
|
||||
Emulating Open Drain Signals
|
||||
----------------------------
|
||||
Sometimes shared signals need to use "open drain" signaling, where only the
|
||||
low signal level is actually driven. (That term applies to CMOS transistors;
|
||||
"open collector" is used for TTL.) A pullup resistor causes the high signal
|
||||
level. This is sometimes called a "wire-AND"; or more practically, from the
|
||||
negative logic (low=true) perspective this is a "wire-OR".
|
||||
|
||||
One common example of an open drain signal is a shared active-low IRQ line.
|
||||
Also, bidirectional data bus signals sometimes use open drain signals.
|
||||
|
||||
Some GPIO controllers directly support open drain outputs; many don't. When
|
||||
you need open drain signaling but your hardware doesn't directly support it,
|
||||
there's a common idiom you can use to emulate it with any GPIO pin that can
|
||||
be used as either an input or an output:
|
||||
|
||||
LOW: gpio_direction_output(gpio, 0) ... this drives the signal
|
||||
and overrides the pullup.
|
||||
|
||||
HIGH: gpio_direction_input(gpio) ... this turns off the output,
|
||||
so the pullup (or some other device) controls the signal.
|
||||
|
||||
If you are "driving" the signal high but gpio_get_value(gpio) reports a low
|
||||
value (after the appropriate rise time passes), you know some other component
|
||||
is driving the shared signal low. That's not necessarily an error. As one
|
||||
common example, that's how I2C clocks are stretched: a slave that needs a
|
||||
slower clock delays the rising edge of SCK, and the I2C master adjusts its
|
||||
signaling rate accordingly.
|
||||
|
||||
|
||||
What do these conventions omit?
|
||||
===============================
|
||||
|
@ -135,6 +135,16 @@ Give 0 for unused sensor. Any other value is invalid. To configure this at
|
||||
startup, consult lm_sensors's /etc/sensors.conf. (2 = thermistor;
|
||||
3 = thermal diode)
|
||||
|
||||
|
||||
Fan speed control
|
||||
-----------------
|
||||
|
||||
The fan speed control features are limited to manual PWM mode. Automatic
|
||||
"Smart Guardian" mode control handling is not implemented. However
|
||||
if you want to go for "manual mode" just write 1 to pwmN_enable.
|
||||
|
||||
If you are only able to control the fan speed with very small PWM values,
|
||||
try lowering the PWM base frequency (pwm1_freq). Depending on the fan,
|
||||
it may give you a somewhat greater control range. The same frequency is
|
||||
used to drive all fan outputs, which is why pwm2_freq and pwm3_freq are
|
||||
read-only.
|
||||
|
@ -166,16 +166,21 @@ pwm[1-*] Pulse width modulation fan control.
|
||||
|
||||
pwm[1-*]_enable
|
||||
Switch PWM on and off.
|
||||
Not always present even if fan*_pwm is.
|
||||
Not always present even if pwmN is.
|
||||
0: turn off
|
||||
1: turn on in manual mode
|
||||
2+: turn on in automatic mode
|
||||
Check individual chip documentation files for automatic mode details.
|
||||
Check individual chip documentation files for automatic mode
|
||||
details.
|
||||
RW
|
||||
|
||||
pwm[1-*]_mode
|
||||
0: DC mode
|
||||
1: PWM mode
|
||||
pwm[1-*]_mode 0: DC mode (direct current)
|
||||
1: PWM mode (pulse-width modulation)
|
||||
RW
|
||||
|
||||
pwm[1-*]_freq Base PWM frequency in Hz.
|
||||
Only possibly available when pwmN_mode is PWM, but not always
|
||||
present even then.
|
||||
RW
|
||||
|
||||
pwm[1-*]_auto_channels_temp
|
||||
|
@ -2,26 +2,29 @@ Kernel driver w83627ehf
|
||||
=======================
|
||||
|
||||
Supported chips:
|
||||
* Winbond W83627EHF/EHG (ISA access ONLY)
|
||||
* Winbond W83627EHF/EHG/DHG (ISA access ONLY)
|
||||
Prefix: 'w83627ehf'
|
||||
Addresses scanned: ISA address retrieved from Super I/O registers
|
||||
Datasheet: http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/W83627EHF_%20W83627EHGb.pdf
|
||||
Datasheet:
|
||||
http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/W83627EHF_%20W83627EHGb.pdf
|
||||
DHG datasheet confidential.
|
||||
|
||||
Authors:
|
||||
Jean Delvare <khali@linux-fr.org>
|
||||
Yuan Mu (Winbond)
|
||||
Rudolf Marek <r.marek@assembler.cz>
|
||||
David Hubbard <david.c.hubbard@gmail.com>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the Winbond W83627EHF and W83627EHG
|
||||
super I/O chips. We will refer to them collectively as Winbond chips.
|
||||
This driver implements support for the Winbond W83627EHF, W83627EHG, and
|
||||
W83627DHG super I/O chips. We will refer to them collectively as Winbond chips.
|
||||
|
||||
The chips implement three temperature sensors, five fan rotation
|
||||
speed sensors, ten analog voltage sensors, alarms with beep warnings (control
|
||||
unimplemented), and some automatic fan regulation strategies (plus manual
|
||||
fan control mode).
|
||||
speed sensors, ten analog voltage sensors (only nine for the 627DHG), alarms
|
||||
with beep warnings (control unimplemented), and some automatic fan regulation
|
||||
strategies (plus manual fan control mode).
|
||||
|
||||
Temperatures are measured in degrees Celsius and measurement resolution is 1
|
||||
degC for temp1 and 0.5 degC for temp2 and temp3. An alarm is triggered when
|
||||
@ -55,6 +58,9 @@ prog -> pwm4 (the programmable setting is not supported by the driver)
|
||||
/sys files
|
||||
----------
|
||||
|
||||
name - this is a standard hwmon device entry. For the W83627EHF and W83627EHG,
|
||||
it is set to "w83627ehf" and for the W83627DHG it is set to "w83627dhg"
|
||||
|
||||
pwm[1-4] - this file stores PWM duty cycle or DC value (fan speed) in range:
|
||||
0 (stop) to 255 (full)
|
||||
|
||||
@ -83,3 +89,37 @@ pwm[1-4]_stop_time - how many milliseconds [ms] must elapse to switch
|
||||
|
||||
Note: last two functions are influenced by other control bits, not yet exported
|
||||
by the driver, so a change might not have any effect.
|
||||
|
||||
Implementation Details
|
||||
----------------------
|
||||
|
||||
Future driver development should bear in mind that the following registers have
|
||||
different functions on the 627EHF and the 627DHG. Some registers also have
|
||||
different power-on default values, but BIOS should already be loading
|
||||
appropriate defaults. Note that bank selection must be performed as is currently
|
||||
done in the driver for all register addresses.
|
||||
|
||||
0x49: only on DHG, selects temperature source for AUX fan, CPU fan0
|
||||
0x4a: not completely documented for the EHF and the DHG documentation assigns
|
||||
different behavior to bits 7 and 6, including extending the temperature
|
||||
input selection to SmartFan I, not just SmartFan III. Testing on the EHF
|
||||
will reveal whether they are compatible or not.
|
||||
|
||||
0x58: Chip ID: 0xa1=EHF 0xc1=DHG
|
||||
0x5e: only on DHG, has bits to enable "current mode" temperature detection and
|
||||
critical temperature protection
|
||||
0x45b: only on EHF, bit 3, vin4 alarm (EHF supports 10 inputs, only 9 on DHG)
|
||||
0x552: only on EHF, vin4
|
||||
0x558: only on EHF, vin4 high limit
|
||||
0x559: only on EHF, vin4 low limit
|
||||
0x6b: only on DHG, SYS fan critical temperature
|
||||
0x6c: only on DHG, CPU fan0 critical temperature
|
||||
0x6d: only on DHG, AUX fan critical temperature
|
||||
0x6e: only on DHG, CPU fan1 critical temperature
|
||||
|
||||
0x50-0x55 and 0x650-0x657 are marked "Test Register" for the EHF, but "Reserved
|
||||
Register" for the DHG
|
||||
|
||||
The DHG also supports PECI, where the DHG queries Intel CPU temperatures, and
|
||||
the ICH8 southbridge gets that data via PECI from the DHG, so that the
|
||||
southbridge drives the fans. And the DHG supports SST, a one-wire serial bus.
|
||||
|
@ -1,728 +0,0 @@
|
||||
IBM ThinkPad ACPI Extras Driver
|
||||
|
||||
Version 0.12
|
||||
17 August 2005
|
||||
|
||||
Borislav Deianov <borislav@users.sf.net>
|
||||
http://ibm-acpi.sf.net/
|
||||
|
||||
|
||||
This is a Linux ACPI driver for the IBM ThinkPad laptops. It supports
|
||||
various features of these laptops which are accessible through the
|
||||
ACPI framework but not otherwise supported by the generic Linux ACPI
|
||||
drivers.
|
||||
|
||||
|
||||
Status
|
||||
------
|
||||
|
||||
The features currently supported are the following (see below for
|
||||
detailed description):
|
||||
|
||||
- Fn key combinations
|
||||
- Bluetooth enable and disable
|
||||
- video output switching, expansion control
|
||||
- ThinkLight on and off
|
||||
- limited docking and undocking
|
||||
- UltraBay eject
|
||||
- CMOS control
|
||||
- LED control
|
||||
- ACPI sounds
|
||||
- temperature sensors
|
||||
- Experimental: embedded controller register dump
|
||||
- LCD brightness control
|
||||
- Volume control
|
||||
- Experimental: fan speed, fan enable/disable
|
||||
- Experimental: WAN enable and disable
|
||||
|
||||
A compatibility table by model and feature is maintained on the web
|
||||
site, http://ibm-acpi.sf.net/. I appreciate any success or failure
|
||||
reports, especially if they add to or correct the compatibility table.
|
||||
Please include the following information in your report:
|
||||
|
||||
- ThinkPad model name
|
||||
- a copy of your DSDT, from /proc/acpi/dsdt
|
||||
- which driver features work and which don't
|
||||
- the observed behavior of non-working features
|
||||
|
||||
Any other comments or patches are also more than welcome.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
If you are compiling this driver as included in the Linux kernel
|
||||
sources, simply enable the CONFIG_ACPI_IBM option (Power Management /
|
||||
ACPI / IBM ThinkPad Laptop Extras).
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
The driver creates the /proc/acpi/ibm directory. There is a file under
|
||||
that directory for each feature described below. Note that while the
|
||||
driver is still in the alpha stage, the exact proc file format and
|
||||
commands supported by the various features is guaranteed to change
|
||||
frequently.
|
||||
|
||||
Driver version -- /proc/acpi/ibm/driver
|
||||
---------------------------------------
|
||||
|
||||
The driver name and version. No commands can be written to this file.
|
||||
|
||||
Hot keys -- /proc/acpi/ibm/hotkey
|
||||
---------------------------------
|
||||
|
||||
Without this driver, only the Fn-F4 key (sleep button) generates an
|
||||
ACPI event. With the driver loaded, the hotkey feature enabled and the
|
||||
mask set (see below), the various hot keys generate ACPI events in the
|
||||
following format:
|
||||
|
||||
ibm/hotkey HKEY 00000080 0000xxxx
|
||||
|
||||
The last four digits vary depending on the key combination pressed.
|
||||
All labeled Fn-Fx key combinations generate distinct events. In
|
||||
addition, the lid microswitch and some docking station buttons may
|
||||
also generate such events.
|
||||
|
||||
The following commands can be written to this file:
|
||||
|
||||
echo enable > /proc/acpi/ibm/hotkey -- enable the hot keys feature
|
||||
echo disable > /proc/acpi/ibm/hotkey -- disable the hot keys feature
|
||||
echo 0xffff > /proc/acpi/ibm/hotkey -- enable all possible hot keys
|
||||
echo 0x0000 > /proc/acpi/ibm/hotkey -- disable all possible hot keys
|
||||
... any other 4-hex-digit mask ...
|
||||
echo reset > /proc/acpi/ibm/hotkey -- restore the original mask
|
||||
|
||||
The bit mask allows some control over which hot keys generate ACPI
|
||||
events. Not all bits in the mask can be modified. Not all bits that
|
||||
can be modified do anything. Not all hot keys can be individually
|
||||
controlled by the mask. Most recent ThinkPad models honor the
|
||||
following bits (assuming the hot keys feature has been enabled):
|
||||
|
||||
key bit behavior when set behavior when unset
|
||||
|
||||
Fn-F3 always generates ACPI event
|
||||
Fn-F4 always generates ACPI event
|
||||
Fn-F5 0010 generate ACPI event enable/disable Bluetooth
|
||||
Fn-F7 0040 generate ACPI event switch LCD and external display
|
||||
Fn-F8 0080 generate ACPI event expand screen or none
|
||||
Fn-F9 0100 generate ACPI event none
|
||||
Fn-F12 always generates ACPI event
|
||||
|
||||
Some models do not support all of the above. For example, the T30 does
|
||||
not support Fn-F5 and Fn-F9. Other models do not support the mask at
|
||||
all. On those models, hot keys cannot be controlled individually.
|
||||
|
||||
Note that enabling ACPI events for some keys prevents their default
|
||||
behavior. For example, if events for Fn-F5 are enabled, that key will
|
||||
no longer enable/disable Bluetooth by itself. This can still be done
|
||||
from an acpid handler for the ibm/hotkey event.
|
||||
|
||||
Note also that not all Fn key combinations are supported through
|
||||
ACPI. For example, on the X40, the brightness, volume and "Access IBM"
|
||||
buttons do not generate ACPI events even with this driver. They *can*
|
||||
be used through the "ThinkPad Buttons" utility, see
|
||||
http://www.nongnu.org/tpb/
|
||||
|
||||
Bluetooth -- /proc/acpi/ibm/bluetooth
|
||||
-------------------------------------
|
||||
|
||||
This feature shows the presence and current state of a Bluetooth
|
||||
device. If Bluetooth is installed, the following commands can be used:
|
||||
|
||||
echo enable > /proc/acpi/ibm/bluetooth
|
||||
echo disable > /proc/acpi/ibm/bluetooth
|
||||
|
||||
Video output control -- /proc/acpi/ibm/video
|
||||
--------------------------------------------
|
||||
|
||||
This feature allows control over the devices used for video output -
|
||||
LCD, CRT or DVI (if available). The following commands are available:
|
||||
|
||||
echo lcd_enable > /proc/acpi/ibm/video
|
||||
echo lcd_disable > /proc/acpi/ibm/video
|
||||
echo crt_enable > /proc/acpi/ibm/video
|
||||
echo crt_disable > /proc/acpi/ibm/video
|
||||
echo dvi_enable > /proc/acpi/ibm/video
|
||||
echo dvi_disable > /proc/acpi/ibm/video
|
||||
echo auto_enable > /proc/acpi/ibm/video
|
||||
echo auto_disable > /proc/acpi/ibm/video
|
||||
echo expand_toggle > /proc/acpi/ibm/video
|
||||
echo video_switch > /proc/acpi/ibm/video
|
||||
|
||||
Each video output device can be enabled or disabled individually.
|
||||
Reading /proc/acpi/ibm/video shows the status of each device.
|
||||
|
||||
Automatic video switching can be enabled or disabled. When automatic
|
||||
video switching is enabled, certain events (e.g. opening the lid,
|
||||
docking or undocking) cause the video output device to change
|
||||
automatically. While this can be useful, it also causes flickering
|
||||
and, on the X40, video corruption. By disabling automatic switching,
|
||||
the flickering or video corruption can be avoided.
|
||||
|
||||
The video_switch command cycles through the available video outputs
|
||||
(it simulates the behavior of Fn-F7).
|
||||
|
||||
Video expansion can be toggled through this feature. This controls
|
||||
whether the display is expanded to fill the entire LCD screen when a
|
||||
mode with less than full resolution is used. Note that the current
|
||||
video expansion status cannot be determined through this feature.
|
||||
|
||||
Note that on many models (particularly those using Radeon graphics
|
||||
chips) the X driver configures the video card in a way which prevents
|
||||
Fn-F7 from working. This also disables the video output switching
|
||||
features of this driver, as it uses the same ACPI methods as
|
||||
Fn-F7. Video switching on the console should still work.
|
||||
|
||||
UPDATE: There's now a patch for the X.org Radeon driver which
|
||||
addresses this issue. Some people are reporting success with the patch
|
||||
while others are still having problems. For more information:
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=2000
|
||||
|
||||
ThinkLight control -- /proc/acpi/ibm/light
|
||||
------------------------------------------
|
||||
|
||||
The current status of the ThinkLight can be found in this file. A few
|
||||
models which do not make the status available will show it as
|
||||
"unknown". The available commands are:
|
||||
|
||||
echo on > /proc/acpi/ibm/light
|
||||
echo off > /proc/acpi/ibm/light
|
||||
|
||||
Docking / undocking -- /proc/acpi/ibm/dock
|
||||
------------------------------------------
|
||||
|
||||
Docking and undocking (e.g. with the X4 UltraBase) requires some
|
||||
actions to be taken by the operating system to safely make or break
|
||||
the electrical connections with the dock.
|
||||
|
||||
The docking feature of this driver generates the following ACPI events:
|
||||
|
||||
ibm/dock GDCK 00000003 00000001 -- eject request
|
||||
ibm/dock GDCK 00000003 00000002 -- undocked
|
||||
ibm/dock GDCK 00000000 00000003 -- docked
|
||||
|
||||
NOTE: These events will only be generated if the laptop was docked
|
||||
when originally booted. This is due to the current lack of support for
|
||||
hot plugging of devices in the Linux ACPI framework. If the laptop was
|
||||
booted while not in the dock, the following message is shown in the
|
||||
logs:
|
||||
|
||||
Mar 17 01:42:34 aero kernel: ibm_acpi: dock device not present
|
||||
|
||||
In this case, no dock-related events are generated but the dock and
|
||||
undock commands described below still work. They can be executed
|
||||
manually or triggered by Fn key combinations (see the example acpid
|
||||
configuration files included in the driver tarball package available
|
||||
on the web site).
|
||||
|
||||
When the eject request button on the dock is pressed, the first event
|
||||
above is generated. The handler for this event should issue the
|
||||
following command:
|
||||
|
||||
echo undock > /proc/acpi/ibm/dock
|
||||
|
||||
After the LED on the dock goes off, it is safe to eject the laptop.
|
||||
Note: if you pressed this key by mistake, go ahead and eject the
|
||||
laptop, then dock it back in. Otherwise, the dock may not function as
|
||||
expected.
|
||||
|
||||
When the laptop is docked, the third event above is generated. The
|
||||
handler for this event should issue the following command to fully
|
||||
enable the dock:
|
||||
|
||||
echo dock > /proc/acpi/ibm/dock
|
||||
|
||||
The contents of the /proc/acpi/ibm/dock file shows the current status
|
||||
of the dock, as provided by the ACPI framework.
|
||||
|
||||
The docking support in this driver does not take care of enabling or
|
||||
disabling any other devices you may have attached to the dock. For
|
||||
example, a CD drive plugged into the UltraBase needs to be disabled or
|
||||
enabled separately. See the provided example acpid configuration files
|
||||
for how this can be accomplished.
|
||||
|
||||
There is no support yet for PCI devices that may be attached to a
|
||||
docking station, e.g. in the ThinkPad Dock II. The driver currently
|
||||
does not recognize, enable or disable such devices. This means that
|
||||
the only docking stations currently supported are the X-series
|
||||
UltraBase docks and "dumb" port replicators like the Mini Dock (the
|
||||
latter don't need any ACPI support, actually).
|
||||
|
||||
UltraBay eject -- /proc/acpi/ibm/bay
|
||||
------------------------------------
|
||||
|
||||
Inserting or ejecting an UltraBay device requires some actions to be
|
||||
taken by the operating system to safely make or break the electrical
|
||||
connections with the device.
|
||||
|
||||
This feature generates the following ACPI events:
|
||||
|
||||
ibm/bay MSTR 00000003 00000000 -- eject request
|
||||
ibm/bay MSTR 00000001 00000000 -- eject lever inserted
|
||||
|
||||
NOTE: These events will only be generated if the UltraBay was present
|
||||
when the laptop was originally booted (on the X series, the UltraBay
|
||||
is in the dock, so it may not be present if the laptop was undocked).
|
||||
This is due to the current lack of support for hot plugging of devices
|
||||
in the Linux ACPI framework. If the laptop was booted without the
|
||||
UltraBay, the following message is shown in the logs:
|
||||
|
||||
Mar 17 01:42:34 aero kernel: ibm_acpi: bay device not present
|
||||
|
||||
In this case, no bay-related events are generated but the eject
|
||||
command described below still works. It can be executed manually or
|
||||
triggered by a hot key combination.
|
||||
|
||||
Sliding the eject lever generates the first event shown above. The
|
||||
handler for this event should take whatever actions are necessary to
|
||||
shut down the device in the UltraBay (e.g. call idectl), then issue
|
||||
the following command:
|
||||
|
||||
echo eject > /proc/acpi/ibm/bay
|
||||
|
||||
After the LED on the UltraBay goes off, it is safe to pull out the
|
||||
device.
|
||||
|
||||
When the eject lever is inserted, the second event above is
|
||||
generated. The handler for this event should take whatever actions are
|
||||
necessary to enable the UltraBay device (e.g. call idectl).
|
||||
|
||||
The contents of the /proc/acpi/ibm/bay file shows the current status
|
||||
of the UltraBay, as provided by the ACPI framework.
|
||||
|
||||
EXPERIMENTAL warm eject support on the 600e/x, A22p and A3x (To use
|
||||
this feature, you need to supply the experimental=1 parameter when
|
||||
loading the module):
|
||||
|
||||
These models do not have a button near the UltraBay device to request
|
||||
a hot eject but rather require the laptop to be put to sleep
|
||||
(suspend-to-ram) before the bay device is ejected or inserted).
|
||||
The sequence of steps to eject the device is as follows:
|
||||
|
||||
echo eject > /proc/acpi/ibm/bay
|
||||
put the ThinkPad to sleep
|
||||
remove the drive
|
||||
resume from sleep
|
||||
cat /proc/acpi/ibm/bay should show that the drive was removed
|
||||
|
||||
On the A3x, both the UltraBay 2000 and UltraBay Plus devices are
|
||||
supported. Use "eject2" instead of "eject" for the second bay.
|
||||
|
||||
Note: the UltraBay eject support on the 600e/x, A22p and A3x is
|
||||
EXPERIMENTAL and may not work as expected. USE WITH CAUTION!
|
||||
|
||||
CMOS control -- /proc/acpi/ibm/cmos
|
||||
-----------------------------------
|
||||
|
||||
This feature is used internally by the ACPI firmware to control the
|
||||
ThinkLight on most newer ThinkPad models. It may also control LCD
|
||||
brightness, sounds volume and more, but only on some models.
|
||||
|
||||
The commands are non-negative integer numbers:
|
||||
|
||||
echo 0 >/proc/acpi/ibm/cmos
|
||||
echo 1 >/proc/acpi/ibm/cmos
|
||||
echo 2 >/proc/acpi/ibm/cmos
|
||||
...
|
||||
|
||||
The range of valid numbers is 0 to 21, but not all have an effect and
|
||||
the behavior varies from model to model. Here is the behavior on the
|
||||
X40 (tpb is the ThinkPad Buttons utility):
|
||||
|
||||
0 - no effect but tpb reports "Volume down"
|
||||
1 - no effect but tpb reports "Volume up"
|
||||
2 - no effect but tpb reports "Mute on"
|
||||
3 - simulate pressing the "Access IBM" button
|
||||
4 - LCD brightness up
|
||||
5 - LCD brightness down
|
||||
11 - toggle screen expansion
|
||||
12 - ThinkLight on
|
||||
13 - ThinkLight off
|
||||
14 - no effect but tpb reports ThinkLight status change
|
||||
|
||||
LED control -- /proc/acpi/ibm/led
|
||||
---------------------------------
|
||||
|
||||
Some of the LED indicators can be controlled through this feature. The
|
||||
available commands are:
|
||||
|
||||
echo '<led number> on' >/proc/acpi/ibm/led
|
||||
echo '<led number> off' >/proc/acpi/ibm/led
|
||||
echo '<led number> blink' >/proc/acpi/ibm/led
|
||||
|
||||
The <led number> range is 0 to 7. The set of LEDs that can be
|
||||
controlled varies from model to model. Here is the mapping on the X40:
|
||||
|
||||
0 - power
|
||||
1 - battery (orange)
|
||||
2 - battery (green)
|
||||
3 - UltraBase
|
||||
4 - UltraBay
|
||||
7 - standby
|
||||
|
||||
All of the above can be turned on and off and can be made to blink.
|
||||
|
||||
ACPI sounds -- /proc/acpi/ibm/beep
|
||||
----------------------------------
|
||||
|
||||
The BEEP method is used internally by the ACPI firmware to provide
|
||||
audible alerts in various situations. This feature allows the same
|
||||
sounds to be triggered manually.
|
||||
|
||||
The commands are non-negative integer numbers:
|
||||
|
||||
echo <number> >/proc/acpi/ibm/beep
|
||||
|
||||
The valid <number> range is 0 to 17. Not all numbers trigger sounds
|
||||
and the sounds vary from model to model. Here is the behavior on the
|
||||
X40:
|
||||
|
||||
0 - stop a sound in progress (but use 17 to stop 16)
|
||||
2 - two beeps, pause, third beep ("low battery")
|
||||
3 - single beep
|
||||
4 - high, followed by low-pitched beep ("unable")
|
||||
5 - single beep
|
||||
6 - very high, followed by high-pitched beep ("AC/DC")
|
||||
7 - high-pitched beep
|
||||
9 - three short beeps
|
||||
10 - very long beep
|
||||
12 - low-pitched beep
|
||||
15 - three high-pitched beeps repeating constantly, stop with 0
|
||||
16 - one medium-pitched beep repeating constantly, stop with 17
|
||||
17 - stop 16
|
||||
|
||||
Temperature sensors -- /proc/acpi/ibm/thermal
|
||||
---------------------------------------------
|
||||
|
||||
Most ThinkPads include six or more separate temperature sensors but
|
||||
only expose the CPU temperature through the standard ACPI methods.
|
||||
This feature shows readings from up to eight different sensors on older
|
||||
ThinkPads, and it has experimental support for up to sixteen different
|
||||
sensors on newer ThinkPads. Readings from sensors that are not available
|
||||
return -128.
|
||||
|
||||
No commands can be written to this file.
|
||||
|
||||
EXPERIMENTAL: The 16-sensors feature is marked EXPERIMENTAL because the
|
||||
implementation directly accesses hardware registers and may not work as
|
||||
expected. USE WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module. When EXPERIMENTAL
|
||||
mode is enabled, reading the first 8 sensors on newer ThinkPads will
|
||||
also use an new experimental thermal sensor access mode.
|
||||
|
||||
For example, on the X40, a typical output may be:
|
||||
temperatures: 42 42 45 41 36 -128 33 -128
|
||||
|
||||
EXPERIMENTAL: On the T43/p, a typical output may be:
|
||||
temperatures: 48 48 36 52 38 -128 31 -128 48 52 48 -128 -128 -128 -128 -128
|
||||
|
||||
The mapping of thermal sensors to physical locations varies depending on
|
||||
system-board model (and thus, on ThinkPad model).
|
||||
|
||||
http://thinkwiki.org/wiki/Thermal_Sensors is a public wiki page that
|
||||
tries to track down these locations for various models.
|
||||
|
||||
Most (newer?) models seem to follow this pattern:
|
||||
|
||||
1: CPU
|
||||
2: (depends on model)
|
||||
3: (depends on model)
|
||||
4: GPU
|
||||
5: Main battery: main sensor
|
||||
6: Bay battery: main sensor
|
||||
7: Main battery: secondary sensor
|
||||
8: Bay battery: secondary sensor
|
||||
9-15: (depends on model)
|
||||
|
||||
For the R51 (source: Thomas Gruber):
|
||||
2: Mini-PCI
|
||||
3: Internal HDD
|
||||
|
||||
For the T43, T43/p (source: Shmidoax/Thinkwiki.org)
|
||||
http://thinkwiki.org/wiki/Thermal_Sensors#ThinkPad_T43.2C_T43p
|
||||
2: System board, left side (near PCMCIA slot), reported as HDAPS temp
|
||||
3: PCMCIA slot
|
||||
9: MCH (northbridge) to DRAM Bus
|
||||
10: ICH (southbridge), under Mini-PCI card, under touchpad
|
||||
11: Power regulator, underside of system board, below F2 key
|
||||
|
||||
The A31 has a very atypical layout for the thermal sensors
|
||||
(source: Milos Popovic, http://thinkwiki.org/wiki/Thermal_Sensors#ThinkPad_A31)
|
||||
1: CPU
|
||||
2: Main Battery: main sensor
|
||||
3: Power Converter
|
||||
4: Bay Battery: main sensor
|
||||
5: MCH (northbridge)
|
||||
6: PCMCIA/ambient
|
||||
7: Main Battery: secondary sensor
|
||||
8: Bay Battery: secondary sensor
|
||||
|
||||
|
||||
EXPERIMENTAL: Embedded controller register dump -- /proc/acpi/ibm/ecdump
|
||||
------------------------------------------------------------------------
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
|
||||
This feature dumps the values of 256 embedded controller
|
||||
registers. Values which have changed since the last time the registers
|
||||
were dumped are marked with a star:
|
||||
|
||||
[root@x40 ibm-acpi]# cat /proc/acpi/ibm/ecdump
|
||||
EC +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f
|
||||
EC 0x00: a7 47 87 01 fe 96 00 08 01 00 cb 00 00 00 40 00
|
||||
EC 0x10: 00 00 ff ff f4 3c 87 09 01 ff 42 01 ff ff 0d 00
|
||||
EC 0x20: 00 00 00 00 00 00 00 00 00 00 00 03 43 00 00 80
|
||||
EC 0x30: 01 07 1a 00 30 04 00 00 *85 00 00 10 00 50 00 00
|
||||
EC 0x40: 00 00 00 00 00 00 14 01 00 04 00 00 00 00 00 00
|
||||
EC 0x50: 00 c0 02 0d 00 01 01 02 02 03 03 03 03 *bc *02 *bc
|
||||
EC 0x60: *02 *bc *02 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0x70: 00 00 00 00 00 12 30 40 *24 *26 *2c *27 *20 80 *1f 80
|
||||
EC 0x80: 00 00 00 06 *37 *0e 03 00 00 00 0e 07 00 00 00 00
|
||||
EC 0x90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xa0: *ff 09 ff 09 ff ff *64 00 *00 *00 *a2 41 *ff *ff *e0 00
|
||||
EC 0xb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xd0: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xe0: 00 00 00 00 00 00 00 00 11 20 49 04 24 06 55 03
|
||||
EC 0xf0: 31 55 48 54 35 38 57 57 08 2f 45 73 07 65 6c 1a
|
||||
|
||||
This feature can be used to determine the register holding the fan
|
||||
speed on some models. To do that, do the following:
|
||||
|
||||
- make sure the battery is fully charged
|
||||
- make sure the fan is running
|
||||
- run 'cat /proc/acpi/ibm/ecdump' several times, once per second or so
|
||||
|
||||
The first step makes sure various charging-related values don't
|
||||
vary. The second ensures that the fan-related values do vary, since
|
||||
the fan speed fluctuates a bit. The third will (hopefully) mark the
|
||||
fan register with a star:
|
||||
|
||||
[root@x40 ibm-acpi]# cat /proc/acpi/ibm/ecdump
|
||||
EC +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f
|
||||
EC 0x00: a7 47 87 01 fe 96 00 08 01 00 cb 00 00 00 40 00
|
||||
EC 0x10: 00 00 ff ff f4 3c 87 09 01 ff 42 01 ff ff 0d 00
|
||||
EC 0x20: 00 00 00 00 00 00 00 00 00 00 00 03 43 00 00 80
|
||||
EC 0x30: 01 07 1a 00 30 04 00 00 85 00 00 10 00 50 00 00
|
||||
EC 0x40: 00 00 00 00 00 00 14 01 00 04 00 00 00 00 00 00
|
||||
EC 0x50: 00 c0 02 0d 00 01 01 02 02 03 03 03 03 bc 02 bc
|
||||
EC 0x60: 02 bc 02 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0x70: 00 00 00 00 00 12 30 40 24 27 2c 27 21 80 1f 80
|
||||
EC 0x80: 00 00 00 06 *be 0d 03 00 00 00 0e 07 00 00 00 00
|
||||
EC 0x90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xa0: ff 09 ff 09 ff ff 64 00 00 00 a2 41 ff ff e0 00
|
||||
EC 0xb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xd0: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xe0: 00 00 00 00 00 00 00 00 11 20 49 04 24 06 55 03
|
||||
EC 0xf0: 31 55 48 54 35 38 57 57 08 2f 45 73 07 65 6c 1a
|
||||
|
||||
Another set of values that varies often is the temperature
|
||||
readings. Since temperatures don't change vary fast, you can take
|
||||
several quick dumps to eliminate them.
|
||||
|
||||
You can use a similar method to figure out the meaning of other
|
||||
embedded controller registers - e.g. make sure nothing else changes
|
||||
except the charging or discharging battery to determine which
|
||||
registers contain the current battery capacity, etc. If you experiment
|
||||
with this, do send me your results (including some complete dumps with
|
||||
a description of the conditions when they were taken.)
|
||||
|
||||
LCD brightness control -- /proc/acpi/ibm/brightness
|
||||
---------------------------------------------------
|
||||
|
||||
This feature allows software control of the LCD brightness on ThinkPad
|
||||
models which don't have a hardware brightness slider. The available
|
||||
commands are:
|
||||
|
||||
echo up >/proc/acpi/ibm/brightness
|
||||
echo down >/proc/acpi/ibm/brightness
|
||||
echo 'level <level>' >/proc/acpi/ibm/brightness
|
||||
|
||||
The <level> number range is 0 to 7, although not all of them may be
|
||||
distinct. The current brightness level is shown in the file.
|
||||
|
||||
Volume control -- /proc/acpi/ibm/volume
|
||||
---------------------------------------
|
||||
|
||||
This feature allows volume control on ThinkPad models which don't have
|
||||
a hardware volume knob. The available commands are:
|
||||
|
||||
echo up >/proc/acpi/ibm/volume
|
||||
echo down >/proc/acpi/ibm/volume
|
||||
echo mute >/proc/acpi/ibm/volume
|
||||
echo 'level <level>' >/proc/acpi/ibm/volume
|
||||
|
||||
The <level> number range is 0 to 15 although not all of them may be
|
||||
distinct. The unmute the volume after the mute command, use either the
|
||||
up or down command (the level command will not unmute the volume).
|
||||
The current volume level and mute state is shown in the file.
|
||||
|
||||
EXPERIMENTAL: fan speed, fan enable/disable -- /proc/acpi/ibm/fan
|
||||
-----------------------------------------------------------------
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
|
||||
This feature attempts to show the current fan speed, control mode and
|
||||
other fan data that might be available. The speed is read directly
|
||||
from the hardware registers of the embedded controller. This is known
|
||||
to work on later R, T and X series ThinkPads but may show a bogus
|
||||
value on other models.
|
||||
|
||||
Most ThinkPad fans work in "levels". Level 0 stops the fan. The higher
|
||||
the level, the higher the fan speed, although adjacent levels often map
|
||||
to the same fan speed. 7 is the highest level, where the fan reaches
|
||||
the maximum recommended speed. Level "auto" means the EC changes the
|
||||
fan level according to some internal algorithm, usually based on
|
||||
readings from the thermal sensors. Level "disengaged" means the EC
|
||||
disables the speed-locked closed-loop fan control, and drives the fan as
|
||||
fast as it can go, which might exceed hardware limits, so use this level
|
||||
with caution.
|
||||
|
||||
The fan usually ramps up or down slowly from one speed to another,
|
||||
and it is normal for the EC to take several seconds to react to fan
|
||||
commands.
|
||||
|
||||
The fan may be enabled or disabled with the following commands:
|
||||
|
||||
echo enable >/proc/acpi/ibm/fan
|
||||
echo disable >/proc/acpi/ibm/fan
|
||||
|
||||
Placing a fan on level 0 is the same as disabling it. Enabling a fan
|
||||
will try to place it in a safe level if it is too slow or disabled.
|
||||
|
||||
WARNING WARNING WARNING: do not leave the fan disabled unless you are
|
||||
monitoring all of the temperature sensor readings and you are ready to
|
||||
enable it if necessary to avoid overheating.
|
||||
|
||||
An enabled fan in level "auto" may stop spinning if the EC decides the
|
||||
ThinkPad is cool enough and doesn't need the extra airflow. This is
|
||||
normal, and the EC will spin the fan up if the varios thermal readings
|
||||
rise too much.
|
||||
|
||||
On the X40, this seems to depend on the CPU and HDD temperatures.
|
||||
Specifically, the fan is turned on when either the CPU temperature
|
||||
climbs to 56 degrees or the HDD temperature climbs to 46 degrees. The
|
||||
fan is turned off when the CPU temperature drops to 49 degrees and the
|
||||
HDD temperature drops to 41 degrees. These thresholds cannot
|
||||
currently be controlled.
|
||||
|
||||
The fan level can be controlled with the command:
|
||||
|
||||
echo 'level <level>' > /proc/acpi/ibm/thermal
|
||||
|
||||
Where <level> is an integer from 0 to 7, or one of the words "auto"
|
||||
or "disengaged" (without the quotes). Not all ThinkPads support the
|
||||
"auto" and "disengaged" levels.
|
||||
|
||||
On the X31 and X40 (and ONLY on those models), the fan speed can be
|
||||
controlled to a certain degree. Once the fan is running, it can be
|
||||
forced to run faster or slower with the following command:
|
||||
|
||||
echo 'speed <speed>' > /proc/acpi/ibm/thermal
|
||||
|
||||
The sustainable range of fan speeds on the X40 appears to be from
|
||||
about 3700 to about 7350. Values outside this range either do not have
|
||||
any effect or the fan speed eventually settles somewhere in that
|
||||
range. The fan cannot be stopped or started with this command.
|
||||
|
||||
The ThinkPad's ACPI DSDT code will reprogram the fan on its own when
|
||||
certain conditions are met. It will override any fan programming done
|
||||
through ibm-acpi.
|
||||
|
||||
EXPERIMENTAL: WAN -- /proc/acpi/ibm/wan
|
||||
---------------------------------------
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
|
||||
This feature shows the presence and current state of a WAN (Sierra
|
||||
Wireless EV-DO) device. If WAN is installed, the following commands can
|
||||
be used:
|
||||
|
||||
echo enable > /proc/acpi/ibm/wan
|
||||
echo disable > /proc/acpi/ibm/wan
|
||||
|
||||
It was tested on a Lenovo Thinkpad X60. It should probably work on other
|
||||
Thinkpad models which come with this module installed.
|
||||
|
||||
Multiple Commands, Module Parameters
|
||||
------------------------------------
|
||||
|
||||
Multiple commands can be written to the proc files in one shot by
|
||||
separating them with commas, for example:
|
||||
|
||||
echo enable,0xffff > /proc/acpi/ibm/hotkey
|
||||
echo lcd_disable,crt_enable > /proc/acpi/ibm/video
|
||||
|
||||
Commands can also be specified when loading the ibm_acpi module, for
|
||||
example:
|
||||
|
||||
modprobe ibm_acpi hotkey=enable,0xffff video=auto_disable
|
||||
|
||||
The ibm-acpi kernel driver can be programmed to revert the fan level
|
||||
to a safe setting if userspace does not issue one of the fan commands:
|
||||
"enable", "disable", "level" or "watchdog" within a configurable
|
||||
ammount of time. To do this, use the "watchdog" command.
|
||||
|
||||
echo 'watchdog <interval>' > /proc/acpi/ibm/fan
|
||||
|
||||
Interval is the ammount of time in seconds to wait for one of the
|
||||
above mentioned fan commands before reseting the fan level to a safe
|
||||
one. If set to zero, the watchdog is disabled (default). When the
|
||||
watchdog timer runs out, it does the exact equivalent of the "enable"
|
||||
fan command.
|
||||
|
||||
Note that the watchdog timer stops after it enables the fan. It will
|
||||
be rearmed again automatically (using the same interval) when one of
|
||||
the above mentioned fan commands is received. The fan watchdog is,
|
||||
therefore, not suitable to protect against fan mode changes made
|
||||
through means other than the "enable", "disable", and "level" fan
|
||||
commands.
|
||||
|
||||
|
||||
Example Configuration
|
||||
---------------------
|
||||
|
||||
The ACPI support in the kernel is intended to be used in conjunction
|
||||
with a user-space daemon, acpid. The configuration files for this
|
||||
daemon control what actions are taken in response to various ACPI
|
||||
events. An example set of configuration files are included in the
|
||||
config/ directory of the tarball package available on the web
|
||||
site. Note that these are provided for illustration purposes only and
|
||||
may need to be adapted to your particular setup.
|
||||
|
||||
The following utility scripts are used by the example action
|
||||
scripts (included with ibm-acpi for completeness):
|
||||
|
||||
/usr/local/sbin/idectl -- from the hdparm source distribution,
|
||||
see http://www.ibiblio.org/pub/Linux/system/hardware
|
||||
/usr/local/sbin/laptop_mode -- from the Linux kernel source
|
||||
distribution, see Documentation/laptop-mode.txt
|
||||
/sbin/service -- comes with Redhat/Fedora distributions
|
||||
/usr/sbin/hibernate -- from the Software Suspend 2 distribution,
|
||||
see http://softwaresuspend.berlios.de/
|
||||
|
||||
Toan T Nguyen <ntt@physics.ucla.edu> notes that Suse uses the
|
||||
powersave program to suspend ('powersave --suspend-to-ram') or
|
||||
hibernate ('powersave --suspend-to-disk'). This means that the
|
||||
hibernate script is not needed on that distribution.
|
||||
|
||||
Henrik Brix Andersen <brix@gentoo.org> has written a Gentoo ACPI event
|
||||
handler script for the X31. You can get the latest version from
|
||||
http://dev.gentoo.org/~brix/files/x31.sh
|
||||
|
||||
David Schweikert <dws@ee.eth.ch> has written an alternative blank.sh
|
||||
script which works on Debian systems. This scripts has now been
|
||||
extended to also work on Fedora systems and included as the default
|
||||
blank.sh in the distribution.
|
@ -233,6 +233,8 @@ Summary of ide driver parameters for kernel command line
|
||||
"hdx=remap63" : remap the drive: add 63 to all sector numbers
|
||||
(for DM OnTrack)
|
||||
|
||||
"idex=noautotune" : driver will NOT attempt to tune interface speed
|
||||
|
||||
"hdx=autotune" : driver will attempt to tune interface speed
|
||||
to the fastest PIO mode supported,
|
||||
if possible for this drive only.
|
||||
@ -268,17 +270,6 @@ Summary of ide driver parameters for kernel command line
|
||||
|
||||
"idex=base,ctl,irq" : specify base, ctl, and irq number
|
||||
|
||||
"idex=autotune" : driver will attempt to tune interface speed
|
||||
to the fastest PIO mode supported,
|
||||
for all drives on this interface.
|
||||
Not fully supported by all chipset types,
|
||||
and quite likely to cause trouble with
|
||||
older/odd IDE drives.
|
||||
|
||||
"idex=noautotune" : driver will NOT attempt to tune interface speed
|
||||
This is the default for most chipsets,
|
||||
except the cmd640.
|
||||
|
||||
"idex=serialize" : do not overlap operations on idex. Please note
|
||||
that you will have to specify this option for
|
||||
both the respective primary and secondary channel
|
||||
@ -303,13 +294,8 @@ The following are valid ONLY on ide0, which usually corresponds
|
||||
to the first ATA interface found on the particular host, and the defaults for
|
||||
the base,ctl ports must not be altered.
|
||||
|
||||
"ide0=dtc2278" : probe/support DTC2278 interface
|
||||
"ide0=ht6560b" : probe/support HT6560B interface
|
||||
"ide0=cmd640_vlb" : *REQUIRED* for VLB cards with the CMD640 chip
|
||||
(not for PCI -- automatically detected)
|
||||
"ide0=qd65xx" : probe/support qd65xx interface
|
||||
"ide0=ali14xx" : probe/support ali14xx chipsets (ALI M1439/M1443/M1445)
|
||||
"ide0=umc8672" : probe/support umc8672 chipsets
|
||||
|
||||
"ide=doubler" : probe/support IDE doublers on Amiga
|
||||
|
||||
@ -317,6 +303,15 @@ There may be more options than shown -- use the source, Luke!
|
||||
|
||||
Everything else is rejected with a "BAD OPTION" message.
|
||||
|
||||
For legacy IDE VLB host drivers (ali14xx/dtc2278/ht6560b/qd65xx/umc8672)
|
||||
you need to explicitly enable probing by using "probe" kernel parameter,
|
||||
i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use:
|
||||
|
||||
* "ali14xx.probe" boot option when ali14xx driver is built-in the kernel
|
||||
|
||||
* "probe" module parameter when ali14xx driver is compiled as module
|
||||
("modprobe ali14xx probe")
|
||||
|
||||
================================================================================
|
||||
|
||||
IDE ATAPI streaming tape driver
|
||||
|
@ -91,6 +91,14 @@ Sending MADs
|
||||
if (ret != sizeof *mad + mad_length)
|
||||
perror("write");
|
||||
|
||||
Transaction IDs
|
||||
|
||||
Users of the umad devices can use the lower 32 bits of the
|
||||
transaction ID field (that is, the least significant half of the
|
||||
field in network byte order) in MADs being sent to match
|
||||
request/response pairs. The upper 32 bits are reserved for use by
|
||||
the kernel and will be overwritten before a MAD is sent.
|
||||
|
||||
Setting IsSM Capability Bit
|
||||
|
||||
To set the IsSM capability bit for a port, simply open the
|
||||
|
@ -34,7 +34,7 @@ This document describes the Linux kernel Makefiles.
|
||||
--- 6.1 Set variables to tweak the build to the architecture
|
||||
--- 6.2 Add prerequisites to archprepare:
|
||||
--- 6.3 List directories to visit when descending
|
||||
--- 6.4 Architecture specific boot images
|
||||
--- 6.4 Architecture-specific boot images
|
||||
--- 6.5 Building non-kbuild targets
|
||||
--- 6.6 Commands useful for building a boot image
|
||||
--- 6.7 Custom kbuild commands
|
||||
@ -124,7 +124,7 @@ more details, with real examples.
|
||||
Example:
|
||||
obj-y += foo.o
|
||||
|
||||
This tell kbuild that there is one object in that directory, named
|
||||
This tells kbuild that there is one object in that directory, named
|
||||
foo.o. foo.o will be built from foo.c or foo.S.
|
||||
|
||||
If foo.o shall be built as a module, the variable obj-m is used.
|
||||
@ -353,7 +353,7 @@ more details, with real examples.
|
||||
Special rules are used when the kbuild infrastructure does
|
||||
not provide the required support. A typical example is
|
||||
header files generated during the build process.
|
||||
Another example are the architecture specific Makefiles which
|
||||
Another example are the architecture-specific Makefiles which
|
||||
need special rules to prepare boot images etc.
|
||||
|
||||
Special rules are written as normal Make rules.
|
||||
@ -416,7 +416,7 @@ more details, with real examples.
|
||||
#arch/i386/kernel/Makefile
|
||||
vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv)
|
||||
|
||||
In the above example vsyscall-flags will be assigned the option
|
||||
In the above example, vsyscall-flags will be assigned the option
|
||||
-Wl$(comma)--hash-style=sysv if it is supported by $(CC).
|
||||
The second argument is optional, and if supplied will be used
|
||||
if first argument is not supported.
|
||||
@ -434,7 +434,7 @@ more details, with real examples.
|
||||
#arch/i386/Makefile
|
||||
cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586)
|
||||
|
||||
In the above example cflags-y will be assigned the option
|
||||
In the above example, cflags-y will be assigned the option
|
||||
-march=pentium-mmx if supported by $(CC), otherwise -march=i586.
|
||||
The second argument to cc-option is optional, and if omitted,
|
||||
cflags-y will be assigned no value if first option is not supported.
|
||||
@ -750,7 +750,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
located at the root of the obj tree.
|
||||
The very first objects linked are listed in head-y, assigned by
|
||||
arch/$(ARCH)/Makefile.
|
||||
7) Finally, the architecture specific part does any required post processing
|
||||
7) Finally, the architecture-specific part does any required post processing
|
||||
and builds the final bootimage.
|
||||
- This includes building boot records
|
||||
- Preparing initrd images and the like
|
||||
@ -880,7 +880,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
|
||||
$(head-y) lists objects to be linked first in vmlinux.
|
||||
$(libs-y) lists directories where a lib.a archive can be located.
|
||||
The rest lists directories where a built-in.o object file can be
|
||||
The rest list directories where a built-in.o object file can be
|
||||
located.
|
||||
|
||||
$(init-y) objects will be located after $(head-y).
|
||||
@ -888,7 +888,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
$(core-y), $(libs-y), $(drivers-y) and $(net-y).
|
||||
|
||||
The top level Makefile defines values for all generic directories,
|
||||
and arch/$(ARCH)/Makefile only adds architecture specific directories.
|
||||
and arch/$(ARCH)/Makefile only adds architecture-specific directories.
|
||||
|
||||
Example:
|
||||
#arch/sparc64/Makefile
|
||||
@ -897,7 +897,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
drivers-$(CONFIG_OPROFILE) += arch/sparc64/oprofile/
|
||||
|
||||
|
||||
--- 6.4 Architecture specific boot images
|
||||
--- 6.4 Architecture-specific boot images
|
||||
|
||||
An arch Makefile specifies goals that take the vmlinux file, compress
|
||||
it, wrap it in bootstrapping code, and copy the resulting files
|
||||
@ -924,7 +924,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
"$(Q)$(MAKE) $(build)=<dir>" is the recommended way to invoke
|
||||
make in a subdirectory.
|
||||
|
||||
There are no rules for naming architecture specific targets,
|
||||
There are no rules for naming architecture-specific targets,
|
||||
but executing "make help" will list all relevant targets.
|
||||
To support this, $(archhelp) must be defined.
|
||||
|
||||
@ -982,7 +982,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
$(call if_changed,ld/objcopy/gzip)
|
||||
|
||||
When the rule is evaluated, it is checked to see if any files
|
||||
needs an update, or the command line has changed since the last
|
||||
need an update, or the command line has changed since the last
|
||||
invocation. The latter will force a rebuild if any options
|
||||
to the executable have changed.
|
||||
Any target that utilises if_changed must be listed in $(targets),
|
||||
@ -1089,7 +1089,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
assignment.
|
||||
|
||||
The kbuild infrastructure for *lds file are used in several
|
||||
architecture specific files.
|
||||
architecture-specific files.
|
||||
|
||||
|
||||
=== 7 Kbuild Variables
|
||||
@ -1133,7 +1133,7 @@ The top Makefile exports the following variables:
|
||||
|
||||
This variable defines a place for the arch Makefiles to install
|
||||
the resident kernel image and System.map file.
|
||||
Use this for architecture specific install targets.
|
||||
Use this for architecture-specific install targets.
|
||||
|
||||
INSTALL_MOD_PATH, MODLIB
|
||||
|
||||
|
@ -30,6 +30,10 @@ On x86 machines, the first 640 KB of physical memory is needed to boot,
|
||||
regardless of where the kernel loads. Therefore, kexec backs up this
|
||||
region just before rebooting into the dump-capture kernel.
|
||||
|
||||
Similarly on PPC64 machines first 32KB of physical memory is needed for
|
||||
booting regardless of where the kernel is loaded and to support 64K page
|
||||
size kexec backs up the first 64KB memory.
|
||||
|
||||
All of the necessary information about the system kernel's core image is
|
||||
encoded in the ELF format, and stored in a reserved area of memory
|
||||
before a crash. The physical address of the start of the ELF header is
|
||||
@ -224,7 +228,7 @@ Dump-capture kernel config options (Arch Dependent, x86_64)
|
||||
Dump-capture kernel config options (Arch Dependent, ppc64)
|
||||
----------------------------------------------------------
|
||||
|
||||
- Make and install the kernel and its modules. DO NOT add this kernel
|
||||
* Make and install the kernel and its modules. DO NOT add this kernel
|
||||
to the boot loader configuration files.
|
||||
|
||||
Dump-capture kernel config options (Arch Dependent, ia64)
|
||||
@ -251,8 +255,8 @@ Dump-capture kernel config options (Arch Dependent, ia64)
|
||||
Boot into System Kernel
|
||||
=======================
|
||||
|
||||
1) Make and install the kernel and its modules. Update the boot loader
|
||||
(such as grub, yaboot, or lilo) configuration files as necessary.
|
||||
1) Update the boot loader (such as grub, yaboot, or lilo) configuration
|
||||
files as necessary.
|
||||
|
||||
2) Boot the system kernel with the boot parameter "crashkernel=Y@X",
|
||||
where Y specifies how much memory to reserve for the dump-capture kernel
|
||||
@ -356,10 +360,11 @@ If die() is called, and it happens to be a thread with pid 0 or 1, or die()
|
||||
is called inside interrupt context or die() is called and panic_on_oops is set,
|
||||
the system will boot into the dump-capture kernel.
|
||||
|
||||
On powererpc systems when a soft-reset is generated, die() is called by all cpus and the system will boot into the dump-capture kernel.
|
||||
On powererpc systems when a soft-reset is generated, die() is called by all cpus
|
||||
and the system will boot into the dump-capture kernel.
|
||||
|
||||
For testing purposes, you can trigger a crash by using "ALT-SysRq-c",
|
||||
"echo c > /proc/sysrq-trigger or write a module to force the panic.
|
||||
"echo c > /proc/sysrq-trigger" or write a module to force the panic.
|
||||
|
||||
Write Out the Dump File
|
||||
=======================
|
||||
@ -410,12 +415,9 @@ format. Crash is available on Dave Anderson's site at the following URL:
|
||||
To Do
|
||||
=====
|
||||
|
||||
1) Provide a kernel pages filtering mechanism, so core file size is not
|
||||
extreme on systems with huge memory banks.
|
||||
|
||||
2) Relocatable kernel can help in maintaining multiple kernels for
|
||||
crash_dump, and the same kernel as the system kernel can be used to
|
||||
capture the dump.
|
||||
1) Provide relocatable kernels for all architectures to help in maintaining
|
||||
multiple kernels for crash_dump, and the same kernel as the system kernel
|
||||
can be used to capture the dump.
|
||||
|
||||
|
||||
Contact
|
||||
|
@ -62,16 +62,16 @@
|
||||
Alpha AXP Processor, C.-Useful Web and FTP Sites, D.-The GNU
|
||||
General Public License, Glossary". In short: a must have.
|
||||
|
||||
* Title: "The Linux Kernel Hackers' Guide"
|
||||
Author: Michael K.Johnson and others.
|
||||
URL: http://www.tldp.org/LDP/khg/HyperNews/get/khg.html
|
||||
Keywords: everything!
|
||||
Description: No more Postscript book-like version. Only HTML now.
|
||||
Many people have contributed. The interface is similar to web
|
||||
available mailing lists archives. You can find some articles and
|
||||
then some mails asking questions about them and/or complementing
|
||||
previous contributions. A little bit anarchic in this aspect, but
|
||||
with some valuable information in some cases.
|
||||
* Title: "Linux Device Drivers, 2nd Edition"
|
||||
Author: Alessandro Rubini and Jonathan Corbet.
|
||||
URL: http://www.xml.com/ldd/chapter/book/index.html
|
||||
Keywords: device drivers, modules, debugging, memory, hardware,
|
||||
interrupt handling, char drivers, block drivers, kmod, mmap, DMA,
|
||||
buses.
|
||||
Description: O'Reilly's popular book, now also on-line under the
|
||||
GNU Free Documentation License.
|
||||
Notes: You can also buy it in paper-form from O'Reilly. See below
|
||||
under BOOKS (Not on-line).
|
||||
|
||||
* Title: "Conceptual Architecture of the Linux Kernel"
|
||||
Author: Ivan T. Bowman.
|
||||
@ -85,9 +85,9 @@
|
||||
* Title: "Concrete Architecture of the Linux Kernel"
|
||||
Author: Ivan T. Bowman, Saheem Siddiqi, and Meyer C. Tanuan.
|
||||
URL: http://plg.uwaterloo.ca/~itbowman/papers/CS746G-a2.html
|
||||
Keywords: concrete arquitecture, extracted design, reverse
|
||||
Keywords: concrete architecture, extracted design, reverse
|
||||
engineering, system structure, dependencies.
|
||||
Description: Concrete arquitecture of the Linux kernel,
|
||||
Description: Concrete architecture of the Linux kernel,
|
||||
automatically extracted from the source code. Very detailed. Good
|
||||
figures. Gives good overall kernel understanding. This papers
|
||||
focus on lower details than its predecessor (files, variables...).
|
||||
@ -114,7 +114,7 @@
|
||||
|
||||
* Title: "The Linux RAID-1, 4, 5 Code"
|
||||
Author: Ingo Molnar, Gadi Oxman and Miguel de Icaza.
|
||||
URL: http://www2.linuxjournal.com/lj-issues/issue44/2391.html
|
||||
URL: http://www.linuxjournal.com/article.php?sid=2391
|
||||
Keywords: RAID, MD driver.
|
||||
Description: Linux Journal Kernel Korner article. Here is it's
|
||||
abstract: "A description of the implementation of the RAID-1,
|
||||
@ -124,7 +124,7 @@
|
||||
|
||||
* Title: "Dynamic Kernels: Modularized Device Drivers"
|
||||
Author: Alessandro Rubini.
|
||||
URL: http://www2.linuxjournal.com/lj-issues/issue23/1219.html
|
||||
URL: http://www.linuxjournal.com/article.php?sid=1219
|
||||
Keywords: device driver, module, loading/unloading modules,
|
||||
allocating resources.
|
||||
Description: Linux Journal Kernel Korner article. Here is it's
|
||||
@ -137,7 +137,7 @@
|
||||
|
||||
* Title: "Dynamic Kernels: Discovery"
|
||||
Author: Alessandro Rubini.
|
||||
URL: http://www2.linuxjournal.com/lj-issues/issue24/1220.html
|
||||
URL: http://www.linuxjournal.com/article.php?sid=1220
|
||||
Keywords: character driver, init_module, clean_up module,
|
||||
autodetection, mayor number, minor number, file operations,
|
||||
open(), close().
|
||||
@ -149,7 +149,7 @@
|
||||
|
||||
* Title: "The Devil's in the Details"
|
||||
Author: Georg v. Zezschwitz and Alessandro Rubini.
|
||||
URL: http://www2.linuxjournal.com/lj-issues/issue25/1221.html
|
||||
URL: http://www.linuxjournal.com/article.php?sid=1221
|
||||
Keywords: read(), write(), select(), ioctl(), blocking/non
|
||||
blocking mode, interrupt handler.
|
||||
Description: Linux Journal Kernel Korner article. Here is it's
|
||||
@ -159,7 +159,7 @@
|
||||
|
||||
* Title: "Dissecting Interrupts and Browsing DMA"
|
||||
Author: Alessandro Rubini and Georg v. Zezschwitz.
|
||||
URL: http://www2.linuxjournal.com/lj-issues/issue26/1222.html
|
||||
URL: http://www.linuxjournal.com/article.php?sid=1222
|
||||
Keywords: interrupts, irqs, DMA, bottom halves, task queues.
|
||||
Description: Linux Journal Kernel Korner article. Here is it's
|
||||
abstract: "This is the fourth in a series of articles about
|
||||
@ -173,7 +173,7 @@
|
||||
|
||||
* Title: "Device Drivers Concluded"
|
||||
Author: Georg v. Zezschwitz.
|
||||
URL: http://www2.linuxjournal.com/lj-issues/issue28/1287.html
|
||||
URL: http://www.linuxjournal.com/article.php?sid=1287
|
||||
Keywords: address spaces, pages, pagination, page management,
|
||||
demand loading, swapping, memory protection, memory mapping, mmap,
|
||||
virtual memory areas (VMAs), vremap, PCI.
|
||||
@ -185,7 +185,7 @@
|
||||
|
||||
* Title: "Network Buffers And Memory Management"
|
||||
Author: Alan Cox.
|
||||
URL: http://www2.linuxjournal.com/lj-issues/issue30/1312.html
|
||||
URL: http://www.linuxjournal.com/article.php?sid=1312
|
||||
Keywords: sk_buffs, network devices, protocol/link layer
|
||||
variables, network devices flags, transmit, receive,
|
||||
configuration, multicast.
|
||||
@ -218,8 +218,7 @@
|
||||
* Title: "Programming PCI-Devices under Linux"
|
||||
Author: Claus Schroeter.
|
||||
URL:
|
||||
ftp://ftp.llp.fu-berlin.de/pub/linux/LINUX-LAB/whitepapers/pcip.ps
|
||||
.gz
|
||||
ftp://ftp.llp.fu-berlin.de/pub/linux/LINUX-LAB/whitepapers/pcip.ps.gz
|
||||
Keywords: PCI, device, busmastering.
|
||||
Description: 6 pages tutorial on PCI programming under Linux.
|
||||
Gives the basic concepts on the architecture of the PCI subsystem,
|
||||
@ -229,8 +228,7 @@
|
||||
* Title: "Writing Character Device Driver for Linux"
|
||||
Author: R. Baruch and C. Schroeter.
|
||||
URL:
|
||||
ftp://ftp.llp.fu-berlin.de/pub/linux/LINUX-LAB/whitepapers/drivers
|
||||
.ps.gz
|
||||
ftp://ftp.llp.fu-berlin.de/pub/linux/LINUX-LAB/whitepapers/drivers.ps.gz
|
||||
Keywords: character device drivers, I/O, signals, DMA, accessing
|
||||
ports in user space, kernel environment.
|
||||
Description: 68 pages paper on writing character drivers. A little
|
||||
@ -252,7 +250,7 @@
|
||||
|
||||
* Title: "Analysis of the Ext2fs structure"
|
||||
Author: Louis-Dominique Dubeau.
|
||||
URL: http://step.polymtl.ca/~ldd/ext2fs/ext2fs_toc.html
|
||||
URL: http://www.nondot.org/sabre/os/files/FileSystems/ext2fs/
|
||||
Keywords: ext2, filesystem, ext2fs.
|
||||
Description: Description of ext2's blocks, directories, inodes,
|
||||
bitmaps, invariants...
|
||||
@ -346,16 +344,6 @@
|
||||
published, printed or used in excerpts without explicit permission
|
||||
of the author". Fortunately, it may still be read...
|
||||
|
||||
* Title: "Tour Of the Linux Kernel Source"
|
||||
Author: Vijo Cherian.
|
||||
URL: http://www.geocities.com/vijoc/tolks/tolks.html
|
||||
Keywords: .
|
||||
Description: A classic of this page! Was lost for a while and is
|
||||
back again. Thanks Vijo! TOLKS: the name says it all. A tour of
|
||||
the sources, describing directories, files, variables, data
|
||||
structures... It covers general stuff, device drivers,
|
||||
filesystems, IPC and Networking Code.
|
||||
|
||||
* Title: "Linux Kernel Mailing List Glossary"
|
||||
Author: various
|
||||
URL: http://kernelnewbies.org/glossary/
|
||||
@ -378,6 +366,16 @@
|
||||
different". Freely redistributable under the conditions of the GNU
|
||||
General Public License.
|
||||
|
||||
* Title: "Global spinlock list and usage"
|
||||
Author: Rick Lindsley.
|
||||
URL: http://lse.sourceforge.net/lockhier/global-spin-lock
|
||||
Keywords: spinlock.
|
||||
Description: This is an attempt to document both the existence and
|
||||
usage of the spinlocks in the Linux 2.4.5 kernel. Comprehensive
|
||||
list of spinlocks showing when they are used, which functions
|
||||
access them, how each lock is acquired, under what conditions it
|
||||
is held, whether interrupts can occur or not while it is held...
|
||||
|
||||
* Title: "Porting Linux 2.0 Drivers To Linux 2.2: Changes and New
|
||||
Features "
|
||||
Author: Alan Cox.
|
||||
@ -460,9 +458,7 @@
|
||||
* Title: "Linux IP Networking. A Guide to the Implementation and
|
||||
Modification of the Linux Protocol Stack."
|
||||
Author: Glenn Herrin.
|
||||
URL:
|
||||
http://kernelnewbies.org/documents/ipnetworking/linuxipnetworking.
|
||||
html
|
||||
URL: http://www.cs.unh.edu/cnrg/gherrin
|
||||
Keywords: network, networking, protocol, IP, UDP, TCP, connection,
|
||||
socket, receiving, transmitting, forwarding, routing, packets,
|
||||
modules, /proc, sk_buff, FIB, tags.
|
||||
@ -592,21 +588,6 @@
|
||||
ISBN: 2-212-08932-5
|
||||
Notes: French.
|
||||
|
||||
* Title: "The Linux Kernel Book"
|
||||
Author: Remy Card, Eric Dumas, Franck Mevel.
|
||||
Publisher: John Wiley & Sons.
|
||||
Date: 1998.
|
||||
ISBN: 0-471-98141-9
|
||||
Notes: English translation.
|
||||
|
||||
* Title: "Linux 2.0"
|
||||
Author: Remy Card, Eric Dumas, Franck Mevel.
|
||||
Publisher: Gestión 2000.
|
||||
Date: 1997.
|
||||
Pages: 501.
|
||||
ISBN: 8-480-88208-5
|
||||
Notes: Spanish translation.
|
||||
|
||||
* Title: "Unix internals -- the new frontiers"
|
||||
Author: Uresh Vahalia.
|
||||
Publisher: Prentice Hall.
|
||||
@ -614,23 +595,13 @@
|
||||
Pages: 600.
|
||||
ISBN: 0-13-101908-2
|
||||
|
||||
* Title: "Linux Core Kernel Commentary. Guide to Insider's Knowledge
|
||||
on the Core Kernel of the Linux Code"
|
||||
Author: Scott Maxwell.
|
||||
Publisher: Coriolis.
|
||||
Date: 1999.
|
||||
Pages: 592.
|
||||
ISBN: 1-57610-469-9
|
||||
Notes: CD-ROM included. Line by line commentary of the kernel
|
||||
code.
|
||||
|
||||
* Title: "Linux IP Stacks Commentary"
|
||||
Author: Stephen Satchell and HBJ Clifford.
|
||||
Publisher: Coriolis.
|
||||
Date: 2000.
|
||||
Pages: ???.
|
||||
ISBN: 1-57610-470-2
|
||||
Notes: Line by line source code commentary book.
|
||||
* Title: "The Design and Implementation of the 4.4 BSD UNIX
|
||||
Operating System"
|
||||
Author: Marshall Kirk McKusick, Keith Bostic, Michael J. Karels,
|
||||
John S. Quarterman.
|
||||
Publisher: Addison-Wesley.
|
||||
Date: 1996.
|
||||
ISBN: 0-201-54979-4
|
||||
|
||||
* Title: "Programming for the real world - POSIX.4"
|
||||
Author: Bill O. Gallmeister.
|
||||
@ -641,14 +612,28 @@
|
||||
Notes: Though not being directly about Linux, Linux aims to be
|
||||
POSIX. Good reference.
|
||||
|
||||
* Title: "Understanding the Linux Kernel"
|
||||
Author: Daniel P. Bovet and Marco Cesati.
|
||||
Publisher: O'Reilly & Associates, Inc..
|
||||
Date: 2000.
|
||||
Pages: 702.
|
||||
ISBN: 0-596-00002-2
|
||||
Notes: Further information in
|
||||
http://www.oreilly.com/catalog/linuxkernel/
|
||||
* Title: "UNIX Systems for Modern Architectures: Symmetric
|
||||
Multiprocesssing and Caching for Kernel Programmers"
|
||||
Author: Curt Schimmel.
|
||||
Publisher: Addison Wesley.
|
||||
Date: June, 1994.
|
||||
Pages: 432.
|
||||
ISBN: 0-201-63338-8
|
||||
|
||||
* Title: "The Design and Implementation of the 4.3 BSD UNIX
|
||||
Operating System"
|
||||
Author: Samuel J. Leffler, Marshall Kirk McKusick, Michael J.
|
||||
Karels, John S. Quarterman.
|
||||
Publisher: Addison-Wesley.
|
||||
Date: 1989 (reprinted with corrections on October, 1990).
|
||||
ISBN: 0-201-06196-1
|
||||
|
||||
* Title: "The Design of the UNIX Operating System"
|
||||
Author: Maurice J. Bach.
|
||||
Publisher: Prentice Hall.
|
||||
Date: 1986.
|
||||
Pages: 471.
|
||||
ISBN: 0-13-201757-1
|
||||
|
||||
MISCELLANEOUS:
|
||||
|
||||
@ -697,7 +682,7 @@
|
||||
produced during the week. Published every Thursday.
|
||||
|
||||
* Name: "Kernel Traffic"
|
||||
URL: http://www.kerneltraffic.org/kernel-traffic/
|
||||
URL: http://kt.zork.net/kernel-traffic/
|
||||
Keywords: linux-kernel mailing list, weekly kernel news.
|
||||
Description: Weekly newsletter covering the most relevant
|
||||
discussions of the linux-kernel mailing list.
|
||||
@ -730,7 +715,7 @@
|
||||
|
||||
* Name: "Gary's Encyclopedia - The Linux Kernel"
|
||||
Author: Gary (I suppose...).
|
||||
URL: http://members.aa.net/~swear/pedia/kernel.html
|
||||
URL: http://www.lisoleg.net/cgi-bin/lisoleg.pl?view=kernel.htm
|
||||
Keywords: links, not found here?.
|
||||
Description: Gary's Encyclopedia exists to allow the rapid finding
|
||||
of documentation and other information of interest to GNU/Linux
|
||||
|
@ -48,6 +48,7 @@ parameter is applicable:
|
||||
ISAPNP ISA PnP code is enabled.
|
||||
ISDN Appropriate ISDN support is enabled.
|
||||
JOY Appropriate joystick support is enabled.
|
||||
LIBATA Libata driver is enabled
|
||||
LP Printer support is enabled.
|
||||
LOOP Loopback device support is enabled.
|
||||
M68k M68k architecture is enabled.
|
||||
@ -78,6 +79,7 @@ parameter is applicable:
|
||||
Documentation/scsi/.
|
||||
SELINUX SELinux support is enabled.
|
||||
SERIAL Serial support is enabled.
|
||||
SH SuperH architecture is enabled.
|
||||
SMP The kernel is an SMP kernel.
|
||||
SPARC Sparc architecture is enabled.
|
||||
SWSUSP Software suspend is enabled.
|
||||
@ -124,7 +126,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
See header of drivers/scsi/53c7xx.c.
|
||||
See also Documentation/scsi/ncr53c7xx.txt.
|
||||
|
||||
acpi= [HW,ACPI] Advanced Configuration and Power Interface
|
||||
acpi= [HW,ACPI,X86-64,i386]
|
||||
Advanced Configuration and Power Interface
|
||||
Format: { force | off | ht | strict | noirq }
|
||||
force -- enable ACPI if default was off
|
||||
off -- disable ACPI if default was on
|
||||
@ -135,6 +138,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
See also Documentation/pm.txt, pci=noacpi
|
||||
|
||||
acpi_apic_instance= [ACPI, IOAPIC]
|
||||
Format: <int>
|
||||
2: use 2nd APIC table, if available
|
||||
1,0: use 1st APIC table
|
||||
default: 0
|
||||
|
||||
acpi_sleep= [HW,ACPI] Sleep options
|
||||
Format: { s3_bios, s3_mode }
|
||||
See Documentation/power/video.txt
|
||||
@ -172,19 +181,41 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
that require a timer override, but don't have
|
||||
HPET
|
||||
|
||||
acpi_dbg_layer= [HW,ACPI]
|
||||
acpi.debug_layer= [HW,ACPI]
|
||||
Format: <int>
|
||||
Each bit of the <int> indicates an ACPI debug layer,
|
||||
1: enable, 0: disable. It is useful for boot time
|
||||
debugging. After system has booted up, it can be set
|
||||
via /proc/acpi/debug_layer.
|
||||
via /sys/module/acpi/parameters/debug_layer.
|
||||
CONFIG_ACPI_DEBUG must be enabled for this to produce any output.
|
||||
Available bits (add the numbers together) to enable debug output
|
||||
for specific parts of the ACPI subsystem:
|
||||
0x01 utilities 0x02 hardware 0x04 events 0x08 tables
|
||||
0x10 namespace 0x20 parser 0x40 dispatcher
|
||||
0x80 executer 0x100 resources 0x200 acpica debugger
|
||||
0x400 os services 0x800 acpica disassembler.
|
||||
The number can be in decimal or prefixed with 0x in hex.
|
||||
Warning: Many of these options can produce a lot of
|
||||
output and make your system unusable. Be very careful.
|
||||
|
||||
acpi_dbg_level= [HW,ACPI]
|
||||
acpi.debug_level= [HW,ACPI]
|
||||
Format: <int>
|
||||
Each bit of the <int> indicates an ACPI debug level,
|
||||
1: enable, 0: disable. It is useful for boot time
|
||||
debugging. After system has booted up, it can be set
|
||||
via /proc/acpi/debug_level.
|
||||
via /sys/module/acpi/parameters/debug_level.
|
||||
CONFIG_ACPI_DEBUG must be enabled for this to produce any output.
|
||||
Available bits (add the numbers together) to enable different
|
||||
debug output levels of the ACPI subsystem:
|
||||
0x01 error 0x02 warn 0x04 init 0x08 debug object
|
||||
0x10 info 0x20 init names 0x40 parse 0x80 load
|
||||
0x100 dispatch 0x200 execute 0x400 names 0x800 operation region
|
||||
0x1000 bfield 0x2000 tables 0x4000 values 0x8000 objects
|
||||
0x10000 resources 0x20000 user requests 0x40000 package.
|
||||
The number can be in decimal or prefixed with 0x in hex.
|
||||
Warning: Many of these options can produce a lot of
|
||||
output and make your system unusable. Be very careful.
|
||||
|
||||
|
||||
acpi_fake_ecdt [HW,ACPI] Workaround failure due to BIOS lacking ECDT
|
||||
|
||||
@ -484,7 +515,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
dtc3181e= [HW,SCSI]
|
||||
|
||||
earlyprintk= [IA-32,X86-64]
|
||||
earlyprintk= [IA-32,X86-64,SH]
|
||||
earlyprintk=vga
|
||||
earlyprintk=serial[,ttySn[,baudrate]]
|
||||
|
||||
@ -771,6 +802,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
lapic [IA-32,APIC] Enable the local APIC even if BIOS
|
||||
disabled it.
|
||||
|
||||
lapic_timer_c2_ok [IA-32,x86-64,APIC] trust the local apic timer in
|
||||
C2 power state.
|
||||
|
||||
lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip
|
||||
Format: addr:<io>,irq:<irq>
|
||||
|
||||
@ -863,7 +897,14 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
Format: <1-256>
|
||||
|
||||
maxcpus= [SMP] Maximum number of processors that an SMP kernel
|
||||
should make use of
|
||||
should make use of.
|
||||
Using "nosmp" or "maxcpus=0" will disable SMP
|
||||
entirely (the MPS table probe still happens, though).
|
||||
A command-line option of "maxcpus=<NUM>", where <NUM>
|
||||
is an integer greater than 0, limits the maximum number
|
||||
of CPUs activated in SMP mode to <NUM>.
|
||||
Using "maxcpus=1" on an SMP kernel is the trivial
|
||||
case of an SMP kernel with only one CPU.
|
||||
|
||||
max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or
|
||||
equal to this physical address is ignored.
|
||||
@ -1038,6 +1079,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
emulation library even if a 387 maths coprocessor
|
||||
is present.
|
||||
|
||||
noacpi [LIBATA] Disables use of ACPI in libata suspend/resume
|
||||
when set.
|
||||
Format: <int>
|
||||
|
||||
noaliencache [MM, NUMA] Disables the allcoation of alien caches in
|
||||
the slab allocator. Saves per-node memory, but will
|
||||
impact performance on real NUMA hardware.
|
||||
@ -1103,6 +1148,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
nolapic [IA-32,APIC] Do not enable or use the local APIC.
|
||||
|
||||
nolapic_timer [IA-32,APIC] Do not use the local APIC timer.
|
||||
|
||||
noltlbs [PPC] Do not use large page/tlb entries for kernel
|
||||
lowmem mapping on PPC40x.
|
||||
|
||||
@ -1275,6 +1322,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
This sorting is done to get a device
|
||||
order compatible with older (<= 2.4) kernels.
|
||||
nobfsort Don't sort PCI devices into breadth-first order.
|
||||
cbiosize=nn[KMG] The fixed amount of bus space which is
|
||||
reserved for the CardBus bridge's IO window.
|
||||
The default value is 256 bytes.
|
||||
cbmemsize=nn[KMG] The fixed amount of bus space which is
|
||||
reserved for the CardBus bridge's memory
|
||||
window. The default value is 64 megabytes.
|
||||
|
||||
pcmv= [HW,PCMCIA] BadgePAD 4
|
||||
|
||||
@ -1667,6 +1720,22 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
stifb= [HW]
|
||||
Format: bpp:<bpp1>[:<bpp2>[:<bpp3>...]]
|
||||
|
||||
sunrpc.pool_mode=
|
||||
[NFS]
|
||||
Control how the NFS server code allocates CPUs to
|
||||
service thread pools. Depending on how many NICs
|
||||
you have and where their interrupts are bound, this
|
||||
option will affect which CPUs will do NFS serving.
|
||||
Note: this parameter cannot be changed while the
|
||||
NFS server is running.
|
||||
|
||||
auto the server chooses an appropriate mode
|
||||
automatically using heuristics
|
||||
global a single global pool contains all CPUs
|
||||
percpu one pool for each CPU
|
||||
pernode one pool for each NUMA node (equivalent
|
||||
to global on non-NUMA machines)
|
||||
|
||||
swiotlb= [IA-64] Number of I/O TLB slabs
|
||||
|
||||
switches= [HW,M68k]
|
||||
@ -1740,10 +1809,17 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
Note that genuine overcurrent events won't be
|
||||
reported either.
|
||||
|
||||
usbcore.autosuspend=
|
||||
[USB] The autosuspend time delay (in seconds) used
|
||||
for newly-detected USB devices (default 2). This
|
||||
is the time required before an idle device will be
|
||||
autosuspended. Devices for which the delay is set
|
||||
to a negative value won't be autosuspended at all.
|
||||
|
||||
usbhid.mousepoll=
|
||||
[USBHID] The interval which mice are to be polled at.
|
||||
|
||||
vdso= [IA-32]
|
||||
vdso= [IA-32,SH]
|
||||
vdso=1: enable VDSO (default)
|
||||
vdso=0: disable VDSO mapping
|
||||
|
||||
|
@ -859,6 +859,18 @@ payload contents" for more information.
|
||||
void unregister_key_type(struct key_type *type);
|
||||
|
||||
|
||||
Under some circumstances, it may be desirable to desirable to deal with a
|
||||
bundle of keys. The facility provides access to the keyring type for managing
|
||||
such a bundle:
|
||||
|
||||
struct key_type key_type_keyring;
|
||||
|
||||
This can be used with a function such as request_key() to find a specific
|
||||
keyring in a process's keyrings. A keyring thus found can then be searched
|
||||
with keyring_search(). Note that it is not possible to use request_key() to
|
||||
search a specific keyring, so using keyrings in this way is of limited utility.
|
||||
|
||||
|
||||
===================================
|
||||
NOTES ON ACCESSING PAYLOAD CONTENTS
|
||||
===================================
|
||||
|
@ -65,7 +65,6 @@ CMAGIC 0x0111 user include/linux/a.out.h
|
||||
MKISS_DRIVER_MAGIC 0x04bf mkiss_channel drivers/net/mkiss.h
|
||||
RISCOM8_MAGIC 0x0907 riscom_port drivers/char/riscom8.h
|
||||
SPECIALIX_MAGIC 0x0907 specialix_port drivers/char/specialix_io8.h
|
||||
AURORA_MAGIC 0x0A18 Aurora_port drivers/sbus/char/aurora.h
|
||||
HDLC_MAGIC 0x239e n_hdlc drivers/char/n_hdlc.c
|
||||
APM_BIOS_MAGIC 0x4101 apm_user arch/i386/kernel/apm.c
|
||||
CYCLADES_MAGIC 0x4359 cyclades_port include/linux/cyclades.h
|
||||
|
@ -1,16 +1,10 @@
|
||||
To use the amateur radio protocols within Linux you will need to get a
|
||||
suitable copy of the AX.25 Utilities. More detailed information about these
|
||||
and associated programs can be found on http://zone.pspt.fi/~jsn/.
|
||||
|
||||
For more information about the AX.25, NET/ROM and ROSE protocol stacks, see
|
||||
the AX25-HOWTO written by Terry Dawson <terry@perf.no.itg.telstra.com.au>
|
||||
who is also the AX.25 Utilities maintainer.
|
||||
suitable copy of the AX.25 Utilities. More detailed information about
|
||||
AX.25, NET/ROM and ROSE, associated programs and and utilities can be
|
||||
found on http://www.linux-ax25.org.
|
||||
|
||||
There is an active mailing list for discussing Linux amateur radio matters
|
||||
called linux-hams. To subscribe to it, send a message to
|
||||
called linux-hams@vger.kernel.org. To subscribe to it, send a message to
|
||||
majordomo@vger.kernel.org with the words "subscribe linux-hams" in the body
|
||||
of the message, the subject field is ignored.
|
||||
|
||||
Jonathan G4KLX
|
||||
|
||||
g4klx@g4klx.demon.co.uk
|
||||
of the message, the subject field is ignored. You don't need to be
|
||||
subscribed to post but of course that means you might miss an answer.
|
||||
|
@ -2,35 +2,88 @@
|
||||
BCM43xx Linux Driver Project
|
||||
============================
|
||||
|
||||
About this software
|
||||
-------------------
|
||||
|
||||
The goal of this project is to develop a linux driver for Broadcom
|
||||
BCM43xx chips, based on the specification at
|
||||
http://bcm-specs.sipsolutions.net/
|
||||
|
||||
The project page is http://bcm43xx.berlios.de/
|
||||
|
||||
|
||||
Requirements
|
||||
Introduction
|
||||
------------
|
||||
|
||||
1) Linux Kernel 2.6.16 or later
|
||||
http://www.kernel.org/
|
||||
Many of the wireless devices found in modern notebook computers are
|
||||
based on the wireless chips produced by Broadcom. These devices have
|
||||
been a problem for Linux users as there is no open-source driver
|
||||
available. In addition, Broadcom has not released specifications
|
||||
for the device, and driver availability has been limited to the
|
||||
binary-only form used in the GPL versions of AP hardware such as the
|
||||
Linksys WRT54G, and the Windows and OS X drivers. Before this project
|
||||
began, the only way to use these devices were to use the Windows or
|
||||
OS X drivers with either the Linuxant or ndiswrapper modules. There
|
||||
is a strong penalty if this method is used as loading the binary-only
|
||||
module "taints" the kernel, and no kernel developer will help diagnose
|
||||
any kernel problems.
|
||||
|
||||
You may want to configure your kernel with:
|
||||
Development
|
||||
-----------
|
||||
|
||||
CONFIG_DEBUG_FS (optional):
|
||||
-> Kernel hacking
|
||||
-> Debug Filesystem
|
||||
This driver has been developed using
|
||||
a clean-room technique that is described at
|
||||
http://bcm-specs.sipsolutions.net/ReverseEngineeringProcess. For legal
|
||||
reasons, none of the clean-room crew works on the on the Linux driver,
|
||||
and none of the Linux developers sees anything but the specifications,
|
||||
which are the ultimate product of the reverse-engineering group.
|
||||
|
||||
2) SoftMAC IEEE 802.11 Networking Stack extension and patched ieee80211
|
||||
modules:
|
||||
http://softmac.sipsolutions.net/
|
||||
Software
|
||||
--------
|
||||
|
||||
3) Firmware Files
|
||||
Since the release of the 2.6.17 kernel, the bcm43xx driver has been
|
||||
distributed with the kernel source, and is prebuilt in most, if not
|
||||
all, distributions. There is, however, additional software that is
|
||||
required. The firmware used by the chip is the intellectual property
|
||||
of Broadcom and they have not given the bcm43xx team redistribution
|
||||
rights to this firmware. Since we cannot legally redistribute
|
||||
the firwmare we cannot include it with the driver. Furthermore, it
|
||||
cannot be placed in the downloadable archives of any distributing
|
||||
organization; therefore, the user is responsible for obtaining the
|
||||
firmware and placing it in the appropriate location so that the driver
|
||||
can find it when initializing.
|
||||
|
||||
Please try fwcutter. Fwcutter can extract the firmware from various
|
||||
binary driver files. It supports driver files from Windows, MacOS and
|
||||
Linux. You can get fwcutter from http://bcm43xx.berlios.de/.
|
||||
Also, fwcutter comes with a README file for further instructions.
|
||||
To help with this process, the bcm43xx developers provide a separate
|
||||
program named bcm43xx-fwcutter to "cut" the firmware out of a
|
||||
Windows or OS X driver and write the extracted files to the proper
|
||||
location. This program is usually provided with the distribution;
|
||||
however, it may be downloaded from
|
||||
|
||||
http://developer.berlios.de/project/showfiles.php?group_id=4547
|
||||
|
||||
The firmware is available in two versions. V3 firmware is used with
|
||||
the in-kernel bcm43xx driver that uses a software MAC layer called
|
||||
SoftMAC, and will have a microcode revision of 0x127 or smaller. The
|
||||
V4 firmware is used by an out-of-kernel driver employing a variation of
|
||||
the Devicescape MAC layer known as d80211. Once bcm43xx-d80211 reaches
|
||||
a satisfactory level of development, it will replace bcm43xx-softmac
|
||||
in the kernel as it is much more flexible and powerful.
|
||||
|
||||
A source for the latest V3 firmware is
|
||||
|
||||
http://downloads.openwrt.org/sources/wl_apsta-3.130.20.0.o
|
||||
|
||||
Once this file is downloaded, the command
|
||||
'bcm43xx-fwcutter -w <dir> <filename>'
|
||||
will extract the microcode and write it to directory
|
||||
<dir>. The correct directory will depend on your distribution;
|
||||
however, most use '/lib/firmware'. Once this step is completed,
|
||||
the bcm3xx driver should load when the system is booted. To see
|
||||
any messages relating to the driver, issue the command 'dmesg |
|
||||
grep bcm43xx' from a terminal window. If there are any problems,
|
||||
please send that output to Bcm43xx-dev@lists.berlios.de.
|
||||
|
||||
Although the driver has been in-kernel since 2.6.17, the earliest
|
||||
version is quite limited in its capability. Patches that include
|
||||
all features of later versions are available for the stable kernel
|
||||
versions from 2.6.18. These will be needed if you use a BCM4318,
|
||||
or a PCI Express version (BCM4311 and BCM4312). In addition, if you
|
||||
have an early BCM4306 and more than 1 GB RAM, your kernel will need
|
||||
to be patched. These patches, which are being updated regularly,
|
||||
are available at ftp://lwfinger.dynalias.org/patches. Look for
|
||||
combined_2.6.YY.patch. Of course you will need kernel source downloaded
|
||||
from kernel.org, or the source from your distribution.
|
||||
|
||||
If you build your own kernel, please enable CONFIG_BCM43XX_DEBUG
|
||||
and CONFIG_IEEE80211_SOFTMAC_DEBUG. The log information provided is
|
||||
essential for solving any problems.
|
||||
|
@ -920,40 +920,9 @@ options, you may wish to use the "max_bonds" module parameter,
|
||||
documented above.
|
||||
|
||||
To create multiple bonding devices with differing options, it
|
||||
is necessary to load the bonding driver multiple times. Note that
|
||||
current versions of the sysconfig network initialization scripts
|
||||
handle this automatically; if your distro uses these scripts, no
|
||||
special action is needed. See the section Configuring Bonding
|
||||
Devices, above, if you're not sure about your network initialization
|
||||
scripts.
|
||||
is necessary to use bonding parameters exported by sysfs, documented
|
||||
in the section below.
|
||||
|
||||
To load multiple instances of the module, it is necessary to
|
||||
specify a different name for each instance (the module loading system
|
||||
requires that every loaded module, even multiple instances of the same
|
||||
module, have a unique name). This is accomplished by supplying
|
||||
multiple sets of bonding options in /etc/modprobe.conf, for example:
|
||||
|
||||
alias bond0 bonding
|
||||
options bond0 -o bond0 mode=balance-rr miimon=100
|
||||
|
||||
alias bond1 bonding
|
||||
options bond1 -o bond1 mode=balance-alb miimon=50
|
||||
|
||||
will load the bonding module two times. The first instance is
|
||||
named "bond0" and creates the bond0 device in balance-rr mode with an
|
||||
miimon of 100. The second instance is named "bond1" and creates the
|
||||
bond1 device in balance-alb mode with an miimon of 50.
|
||||
|
||||
In some circumstances (typically with older distributions),
|
||||
the above does not work, and the second bonding instance never sees
|
||||
its options. In that case, the second options line can be substituted
|
||||
as follows:
|
||||
|
||||
install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
|
||||
mode=balance-alb miimon=50
|
||||
|
||||
This may be repeated any number of times, specifying a new and
|
||||
unique name in place of bond1 for each subsequent instance.
|
||||
|
||||
3.4 Configuring Bonding Manually via Sysfs
|
||||
------------------------------------------
|
||||
|
@ -57,6 +57,16 @@ DCCP_SOCKOPT_SEND_CSCOV is for the receiver and has a different meaning: it
|
||||
coverage value are also acceptable. The higher the number, the more
|
||||
restrictive this setting (see [RFC 4340, sec. 9.2.1]).
|
||||
|
||||
The following two options apply to CCID 3 exclusively and are getsockopt()-only.
|
||||
In either case, a TFRC info struct (defined in <linux/tfrc.h>) is returned.
|
||||
DCCP_SOCKOPT_CCID_RX_INFO
|
||||
Returns a `struct tfrc_rx_info' in optval; the buffer for optval and
|
||||
optlen must be set to at least sizeof(struct tfrc_rx_info).
|
||||
DCCP_SOCKOPT_CCID_TX_INFO
|
||||
Returns a `struct tfrc_tx_info' in optval; the buffer for optval and
|
||||
optlen must be set to at least sizeof(struct tfrc_tx_info).
|
||||
|
||||
|
||||
Sysctl variables
|
||||
================
|
||||
Several DCCP default parameters can be managed by the following sysctls
|
||||
|
@ -147,6 +147,11 @@ tcp_available_congestion_control - STRING
|
||||
More congestion control algorithms may be available as modules,
|
||||
but not loaded.
|
||||
|
||||
tcp_base_mss - INTEGER
|
||||
The initial value of search_low to be used by Packetization Layer
|
||||
Path MTU Discovery (MTU probing). If MTU probing is enabled,
|
||||
this is the inital MSS used by the connection.
|
||||
|
||||
tcp_congestion_control - STRING
|
||||
Set the congestion control algorithm to be used for new
|
||||
connections. The algorithm "reno" is always available, but
|
||||
@ -174,11 +179,31 @@ tcp_fin_timeout - INTEGER
|
||||
because they eat maximum 1.5K of memory, but they tend
|
||||
to live longer. Cf. tcp_max_orphans.
|
||||
|
||||
tcp_frto - BOOLEAN
|
||||
tcp_frto - INTEGER
|
||||
Enables F-RTO, an enhanced recovery algorithm for TCP retransmission
|
||||
timeouts. It is particularly beneficial in wireless environments
|
||||
where packet loss is typically due to random radio interference
|
||||
rather than intermediate router congestion.
|
||||
rather than intermediate router congestion. If set to 1, basic
|
||||
version is enabled. 2 enables SACK enhanced F-RTO, which is
|
||||
EXPERIMENTAL. The basic version can be used also when SACK is
|
||||
enabled for a flow through tcp_sack sysctl.
|
||||
|
||||
tcp_frto_response - INTEGER
|
||||
When F-RTO has detected that a TCP retransmission timeout was
|
||||
spurious (i.e, the timeout would have been avoided had TCP set a
|
||||
longer retransmission timeout), TCP has several options what to do
|
||||
next. Possible values are:
|
||||
0 Rate halving based; a smooth and conservative response,
|
||||
results in halved cwnd and ssthresh after one RTT
|
||||
1 Very conservative response; not recommended because even
|
||||
though being valid, it interacts poorly with the rest of
|
||||
Linux TCP, halves cwnd and ssthresh immediately
|
||||
2 Aggressive response; undoes congestion control measures
|
||||
that are now known to be unnecessary (ignoring the
|
||||
possibility of a lost retransmission that would require
|
||||
TCP to be more cautious), cwnd and ssthresh are restored
|
||||
to the values prior timeout
|
||||
Default: 0 (rate halving based)
|
||||
|
||||
tcp_keepalive_time - INTEGER
|
||||
How often TCP sends out keepalive messages when keepalive is enabled.
|
||||
@ -243,6 +268,27 @@ tcp_mem - vector of 3 INTEGERs: min, pressure, max
|
||||
Defaults are calculated at boot time from amount of available
|
||||
memory.
|
||||
|
||||
tcp_moderate_rcvbuf - BOOLEAN
|
||||
If set, TCP performs receive buffer autotuning, attempting to
|
||||
automatically size the buffer (no greater than tcp_rmem[2]) to
|
||||
match the size required by the path for full throughput. Enabled by
|
||||
default.
|
||||
|
||||
tcp_mtu_probing - INTEGER
|
||||
Controls TCP Packetization-Layer Path MTU Discovery. Takes three
|
||||
values:
|
||||
0 - Disabled
|
||||
1 - Disabled by default, enabled when an ICMP black hole detected
|
||||
2 - Always enabled, use initial MSS of tcp_base_mss.
|
||||
|
||||
tcp_no_metrics_save - BOOLEAN
|
||||
By default, TCP saves various connection metrics in the route cache
|
||||
when the connection closes, so that connections established in the
|
||||
near future can use these to set initial conditions. Usually, this
|
||||
increases overall performance, but may sometimes cause performance
|
||||
degredation. If set, TCP will not cache metrics on closing
|
||||
connections.
|
||||
|
||||
tcp_orphan_retries - INTEGER
|
||||
How may times to retry before killing TCP connection, closed
|
||||
by our side. Default value 7 corresponds to ~50sec-16min
|
||||
@ -825,6 +871,15 @@ accept_redirects - BOOLEAN
|
||||
Functional default: enabled if local forwarding is disabled.
|
||||
disabled if local forwarding is enabled.
|
||||
|
||||
accept_source_route - INTEGER
|
||||
Accept source routing (routing extension header).
|
||||
|
||||
> 0: Accept routing header.
|
||||
= 0: Accept only routing header type 2.
|
||||
< 0: Do not accept routing header.
|
||||
|
||||
Default: 0
|
||||
|
||||
autoconf - BOOLEAN
|
||||
Autoconfigure addresses using Prefix Information in Router
|
||||
Advertisements.
|
||||
@ -960,7 +1015,12 @@ bridge-nf-call-ip6tables - BOOLEAN
|
||||
Default: 1
|
||||
|
||||
bridge-nf-filter-vlan-tagged - BOOLEAN
|
||||
1 : pass bridged vlan-tagged ARP/IP traffic to arptables/iptables.
|
||||
1 : pass bridged vlan-tagged ARP/IP/IPv6 traffic to {arp,ip,ip6}tables.
|
||||
0 : disable this.
|
||||
Default: 1
|
||||
|
||||
bridge-nf-filter-pppoe-tagged - BOOLEAN
|
||||
1 : pass bridged pppoe-tagged IP/IPv6 traffic to {ip,ip6}tables.
|
||||
0 : disable this.
|
||||
Default: 1
|
||||
|
||||
|
859
Documentation/networking/rxrpc.txt
Normal file
859
Documentation/networking/rxrpc.txt
Normal file
@ -0,0 +1,859 @@
|
||||
======================
|
||||
RxRPC NETWORK PROTOCOL
|
||||
======================
|
||||
|
||||
The RxRPC protocol driver provides a reliable two-phase transport on top of UDP
|
||||
that can be used to perform RxRPC remote operations. This is done over sockets
|
||||
of AF_RXRPC family, using sendmsg() and recvmsg() with control data to send and
|
||||
receive data, aborts and errors.
|
||||
|
||||
Contents of this document:
|
||||
|
||||
(*) Overview.
|
||||
|
||||
(*) RxRPC protocol summary.
|
||||
|
||||
(*) AF_RXRPC driver model.
|
||||
|
||||
(*) Control messages.
|
||||
|
||||
(*) Socket options.
|
||||
|
||||
(*) Security.
|
||||
|
||||
(*) Example client usage.
|
||||
|
||||
(*) Example server usage.
|
||||
|
||||
(*) AF_RXRPC kernel interface.
|
||||
|
||||
|
||||
========
|
||||
OVERVIEW
|
||||
========
|
||||
|
||||
RxRPC is a two-layer protocol. There is a session layer which provides
|
||||
reliable virtual connections using UDP over IPv4 (or IPv6) as the transport
|
||||
layer, but implements a real network protocol; and there's the presentation
|
||||
layer which renders structured data to binary blobs and back again using XDR
|
||||
(as does SunRPC):
|
||||
|
||||
+-------------+
|
||||
| Application |
|
||||
+-------------+
|
||||
| XDR | Presentation
|
||||
+-------------+
|
||||
| RxRPC | Session
|
||||
+-------------+
|
||||
| UDP | Transport
|
||||
+-------------+
|
||||
|
||||
|
||||
AF_RXRPC provides:
|
||||
|
||||
(1) Part of an RxRPC facility for both kernel and userspace applications by
|
||||
making the session part of it a Linux network protocol (AF_RXRPC).
|
||||
|
||||
(2) A two-phase protocol. The client transmits a blob (the request) and then
|
||||
receives a blob (the reply), and the server receives the request and then
|
||||
transmits the reply.
|
||||
|
||||
(3) Retention of the reusable bits of the transport system set up for one call
|
||||
to speed up subsequent calls.
|
||||
|
||||
(4) A secure protocol, using the Linux kernel's key retention facility to
|
||||
manage security on the client end. The server end must of necessity be
|
||||
more active in security negotiations.
|
||||
|
||||
AF_RXRPC does not provide XDR marshalling/presentation facilities. That is
|
||||
left to the application. AF_RXRPC only deals in blobs. Even the operation ID
|
||||
is just the first four bytes of the request blob, and as such is beyond the
|
||||
kernel's interest.
|
||||
|
||||
|
||||
Sockets of AF_RXRPC family are:
|
||||
|
||||
(1) created as type SOCK_DGRAM;
|
||||
|
||||
(2) provided with a protocol of the type of underlying transport they're going
|
||||
to use - currently only PF_INET is supported.
|
||||
|
||||
|
||||
The Andrew File System (AFS) is an example of an application that uses this and
|
||||
that has both kernel (filesystem) and userspace (utility) components.
|
||||
|
||||
|
||||
======================
|
||||
RXRPC PROTOCOL SUMMARY
|
||||
======================
|
||||
|
||||
An overview of the RxRPC protocol:
|
||||
|
||||
(*) RxRPC sits on top of another networking protocol (UDP is the only option
|
||||
currently), and uses this to provide network transport. UDP ports, for
|
||||
example, provide transport endpoints.
|
||||
|
||||
(*) RxRPC supports multiple virtual "connections" from any given transport
|
||||
endpoint, thus allowing the endpoints to be shared, even to the same
|
||||
remote endpoint.
|
||||
|
||||
(*) Each connection goes to a particular "service". A connection may not go
|
||||
to multiple services. A service may be considered the RxRPC equivalent of
|
||||
a port number. AF_RXRPC permits multiple services to share an endpoint.
|
||||
|
||||
(*) Client-originating packets are marked, thus a transport endpoint can be
|
||||
shared between client and server connections (connections have a
|
||||
direction).
|
||||
|
||||
(*) Up to a billion connections may be supported concurrently between one
|
||||
local transport endpoint and one service on one remote endpoint. An RxRPC
|
||||
connection is described by seven numbers:
|
||||
|
||||
Local address }
|
||||
Local port } Transport (UDP) address
|
||||
Remote address }
|
||||
Remote port }
|
||||
Direction
|
||||
Connection ID
|
||||
Service ID
|
||||
|
||||
(*) Each RxRPC operation is a "call". A connection may make up to four
|
||||
billion calls, but only up to four calls may be in progress on a
|
||||
connection at any one time.
|
||||
|
||||
(*) Calls are two-phase and asymmetric: the client sends its request data,
|
||||
which the service receives; then the service transmits the reply data
|
||||
which the client receives.
|
||||
|
||||
(*) The data blobs are of indefinite size, the end of a phase is marked with a
|
||||
flag in the packet. The number of packets of data making up one blob may
|
||||
not exceed 4 billion, however, as this would cause the sequence number to
|
||||
wrap.
|
||||
|
||||
(*) The first four bytes of the request data are the service operation ID.
|
||||
|
||||
(*) Security is negotiated on a per-connection basis. The connection is
|
||||
initiated by the first data packet on it arriving. If security is
|
||||
requested, the server then issues a "challenge" and then the client
|
||||
replies with a "response". If the response is successful, the security is
|
||||
set for the lifetime of that connection, and all subsequent calls made
|
||||
upon it use that same security. In the event that the server lets a
|
||||
connection lapse before the client, the security will be renegotiated if
|
||||
the client uses the connection again.
|
||||
|
||||
(*) Calls use ACK packets to handle reliability. Data packets are also
|
||||
explicitly sequenced per call.
|
||||
|
||||
(*) There are two types of positive acknowledgement: hard-ACKs and soft-ACKs.
|
||||
A hard-ACK indicates to the far side that all the data received to a point
|
||||
has been received and processed; a soft-ACK indicates that the data has
|
||||
been received but may yet be discarded and re-requested. The sender may
|
||||
not discard any transmittable packets until they've been hard-ACK'd.
|
||||
|
||||
(*) Reception of a reply data packet implicitly hard-ACK's all the data
|
||||
packets that make up the request.
|
||||
|
||||
(*) An call is complete when the request has been sent, the reply has been
|
||||
received and the final hard-ACK on the last packet of the reply has
|
||||
reached the server.
|
||||
|
||||
(*) An call may be aborted by either end at any time up to its completion.
|
||||
|
||||
|
||||
=====================
|
||||
AF_RXRPC DRIVER MODEL
|
||||
=====================
|
||||
|
||||
About the AF_RXRPC driver:
|
||||
|
||||
(*) The AF_RXRPC protocol transparently uses internal sockets of the transport
|
||||
protocol to represent transport endpoints.
|
||||
|
||||
(*) AF_RXRPC sockets map onto RxRPC connection bundles. Actual RxRPC
|
||||
connections are handled transparently. One client socket may be used to
|
||||
make multiple simultaneous calls to the same service. One server socket
|
||||
may handle calls from many clients.
|
||||
|
||||
(*) Additional parallel client connections will be initiated to support extra
|
||||
concurrent calls, up to a tunable limit.
|
||||
|
||||
(*) Each connection is retained for a certain amount of time [tunable] after
|
||||
the last call currently using it has completed in case a new call is made
|
||||
that could reuse it.
|
||||
|
||||
(*) Each internal UDP socket is retained [tunable] for a certain amount of
|
||||
time [tunable] after the last connection using it discarded, in case a new
|
||||
connection is made that could use it.
|
||||
|
||||
(*) A client-side connection is only shared between calls if they have have
|
||||
the same key struct describing their security (and assuming the calls
|
||||
would otherwise share the connection). Non-secured calls would also be
|
||||
able to share connections with each other.
|
||||
|
||||
(*) A server-side connection is shared if the client says it is.
|
||||
|
||||
(*) ACK'ing is handled by the protocol driver automatically, including ping
|
||||
replying.
|
||||
|
||||
(*) SO_KEEPALIVE automatically pings the other side to keep the connection
|
||||
alive [TODO].
|
||||
|
||||
(*) If an ICMP error is received, all calls affected by that error will be
|
||||
aborted with an appropriate network error passed through recvmsg().
|
||||
|
||||
|
||||
Interaction with the user of the RxRPC socket:
|
||||
|
||||
(*) A socket is made into a server socket by binding an address with a
|
||||
non-zero service ID.
|
||||
|
||||
(*) In the client, sending a request is achieved with one or more sendmsgs,
|
||||
followed by the reply being received with one or more recvmsgs.
|
||||
|
||||
(*) The first sendmsg for a request to be sent from a client contains a tag to
|
||||
be used in all other sendmsgs or recvmsgs associated with that call. The
|
||||
tag is carried in the control data.
|
||||
|
||||
(*) connect() is used to supply a default destination address for a client
|
||||
socket. This may be overridden by supplying an alternate address to the
|
||||
first sendmsg() of a call (struct msghdr::msg_name).
|
||||
|
||||
(*) If connect() is called on an unbound client, a random local port will
|
||||
bound before the operation takes place.
|
||||
|
||||
(*) A server socket may also be used to make client calls. To do this, the
|
||||
first sendmsg() of the call must specify the target address. The server's
|
||||
transport endpoint is used to send the packets.
|
||||
|
||||
(*) Once the application has received the last message associated with a call,
|
||||
the tag is guaranteed not to be seen again, and so it can be used to pin
|
||||
client resources. A new call can then be initiated with the same tag
|
||||
without fear of interference.
|
||||
|
||||
(*) In the server, a request is received with one or more recvmsgs, then the
|
||||
the reply is transmitted with one or more sendmsgs, and then the final ACK
|
||||
is received with a last recvmsg.
|
||||
|
||||
(*) When sending data for a call, sendmsg is given MSG_MORE if there's more
|
||||
data to come on that call.
|
||||
|
||||
(*) When receiving data for a call, recvmsg flags MSG_MORE if there's more
|
||||
data to come for that call.
|
||||
|
||||
(*) When receiving data or messages for a call, MSG_EOR is flagged by recvmsg
|
||||
to indicate the terminal message for that call.
|
||||
|
||||
(*) A call may be aborted by adding an abort control message to the control
|
||||
data. Issuing an abort terminates the kernel's use of that call's tag.
|
||||
Any messages waiting in the receive queue for that call will be discarded.
|
||||
|
||||
(*) Aborts, busy notifications and challenge packets are delivered by recvmsg,
|
||||
and control data messages will be set to indicate the context. Receiving
|
||||
an abort or a busy message terminates the kernel's use of that call's tag.
|
||||
|
||||
(*) The control data part of the msghdr struct is used for a number of things:
|
||||
|
||||
(*) The tag of the intended or affected call.
|
||||
|
||||
(*) Sending or receiving errors, aborts and busy notifications.
|
||||
|
||||
(*) Notifications of incoming calls.
|
||||
|
||||
(*) Sending debug requests and receiving debug replies [TODO].
|
||||
|
||||
(*) When the kernel has received and set up an incoming call, it sends a
|
||||
message to server application to let it know there's a new call awaiting
|
||||
its acceptance [recvmsg reports a special control message]. The server
|
||||
application then uses sendmsg to assign a tag to the new call. Once that
|
||||
is done, the first part of the request data will be delivered by recvmsg.
|
||||
|
||||
(*) The server application has to provide the server socket with a keyring of
|
||||
secret keys corresponding to the security types it permits. When a secure
|
||||
connection is being set up, the kernel looks up the appropriate secret key
|
||||
in the keyring and then sends a challenge packet to the client and
|
||||
receives a response packet. The kernel then checks the authorisation of
|
||||
the packet and either aborts the connection or sets up the security.
|
||||
|
||||
(*) The name of the key a client will use to secure its communications is
|
||||
nominated by a socket option.
|
||||
|
||||
|
||||
Notes on recvmsg:
|
||||
|
||||
(*) If there's a sequence of data messages belonging to a particular call on
|
||||
the receive queue, then recvmsg will keep working through them until:
|
||||
|
||||
(a) it meets the end of that call's received data,
|
||||
|
||||
(b) it meets a non-data message,
|
||||
|
||||
(c) it meets a message belonging to a different call, or
|
||||
|
||||
(d) it fills the user buffer.
|
||||
|
||||
If recvmsg is called in blocking mode, it will keep sleeping, awaiting the
|
||||
reception of further data, until one of the above four conditions is met.
|
||||
|
||||
(2) MSG_PEEK operates similarly, but will return immediately if it has put any
|
||||
data in the buffer rather than sleeping until it can fill the buffer.
|
||||
|
||||
(3) If a data message is only partially consumed in filling a user buffer,
|
||||
then the remainder of that message will be left on the front of the queue
|
||||
for the next taker. MSG_TRUNC will never be flagged.
|
||||
|
||||
(4) If there is more data to be had on a call (it hasn't copied the last byte
|
||||
of the last data message in that phase yet), then MSG_MORE will be
|
||||
flagged.
|
||||
|
||||
|
||||
================
|
||||
CONTROL MESSAGES
|
||||
================
|
||||
|
||||
AF_RXRPC makes use of control messages in sendmsg() and recvmsg() to multiplex
|
||||
calls, to invoke certain actions and to report certain conditions. These are:
|
||||
|
||||
MESSAGE ID SRT DATA MEANING
|
||||
======================= === =========== ===============================
|
||||
RXRPC_USER_CALL_ID sr- User ID App's call specifier
|
||||
RXRPC_ABORT srt Abort code Abort code to issue/received
|
||||
RXRPC_ACK -rt n/a Final ACK received
|
||||
RXRPC_NET_ERROR -rt error num Network error on call
|
||||
RXRPC_BUSY -rt n/a Call rejected (server busy)
|
||||
RXRPC_LOCAL_ERROR -rt error num Local error encountered
|
||||
RXRPC_NEW_CALL -r- n/a New call received
|
||||
RXRPC_ACCEPT s-- n/a Accept new call
|
||||
|
||||
(SRT = usable in Sendmsg / delivered by Recvmsg / Terminal message)
|
||||
|
||||
(*) RXRPC_USER_CALL_ID
|
||||
|
||||
This is used to indicate the application's call ID. It's an unsigned long
|
||||
that the app specifies in the client by attaching it to the first data
|
||||
message or in the server by passing it in association with an RXRPC_ACCEPT
|
||||
message. recvmsg() passes it in conjunction with all messages except
|
||||
those of the RXRPC_NEW_CALL message.
|
||||
|
||||
(*) RXRPC_ABORT
|
||||
|
||||
This is can be used by an application to abort a call by passing it to
|
||||
sendmsg, or it can be delivered by recvmsg to indicate a remote abort was
|
||||
received. Either way, it must be associated with an RXRPC_USER_CALL_ID to
|
||||
specify the call affected. If an abort is being sent, then error EBADSLT
|
||||
will be returned if there is no call with that user ID.
|
||||
|
||||
(*) RXRPC_ACK
|
||||
|
||||
This is delivered to a server application to indicate that the final ACK
|
||||
of a call was received from the client. It will be associated with an
|
||||
RXRPC_USER_CALL_ID to indicate the call that's now complete.
|
||||
|
||||
(*) RXRPC_NET_ERROR
|
||||
|
||||
This is delivered to an application to indicate that an ICMP error message
|
||||
was encountered in the process of trying to talk to the peer. An
|
||||
errno-class integer value will be included in the control message data
|
||||
indicating the problem, and an RXRPC_USER_CALL_ID will indicate the call
|
||||
affected.
|
||||
|
||||
(*) RXRPC_BUSY
|
||||
|
||||
This is delivered to a client application to indicate that a call was
|
||||
rejected by the server due to the server being busy. It will be
|
||||
associated with an RXRPC_USER_CALL_ID to indicate the rejected call.
|
||||
|
||||
(*) RXRPC_LOCAL_ERROR
|
||||
|
||||
This is delivered to an application to indicate that a local error was
|
||||
encountered and that a call has been aborted because of it. An
|
||||
errno-class integer value will be included in the control message data
|
||||
indicating the problem, and an RXRPC_USER_CALL_ID will indicate the call
|
||||
affected.
|
||||
|
||||
(*) RXRPC_NEW_CALL
|
||||
|
||||
This is delivered to indicate to a server application that a new call has
|
||||
arrived and is awaiting acceptance. No user ID is associated with this,
|
||||
as a user ID must subsequently be assigned by doing an RXRPC_ACCEPT.
|
||||
|
||||
(*) RXRPC_ACCEPT
|
||||
|
||||
This is used by a server application to attempt to accept a call and
|
||||
assign it a user ID. It should be associated with an RXRPC_USER_CALL_ID
|
||||
to indicate the user ID to be assigned. If there is no call to be
|
||||
accepted (it may have timed out, been aborted, etc.), then sendmsg will
|
||||
return error ENODATA. If the user ID is already in use by another call,
|
||||
then error EBADSLT will be returned.
|
||||
|
||||
|
||||
==============
|
||||
SOCKET OPTIONS
|
||||
==============
|
||||
|
||||
AF_RXRPC sockets support a few socket options at the SOL_RXRPC level:
|
||||
|
||||
(*) RXRPC_SECURITY_KEY
|
||||
|
||||
This is used to specify the description of the key to be used. The key is
|
||||
extracted from the calling process's keyrings with request_key() and
|
||||
should be of "rxrpc" type.
|
||||
|
||||
The optval pointer points to the description string, and optlen indicates
|
||||
how long the string is, without the NUL terminator.
|
||||
|
||||
(*) RXRPC_SECURITY_KEYRING
|
||||
|
||||
Similar to above but specifies a keyring of server secret keys to use (key
|
||||
type "keyring"). See the "Security" section.
|
||||
|
||||
(*) RXRPC_EXCLUSIVE_CONNECTION
|
||||
|
||||
This is used to request that new connections should be used for each call
|
||||
made subsequently on this socket. optval should be NULL and optlen 0.
|
||||
|
||||
(*) RXRPC_MIN_SECURITY_LEVEL
|
||||
|
||||
This is used to specify the minimum security level required for calls on
|
||||
this socket. optval must point to an int containing one of the following
|
||||
values:
|
||||
|
||||
(a) RXRPC_SECURITY_PLAIN
|
||||
|
||||
Encrypted checksum only.
|
||||
|
||||
(b) RXRPC_SECURITY_AUTH
|
||||
|
||||
Encrypted checksum plus packet padded and first eight bytes of packet
|
||||
encrypted - which includes the actual packet length.
|
||||
|
||||
(c) RXRPC_SECURITY_ENCRYPTED
|
||||
|
||||
Encrypted checksum plus entire packet padded and encrypted, including
|
||||
actual packet length.
|
||||
|
||||
|
||||
========
|
||||
SECURITY
|
||||
========
|
||||
|
||||
Currently, only the kerberos 4 equivalent protocol has been implemented
|
||||
(security index 2 - rxkad). This requires the rxkad module to be loaded and,
|
||||
on the client, tickets of the appropriate type to be obtained from the AFS
|
||||
kaserver or the kerberos server and installed as "rxrpc" type keys. This is
|
||||
normally done using the klog program. An example simple klog program can be
|
||||
found at:
|
||||
|
||||
http://people.redhat.com/~dhowells/rxrpc/klog.c
|
||||
|
||||
The payload provided to add_key() on the client should be of the following
|
||||
form:
|
||||
|
||||
struct rxrpc_key_sec2_v1 {
|
||||
uint16_t security_index; /* 2 */
|
||||
uint16_t ticket_length; /* length of ticket[] */
|
||||
uint32_t expiry; /* time at which expires */
|
||||
uint8_t kvno; /* key version number */
|
||||
uint8_t __pad[3];
|
||||
uint8_t session_key[8]; /* DES session key */
|
||||
uint8_t ticket[0]; /* the encrypted ticket */
|
||||
};
|
||||
|
||||
Where the ticket blob is just appended to the above structure.
|
||||
|
||||
|
||||
For the server, keys of type "rxrpc_s" must be made available to the server.
|
||||
They have a description of "<serviceID>:<securityIndex>" (eg: "52:2" for an
|
||||
rxkad key for the AFS VL service). When such a key is created, it should be
|
||||
given the server's secret key as the instantiation data (see the example
|
||||
below).
|
||||
|
||||
add_key("rxrpc_s", "52:2", secret_key, 8, keyring);
|
||||
|
||||
A keyring is passed to the server socket by naming it in a sockopt. The server
|
||||
socket then looks the server secret keys up in this keyring when secure
|
||||
incoming connections are made. This can be seen in an example program that can
|
||||
be found at:
|
||||
|
||||
http://people.redhat.com/~dhowells/rxrpc/listen.c
|
||||
|
||||
|
||||
====================
|
||||
EXAMPLE CLIENT USAGE
|
||||
====================
|
||||
|
||||
A client would issue an operation by:
|
||||
|
||||
(1) An RxRPC socket is set up by:
|
||||
|
||||
client = socket(AF_RXRPC, SOCK_DGRAM, PF_INET);
|
||||
|
||||
Where the third parameter indicates the protocol family of the transport
|
||||
socket used - usually IPv4 but it can also be IPv6 [TODO].
|
||||
|
||||
(2) A local address can optionally be bound:
|
||||
|
||||
struct sockaddr_rxrpc srx = {
|
||||
.srx_family = AF_RXRPC,
|
||||
.srx_service = 0, /* we're a client */
|
||||
.transport_type = SOCK_DGRAM, /* type of transport socket */
|
||||
.transport.sin_family = AF_INET,
|
||||
.transport.sin_port = htons(7000), /* AFS callback */
|
||||
.transport.sin_address = 0, /* all local interfaces */
|
||||
};
|
||||
bind(client, &srx, sizeof(srx));
|
||||
|
||||
This specifies the local UDP port to be used. If not given, a random
|
||||
non-privileged port will be used. A UDP port may be shared between
|
||||
several unrelated RxRPC sockets. Security is handled on a basis of
|
||||
per-RxRPC virtual connection.
|
||||
|
||||
(3) The security is set:
|
||||
|
||||
const char *key = "AFS:cambridge.redhat.com";
|
||||
setsockopt(client, SOL_RXRPC, RXRPC_SECURITY_KEY, key, strlen(key));
|
||||
|
||||
This issues a request_key() to get the key representing the security
|
||||
context. The minimum security level can be set:
|
||||
|
||||
unsigned int sec = RXRPC_SECURITY_ENCRYPTED;
|
||||
setsockopt(client, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL,
|
||||
&sec, sizeof(sec));
|
||||
|
||||
(4) The server to be contacted can then be specified (alternatively this can
|
||||
be done through sendmsg):
|
||||
|
||||
struct sockaddr_rxrpc srx = {
|
||||
.srx_family = AF_RXRPC,
|
||||
.srx_service = VL_SERVICE_ID,
|
||||
.transport_type = SOCK_DGRAM, /* type of transport socket */
|
||||
.transport.sin_family = AF_INET,
|
||||
.transport.sin_port = htons(7005), /* AFS volume manager */
|
||||
.transport.sin_address = ...,
|
||||
};
|
||||
connect(client, &srx, sizeof(srx));
|
||||
|
||||
(5) The request data should then be posted to the server socket using a series
|
||||
of sendmsg() calls, each with the following control message attached:
|
||||
|
||||
RXRPC_USER_CALL_ID - specifies the user ID for this call
|
||||
|
||||
MSG_MORE should be set in msghdr::msg_flags on all but the last part of
|
||||
the request. Multiple requests may be made simultaneously.
|
||||
|
||||
If a call is intended to go to a destination other then the default
|
||||
specified through connect(), then msghdr::msg_name should be set on the
|
||||
first request message of that call.
|
||||
|
||||
(6) The reply data will then be posted to the server socket for recvmsg() to
|
||||
pick up. MSG_MORE will be flagged by recvmsg() if there's more reply data
|
||||
for a particular call to be read. MSG_EOR will be set on the terminal
|
||||
read for a call.
|
||||
|
||||
All data will be delivered with the following control message attached:
|
||||
|
||||
RXRPC_USER_CALL_ID - specifies the user ID for this call
|
||||
|
||||
If an abort or error occurred, this will be returned in the control data
|
||||
buffer instead, and MSG_EOR will be flagged to indicate the end of that
|
||||
call.
|
||||
|
||||
|
||||
====================
|
||||
EXAMPLE SERVER USAGE
|
||||
====================
|
||||
|
||||
A server would be set up to accept operations in the following manner:
|
||||
|
||||
(1) An RxRPC socket is created by:
|
||||
|
||||
server = socket(AF_RXRPC, SOCK_DGRAM, PF_INET);
|
||||
|
||||
Where the third parameter indicates the address type of the transport
|
||||
socket used - usually IPv4.
|
||||
|
||||
(2) Security is set up if desired by giving the socket a keyring with server
|
||||
secret keys in it:
|
||||
|
||||
keyring = add_key("keyring", "AFSkeys", NULL, 0,
|
||||
KEY_SPEC_PROCESS_KEYRING);
|
||||
|
||||
const char secret_key[8] = {
|
||||
0xa7, 0x83, 0x8a, 0xcb, 0xc7, 0x83, 0xec, 0x94 };
|
||||
add_key("rxrpc_s", "52:2", secret_key, 8, keyring);
|
||||
|
||||
setsockopt(server, SOL_RXRPC, RXRPC_SECURITY_KEYRING, "AFSkeys", 7);
|
||||
|
||||
The keyring can be manipulated after it has been given to the socket. This
|
||||
permits the server to add more keys, replace keys, etc. whilst it is live.
|
||||
|
||||
(2) A local address must then be bound:
|
||||
|
||||
struct sockaddr_rxrpc srx = {
|
||||
.srx_family = AF_RXRPC,
|
||||
.srx_service = VL_SERVICE_ID, /* RxRPC service ID */
|
||||
.transport_type = SOCK_DGRAM, /* type of transport socket */
|
||||
.transport.sin_family = AF_INET,
|
||||
.transport.sin_port = htons(7000), /* AFS callback */
|
||||
.transport.sin_address = 0, /* all local interfaces */
|
||||
};
|
||||
bind(server, &srx, sizeof(srx));
|
||||
|
||||
(3) The server is then set to listen out for incoming calls:
|
||||
|
||||
listen(server, 100);
|
||||
|
||||
(4) The kernel notifies the server of pending incoming connections by sending
|
||||
it a message for each. This is received with recvmsg() on the server
|
||||
socket. It has no data, and has a single dataless control message
|
||||
attached:
|
||||
|
||||
RXRPC_NEW_CALL
|
||||
|
||||
The address that can be passed back by recvmsg() at this point should be
|
||||
ignored since the call for which the message was posted may have gone by
|
||||
the time it is accepted - in which case the first call still on the queue
|
||||
will be accepted.
|
||||
|
||||
(5) The server then accepts the new call by issuing a sendmsg() with two
|
||||
pieces of control data and no actual data:
|
||||
|
||||
RXRPC_ACCEPT - indicate connection acceptance
|
||||
RXRPC_USER_CALL_ID - specify user ID for this call
|
||||
|
||||
(6) The first request data packet will then be posted to the server socket for
|
||||
recvmsg() to pick up. At that point, the RxRPC address for the call can
|
||||
be read from the address fields in the msghdr struct.
|
||||
|
||||
Subsequent request data will be posted to the server socket for recvmsg()
|
||||
to collect as it arrives. All but the last piece of the request data will
|
||||
be delivered with MSG_MORE flagged.
|
||||
|
||||
All data will be delivered with the following control message attached:
|
||||
|
||||
RXRPC_USER_CALL_ID - specifies the user ID for this call
|
||||
|
||||
(8) The reply data should then be posted to the server socket using a series
|
||||
of sendmsg() calls, each with the following control messages attached:
|
||||
|
||||
RXRPC_USER_CALL_ID - specifies the user ID for this call
|
||||
|
||||
MSG_MORE should be set in msghdr::msg_flags on all but the last message
|
||||
for a particular call.
|
||||
|
||||
(9) The final ACK from the client will be posted for retrieval by recvmsg()
|
||||
when it is received. It will take the form of a dataless message with two
|
||||
control messages attached:
|
||||
|
||||
RXRPC_USER_CALL_ID - specifies the user ID for this call
|
||||
RXRPC_ACK - indicates final ACK (no data)
|
||||
|
||||
MSG_EOR will be flagged to indicate that this is the final message for
|
||||
this call.
|
||||
|
||||
(10) Up to the point the final packet of reply data is sent, the call can be
|
||||
aborted by calling sendmsg() with a dataless message with the following
|
||||
control messages attached:
|
||||
|
||||
RXRPC_USER_CALL_ID - specifies the user ID for this call
|
||||
RXRPC_ABORT - indicates abort code (4 byte data)
|
||||
|
||||
Any packets waiting in the socket's receive queue will be discarded if
|
||||
this is issued.
|
||||
|
||||
Note that all the communications for a particular service take place through
|
||||
the one server socket, using control messages on sendmsg() and recvmsg() to
|
||||
determine the call affected.
|
||||
|
||||
|
||||
=========================
|
||||
AF_RXRPC KERNEL INTERFACE
|
||||
=========================
|
||||
|
||||
The AF_RXRPC module also provides an interface for use by in-kernel utilities
|
||||
such as the AFS filesystem. This permits such a utility to:
|
||||
|
||||
(1) Use different keys directly on individual client calls on one socket
|
||||
rather than having to open a whole slew of sockets, one for each key it
|
||||
might want to use.
|
||||
|
||||
(2) Avoid having RxRPC call request_key() at the point of issue of a call or
|
||||
opening of a socket. Instead the utility is responsible for requesting a
|
||||
key at the appropriate point. AFS, for instance, would do this during VFS
|
||||
operations such as open() or unlink(). The key is then handed through
|
||||
when the call is initiated.
|
||||
|
||||
(3) Request the use of something other than GFP_KERNEL to allocate memory.
|
||||
|
||||
(4) Avoid the overhead of using the recvmsg() call. RxRPC messages can be
|
||||
intercepted before they get put into the socket Rx queue and the socket
|
||||
buffers manipulated directly.
|
||||
|
||||
To use the RxRPC facility, a kernel utility must still open an AF_RXRPC socket,
|
||||
bind an addess as appropriate and listen if it's to be a server socket, but
|
||||
then it passes this to the kernel interface functions.
|
||||
|
||||
The kernel interface functions are as follows:
|
||||
|
||||
(*) Begin a new client call.
|
||||
|
||||
struct rxrpc_call *
|
||||
rxrpc_kernel_begin_call(struct socket *sock,
|
||||
struct sockaddr_rxrpc *srx,
|
||||
struct key *key,
|
||||
unsigned long user_call_ID,
|
||||
gfp_t gfp);
|
||||
|
||||
This allocates the infrastructure to make a new RxRPC call and assigns
|
||||
call and connection numbers. The call will be made on the UDP port that
|
||||
the socket is bound to. The call will go to the destination address of a
|
||||
connected client socket unless an alternative is supplied (srx is
|
||||
non-NULL).
|
||||
|
||||
If a key is supplied then this will be used to secure the call instead of
|
||||
the key bound to the socket with the RXRPC_SECURITY_KEY sockopt. Calls
|
||||
secured in this way will still share connections if at all possible.
|
||||
|
||||
The user_call_ID is equivalent to that supplied to sendmsg() in the
|
||||
control data buffer. It is entirely feasible to use this to point to a
|
||||
kernel data structure.
|
||||
|
||||
If this function is successful, an opaque reference to the RxRPC call is
|
||||
returned. The caller now holds a reference on this and it must be
|
||||
properly ended.
|
||||
|
||||
(*) End a client call.
|
||||
|
||||
void rxrpc_kernel_end_call(struct rxrpc_call *call);
|
||||
|
||||
This is used to end a previously begun call. The user_call_ID is expunged
|
||||
from AF_RXRPC's knowledge and will not be seen again in association with
|
||||
the specified call.
|
||||
|
||||
(*) Send data through a call.
|
||||
|
||||
int rxrpc_kernel_send_data(struct rxrpc_call *call, struct msghdr *msg,
|
||||
size_t len);
|
||||
|
||||
This is used to supply either the request part of a client call or the
|
||||
reply part of a server call. msg.msg_iovlen and msg.msg_iov specify the
|
||||
data buffers to be used. msg_iov may not be NULL and must point
|
||||
exclusively to in-kernel virtual addresses. msg.msg_flags may be given
|
||||
MSG_MORE if there will be subsequent data sends for this call.
|
||||
|
||||
The msg must not specify a destination address, control data or any flags
|
||||
other than MSG_MORE. len is the total amount of data to transmit.
|
||||
|
||||
(*) Abort a call.
|
||||
|
||||
void rxrpc_kernel_abort_call(struct rxrpc_call *call, u32 abort_code);
|
||||
|
||||
This is used to abort a call if it's still in an abortable state. The
|
||||
abort code specified will be placed in the ABORT message sent.
|
||||
|
||||
(*) Intercept received RxRPC messages.
|
||||
|
||||
typedef void (*rxrpc_interceptor_t)(struct sock *sk,
|
||||
unsigned long user_call_ID,
|
||||
struct sk_buff *skb);
|
||||
|
||||
void
|
||||
rxrpc_kernel_intercept_rx_messages(struct socket *sock,
|
||||
rxrpc_interceptor_t interceptor);
|
||||
|
||||
This installs an interceptor function on the specified AF_RXRPC socket.
|
||||
All messages that would otherwise wind up in the socket's Rx queue are
|
||||
then diverted to this function. Note that care must be taken to process
|
||||
the messages in the right order to maintain DATA message sequentiality.
|
||||
|
||||
The interceptor function itself is provided with the address of the socket
|
||||
and handling the incoming message, the ID assigned by the kernel utility
|
||||
to the call and the socket buffer containing the message.
|
||||
|
||||
The skb->mark field indicates the type of message:
|
||||
|
||||
MARK MEANING
|
||||
=============================== =======================================
|
||||
RXRPC_SKB_MARK_DATA Data message
|
||||
RXRPC_SKB_MARK_FINAL_ACK Final ACK received for an incoming call
|
||||
RXRPC_SKB_MARK_BUSY Client call rejected as server busy
|
||||
RXRPC_SKB_MARK_REMOTE_ABORT Call aborted by peer
|
||||
RXRPC_SKB_MARK_NET_ERROR Network error detected
|
||||
RXRPC_SKB_MARK_LOCAL_ERROR Local error encountered
|
||||
RXRPC_SKB_MARK_NEW_CALL New incoming call awaiting acceptance
|
||||
|
||||
The remote abort message can be probed with rxrpc_kernel_get_abort_code().
|
||||
The two error messages can be probed with rxrpc_kernel_get_error_number().
|
||||
A new call can be accepted with rxrpc_kernel_accept_call().
|
||||
|
||||
Data messages can have their contents extracted with the usual bunch of
|
||||
socket buffer manipulation functions. A data message can be determined to
|
||||
be the last one in a sequence with rxrpc_kernel_is_data_last(). When a
|
||||
data message has been used up, rxrpc_kernel_data_delivered() should be
|
||||
called on it..
|
||||
|
||||
Non-data messages should be handled to rxrpc_kernel_free_skb() to dispose
|
||||
of. It is possible to get extra refs on all types of message for later
|
||||
freeing, but this may pin the state of a call until the message is finally
|
||||
freed.
|
||||
|
||||
(*) Accept an incoming call.
|
||||
|
||||
struct rxrpc_call *
|
||||
rxrpc_kernel_accept_call(struct socket *sock,
|
||||
unsigned long user_call_ID);
|
||||
|
||||
This is used to accept an incoming call and to assign it a call ID. This
|
||||
function is similar to rxrpc_kernel_begin_call() and calls accepted must
|
||||
be ended in the same way.
|
||||
|
||||
If this function is successful, an opaque reference to the RxRPC call is
|
||||
returned. The caller now holds a reference on this and it must be
|
||||
properly ended.
|
||||
|
||||
(*) Reject an incoming call.
|
||||
|
||||
int rxrpc_kernel_reject_call(struct socket *sock);
|
||||
|
||||
This is used to reject the first incoming call on the socket's queue with
|
||||
a BUSY message. -ENODATA is returned if there were no incoming calls.
|
||||
Other errors may be returned if the call had been aborted (-ECONNABORTED)
|
||||
or had timed out (-ETIME).
|
||||
|
||||
(*) Record the delivery of a data message and free it.
|
||||
|
||||
void rxrpc_kernel_data_delivered(struct sk_buff *skb);
|
||||
|
||||
This is used to record a data message as having been delivered and to
|
||||
update the ACK state for the call. The socket buffer will be freed.
|
||||
|
||||
(*) Free a message.
|
||||
|
||||
void rxrpc_kernel_free_skb(struct sk_buff *skb);
|
||||
|
||||
This is used to free a non-DATA socket buffer intercepted from an AF_RXRPC
|
||||
socket.
|
||||
|
||||
(*) Determine if a data message is the last one on a call.
|
||||
|
||||
bool rxrpc_kernel_is_data_last(struct sk_buff *skb);
|
||||
|
||||
This is used to determine if a socket buffer holds the last data message
|
||||
to be received for a call (true will be returned if it does, false
|
||||
if not).
|
||||
|
||||
The data message will be part of the reply on a client call and the
|
||||
request on an incoming call. In the latter case there will be more
|
||||
messages, but in the former case there will not.
|
||||
|
||||
(*) Get the abort code from an abort message.
|
||||
|
||||
u32 rxrpc_kernel_get_abort_code(struct sk_buff *skb);
|
||||
|
||||
This is used to extract the abort code from a remote abort message.
|
||||
|
||||
(*) Get the error number from a local or network error message.
|
||||
|
||||
int rxrpc_kernel_get_error_number(struct sk_buff *skb);
|
||||
|
||||
This is used to extract the error number from a message indicating either
|
||||
a local error occurred or a network error occurred.
|
@ -250,7 +250,6 @@ PRODUCT COMPONENTS AND RELATED FILES
|
||||
sdladrv.h SDLA support module API definitions
|
||||
sdlasfm.h SDLA firmware module definitions
|
||||
if_wanpipe.h WANPIPE Socket definitions
|
||||
if_wanpipe_common.h WANPIPE Socket/Driver common definitions.
|
||||
sdlapci.h WANPIPE PCI definitions
|
||||
|
||||
|
||||
|
@ -234,6 +234,12 @@ characters, each representing a particular tainted value.
|
||||
6: 'B' if a page-release function has found a bad page reference or
|
||||
some unexpected page flags.
|
||||
|
||||
7: 'U' if a user specifically requested that the Tainted flag be set,
|
||||
' ' otherwise.
|
||||
|
||||
7: 'U' if a user or user application specifically requested that the
|
||||
Tainted flag be set, ' ' otherwise.
|
||||
|
||||
The primary reason for the 'Tainted: ' string is to tell kernel
|
||||
debuggers if this is a clean kernel or if anything unusual has
|
||||
occurred. Tainting is permanent: even if an offending module is
|
||||
|
@ -205,8 +205,8 @@ Tips on when/where to use the above attributes:
|
||||
exclusively called by the probe() routine, can be marked __devinit.
|
||||
Ditto for remove() and __devexit.
|
||||
|
||||
o If mydriver_probe() is marked with __devinit(), then all address
|
||||
references to mydriver_probe must use __devexit_p(mydriver_probe)
|
||||
o If mydriver_remove() is marked with __devexit(), then all address
|
||||
references to mydriver_remove must use __devexit_p(mydriver_remove)
|
||||
(in the struct pci_driver declaration for example).
|
||||
__devexit_p() will generate the function name _or_ NULL if the
|
||||
function will be discarded. For an example, see drivers/net/tg3.c.
|
||||
|
@ -18,17 +18,10 @@ states.
|
||||
|
||||
|
||||
/sys/power/disk controls the operating mode of the suspend-to-disk
|
||||
mechanism. Suspend-to-disk can be handled in several ways. The
|
||||
greatest distinction is who writes memory to disk - the firmware or
|
||||
the kernel. If the firmware does it, we assume that it also handles
|
||||
suspending the system.
|
||||
|
||||
If the kernel does it, then we have three options for putting the system
|
||||
to sleep - using the platform driver (e.g. ACPI or other PM
|
||||
registers), powering off the system or rebooting the system (for
|
||||
testing). The system will support either 'firmware' or 'platform', and
|
||||
that is known a priori. But, the user may choose 'shutdown' or
|
||||
'reboot' as alternatives.
|
||||
mechanism. Suspend-to-disk can be handled in several ways. We have a
|
||||
few options for putting the system to sleep - using the platform driver
|
||||
(e.g. ACPI or other pm_ops), powering off the system or rebooting the
|
||||
system (for testing).
|
||||
|
||||
Additionally, /sys/power/disk can be used to turn on one of the two testing
|
||||
modes of the suspend-to-disk mechanism: 'testproc' or 'test'. If the
|
||||
@ -44,16 +37,12 @@ is being slow and which device drivers are misbehaving.
|
||||
Reading from this file will display what the mode is currently set
|
||||
to. Writing to this file will accept one of
|
||||
|
||||
'firmware'
|
||||
'platform'
|
||||
'platform' (only if the platform supports it)
|
||||
'shutdown'
|
||||
'reboot'
|
||||
'testproc'
|
||||
'test'
|
||||
|
||||
It will only change to 'firmware' or 'platform' if the system supports
|
||||
it.
|
||||
|
||||
/sys/power/image_size controls the size of the image created by
|
||||
the suspend-to-disk mechanism. It can be written a string
|
||||
representing a non-negative integer that will be used as an upper
|
||||
|
@ -102,31 +102,28 @@ pci_save_state
|
||||
--------------
|
||||
|
||||
Usage:
|
||||
pci_save_state(dev, buffer);
|
||||
pci_save_state(struct pci_dev *dev);
|
||||
|
||||
Description:
|
||||
Save first 64 bytes of PCI config space. Buffer must be allocated by
|
||||
caller.
|
||||
Save first 64 bytes of PCI config space, along with any additional
|
||||
PCI-Express or PCI-X information.
|
||||
|
||||
|
||||
pci_restore_state
|
||||
-----------------
|
||||
|
||||
Usage:
|
||||
pci_restore_state(dev, buffer);
|
||||
pci_restore_state(struct pci_dev *dev);
|
||||
|
||||
Description:
|
||||
Restore previously saved config space. (First 64 bytes only);
|
||||
|
||||
If buffer is NULL, then restore what information we know about the
|
||||
device from bootup: BARs and interrupt line.
|
||||
Restore previously saved config space.
|
||||
|
||||
|
||||
pci_set_power_state
|
||||
-------------------
|
||||
|
||||
Usage:
|
||||
pci_set_power_state(dev, state);
|
||||
pci_set_power_state(struct pci_dev *dev, pci_power_t state);
|
||||
|
||||
Description:
|
||||
Transition device to low power state using PCI PM Capabilities
|
||||
@ -142,7 +139,7 @@ pci_enable_wake
|
||||
---------------
|
||||
|
||||
Usage:
|
||||
pci_enable_wake(dev, state, enable);
|
||||
pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable);
|
||||
|
||||
Description:
|
||||
Enable device to generate PME# during low power state using PCI PM
|
||||
|
@ -62,11 +62,12 @@ setup via another operating system for it to use. Despite the
|
||||
inconvenience, this method requires minimal work by the kernel, since
|
||||
the firmware will also handle restoring memory contents on resume.
|
||||
|
||||
If the kernel is responsible for persistently saving state, a mechanism
|
||||
called 'swsusp' (Swap Suspend) is used to write memory contents to
|
||||
free swap space. swsusp has some restrictive requirements, but should
|
||||
work in most cases. Some, albeit outdated, documentation can be found
|
||||
in Documentation/power/swsusp.txt.
|
||||
For suspend-to-disk, a mechanism called swsusp called 'swsusp' (Swap
|
||||
Suspend) is used to write memory contents to free swap space.
|
||||
swsusp has some restrictive requirements, but should work in most
|
||||
cases. Some, albeit outdated, documentation can be found in
|
||||
Documentation/power/swsusp.txt. Alternatively, userspace can do most
|
||||
of the actual suspend to disk work, see userland-swsusp.txt.
|
||||
|
||||
Once memory state is written to disk, the system may either enter a
|
||||
low-power state (like ACPI S4), or it may simply power down. Powering
|
||||
|
@ -156,8 +156,7 @@ instead set the PF_NOFREEZE process flag when creating the thread (and
|
||||
be very careful).
|
||||
|
||||
|
||||
Q: What is the difference between "platform", "shutdown" and
|
||||
"firmware" in /sys/power/disk?
|
||||
Q: What is the difference between "platform" and "shutdown"?
|
||||
|
||||
A:
|
||||
|
||||
@ -166,11 +165,8 @@ shutdown: save state in linux, then tell bios to powerdown
|
||||
platform: save state in linux, then tell bios to powerdown and blink
|
||||
"suspended led"
|
||||
|
||||
firmware: tell bios to save state itself [needs BIOS-specific suspend
|
||||
partition, and has very little to do with swsusp]
|
||||
|
||||
"platform" is actually right thing to do, but "shutdown" is most
|
||||
reliable.
|
||||
"platform" is actually right thing to do where supported, but
|
||||
"shutdown" is most reliable (except on ACPI systems).
|
||||
|
||||
Q: I do not understand why you have such strong objections to idea of
|
||||
selective suspend.
|
||||
@ -388,8 +384,8 @@ while the system is asleep, maintaining the connection, using true sleep
|
||||
modes like "suspend-to-RAM" or "standby". (Don't write "disk" to the
|
||||
/sys/power/state file; write "standby" or "mem".) We've not seen any
|
||||
hardware that can use these modes through software suspend, although in
|
||||
theory some systems might support "platform" or "firmware" modes that
|
||||
won't break the USB connections.
|
||||
theory some systems might support "platform" modes that won't break the
|
||||
USB connections.
|
||||
|
||||
Remember that it's always a bad idea to unplug a disk drive containing a
|
||||
mounted filesystem. That's true even when your system is asleep! The
|
||||
|
@ -39,7 +39,7 @@
|
||||
and property data. The old style variable
|
||||
alignment would make it impossible to do
|
||||
"simple" insertion of properties using
|
||||
memove (thanks Milton for
|
||||
memmove (thanks Milton for
|
||||
noticing). Updated kernel patch as well
|
||||
- Correct a few more alignment constraints
|
||||
- Add a chapter about the device-tree
|
||||
@ -55,7 +55,7 @@
|
||||
|
||||
ToDo:
|
||||
- Add some definitions of interrupt tree (simple/complex)
|
||||
- Add some definitions for pci host bridges
|
||||
- Add some definitions for PCI host bridges
|
||||
- Add some common address format examples
|
||||
- Add definitions for standard properties and "compatible"
|
||||
names for cells that are not already defined by the existing
|
||||
@ -114,7 +114,7 @@ it with special cases.
|
||||
forth words isn't required), you can enter the kernel with:
|
||||
|
||||
r5 : OF callback pointer as defined by IEEE 1275
|
||||
bindings to powerpc. Only the 32 bit client interface
|
||||
bindings to powerpc. Only the 32-bit client interface
|
||||
is currently supported
|
||||
|
||||
r3, r4 : address & length of an initrd if any or 0
|
||||
@ -194,7 +194,7 @@ it with special cases.
|
||||
for this is to keep kernels on embedded systems small and efficient;
|
||||
part of this is due to the fact the code is already that way. In the
|
||||
future, a kernel may support multiple platforms, but only if the
|
||||
platforms feature the same core architectire. A single kernel build
|
||||
platforms feature the same core architecture. A single kernel build
|
||||
cannot support both configurations with Book E and configurations
|
||||
with classic Powerpc architectures.
|
||||
|
||||
@ -215,7 +215,7 @@ of the boot sequences.... someone speak up if this is wrong!
|
||||
enable another config option to select the specific board
|
||||
supported.
|
||||
|
||||
NOTE: If ben doesn't merge the setup files, may need to change this to
|
||||
NOTE: If Ben doesn't merge the setup files, may need to change this to
|
||||
point to setup_32.c
|
||||
|
||||
|
||||
@ -265,6 +265,9 @@ struct boot_param_header {
|
||||
booting on */
|
||||
/* version 3 fields below */
|
||||
u32 size_dt_strings; /* size of the strings block */
|
||||
|
||||
/* version 17 fields below */
|
||||
u32 size_dt_struct; /* size of the DT structure block */
|
||||
};
|
||||
|
||||
Along with the constants:
|
||||
@ -310,9 +313,8 @@ struct boot_param_header {
|
||||
- off_mem_rsvmap
|
||||
|
||||
This is an offset from the beginning of the header to the start
|
||||
of the reserved memory map. This map is a list of pairs of 64
|
||||
of the reserved memory map. This map is a list of pairs of 64-
|
||||
bit integers. Each pair is a physical address and a size. The
|
||||
|
||||
list is terminated by an entry of size 0. This map provides the
|
||||
kernel with a list of physical memory areas that are "reserved"
|
||||
and thus not to be used for memory allocations, especially during
|
||||
@ -325,7 +327,7 @@ struct boot_param_header {
|
||||
contain _at least_ this DT block itself (header,total_size). If
|
||||
you are passing an initrd to the kernel, you should reserve it as
|
||||
well. You do not need to reserve the kernel image itself. The map
|
||||
should be 64 bit aligned.
|
||||
should be 64-bit aligned.
|
||||
|
||||
- version
|
||||
|
||||
@ -335,10 +337,13 @@ struct boot_param_header {
|
||||
to reallocate it easily at boot and free up the unused flattened
|
||||
structure after expansion. Version 16 introduces a new more
|
||||
"compact" format for the tree itself that is however not backward
|
||||
compatible. You should always generate a structure of the highest
|
||||
version defined at the time of your implementation. Currently
|
||||
that is version 16, unless you explicitly aim at being backward
|
||||
compatible.
|
||||
compatible. Version 17 adds an additional field, size_dt_struct,
|
||||
allowing it to be reallocated or moved more easily (this is
|
||||
particularly useful for bootloaders which need to make
|
||||
adjustments to a device tree based on probed information). You
|
||||
should always generate a structure of the highest version defined
|
||||
at the time of your implementation. Currently that is version 17,
|
||||
unless you explicitly aim at being backward compatible.
|
||||
|
||||
- last_comp_version
|
||||
|
||||
@ -347,7 +352,7 @@ struct boot_param_header {
|
||||
is backward compatible with version 1 (that is, a kernel build
|
||||
for version 1 will be able to boot with a version 2 format). You
|
||||
should put a 1 in this field if you generate a device tree of
|
||||
version 1 to 3, or 0x10 if you generate a tree of version 0x10
|
||||
version 1 to 3, or 16 if you generate a tree of version 16 or 17
|
||||
using the new unit name format.
|
||||
|
||||
- boot_cpuid_phys
|
||||
@ -360,6 +365,17 @@ struct boot_param_header {
|
||||
point (see further chapters for more informations on the required
|
||||
device-tree contents)
|
||||
|
||||
- size_dt_strings
|
||||
|
||||
This field only exists on version 3 and later headers. It
|
||||
gives the size of the "strings" section of the device tree (which
|
||||
starts at the offset given by off_dt_strings).
|
||||
|
||||
- size_dt_struct
|
||||
|
||||
This field only exists on version 17 and later headers. It gives
|
||||
the size of the "structure" section of the device tree (which
|
||||
starts at the offset given by off_dt_struct).
|
||||
|
||||
So the typical layout of a DT block (though the various parts don't
|
||||
need to be in that order) looks like this (addresses go from top to
|
||||
@ -417,7 +433,7 @@ root node who has no parent.
|
||||
A node has 2 names. The actual node name is generally contained in a
|
||||
property of type "name" in the node property list whose value is a
|
||||
zero terminated string and is mandatory for version 1 to 3 of the
|
||||
format definition (as it is in Open Firmware). Version 0x10 makes it
|
||||
format definition (as it is in Open Firmware). Version 16 makes it
|
||||
optional as it can generate it from the unit name defined below.
|
||||
|
||||
There is also a "unit name" that is used to differentiate nodes with
|
||||
@ -461,7 +477,7 @@ referencing another node via "phandle" is when laying out the
|
||||
interrupt tree which will be described in a further version of this
|
||||
document.
|
||||
|
||||
This "linux, phandle" property is a 32 bit value that uniquely
|
||||
This "linux, phandle" property is a 32-bit value that uniquely
|
||||
identifies a node. You are free to use whatever values or system of
|
||||
values, internal pointers, or whatever to generate these, the only
|
||||
requirement is that every node for which you provide that property has
|
||||
@ -471,7 +487,7 @@ Here is an example of a simple device-tree. In this example, an "o"
|
||||
designates a node followed by the node unit name. Properties are
|
||||
presented with their name followed by their content. "content"
|
||||
represents an ASCII string (zero terminated) value, while <content>
|
||||
represents a 32 bit hexadecimal value. The various nodes in this
|
||||
represents a 32-bit hexadecimal value. The various nodes in this
|
||||
example will be discussed in a later chapter. At this point, it is
|
||||
only meant to give you a idea of what a device-tree looks like. I have
|
||||
purposefully kept the "name" and "linux,phandle" properties which
|
||||
@ -497,7 +513,7 @@ looks like in practice.
|
||||
| |- device_type = "cpu"
|
||||
| |- reg = <0>
|
||||
| |- clock-frequency = <5f5e1000>
|
||||
| |- linux,boot-cpu
|
||||
| |- 64-bit
|
||||
| |- linux,phandle = <2>
|
||||
|
|
||||
o memory@0
|
||||
@ -509,7 +525,6 @@ looks like in practice.
|
||||
o chosen
|
||||
|- name = "chosen"
|
||||
|- bootargs = "root=/dev/sda2"
|
||||
|- linux,platform = <00000600>
|
||||
|- linux,phandle = <4>
|
||||
|
||||
This tree is almost a minimal tree. It pretty much contains the
|
||||
@ -519,7 +534,7 @@ physical memory layout. It also includes misc information passed
|
||||
through /chosen, like in this example, the platform type (mandatory)
|
||||
and the kernel command line arguments (optional).
|
||||
|
||||
The /cpus/PowerPC,970@0/linux,boot-cpu property is an example of a
|
||||
The /cpus/PowerPC,970@0/64-bit property is an example of a
|
||||
property without a value. All other properties have a value. The
|
||||
significance of the #address-cells and #size-cells properties will be
|
||||
explained in chapter IV which defines precisely the required nodes and
|
||||
@ -544,15 +559,15 @@ Here's the basic structure of a single node:
|
||||
* [align gap to next 4 bytes boundary]
|
||||
* for each property:
|
||||
* token OF_DT_PROP (that is 0x00000003)
|
||||
* 32 bit value of property value size in bytes (or 0 of no
|
||||
* value)
|
||||
* 32 bit value of offset in string block of property name
|
||||
* 32-bit value of property value size in bytes (or 0 if no
|
||||
value)
|
||||
* 32-bit value of offset in string block of property name
|
||||
* property value data if any
|
||||
* [align gap to next 4 bytes boundary]
|
||||
* [child nodes if any]
|
||||
* token OF_DT_END_NODE (that is 0x00000002)
|
||||
|
||||
So the node content can be summarised as a start token, a full path,
|
||||
So the node content can be summarized as a start token, a full path,
|
||||
a list of properties, a list of child nodes, and an end token. Every
|
||||
child node is a full node structure itself as defined above.
|
||||
|
||||
@ -584,7 +599,7 @@ provide those properties yourself.
|
||||
----------------------------------------------
|
||||
|
||||
The general rule is documented in the various Open Firmware
|
||||
documentations. If you chose to describe a bus with the device-tree
|
||||
documentations. If you choose to describe a bus with the device-tree
|
||||
and there exist an OF bus binding, then you should follow the
|
||||
specification. However, the kernel does not require every single
|
||||
device or bus to be described by the device tree.
|
||||
@ -597,9 +612,9 @@ those properties defining addresses format for devices directly mapped
|
||||
on the processor bus.
|
||||
|
||||
Those 2 properties define 'cells' for representing an address and a
|
||||
size. A "cell" is a 32 bit number. For example, if both contain 2
|
||||
size. A "cell" is a 32-bit number. For example, if both contain 2
|
||||
like the example tree given above, then an address and a size are both
|
||||
composed of 2 cells, and each is a 64 bit number (cells are
|
||||
composed of 2 cells, and each is a 64-bit number (cells are
|
||||
concatenated and expected to be in big endian format). Another example
|
||||
is the way Apple firmware defines them, with 2 cells for an address
|
||||
and one cell for a size. Most 32-bit implementations should define
|
||||
@ -633,7 +648,7 @@ prom_parse.c file of the recent kernels for your bus type.
|
||||
|
||||
The "reg" property only defines addresses and sizes (if #size-cells
|
||||
is non-0) within a given bus. In order to translate addresses upward
|
||||
(that is into parent bus addresses, and possibly into cpu physical
|
||||
(that is into parent bus addresses, and possibly into CPU physical
|
||||
addresses), all busses must contain a "ranges" property. If the
|
||||
"ranges" property is missing at a given level, it's assumed that
|
||||
translation isn't possible. The format of the "ranges" property for a
|
||||
@ -649,9 +664,9 @@ example, for a PCI host controller, that would be a CPU address. For a
|
||||
PCI<->ISA bridge, that would be a PCI address. It defines the base
|
||||
address in the parent bus where the beginning of that range is mapped.
|
||||
|
||||
For a new 64 bit powerpc board, I recommend either the 2/2 format or
|
||||
For a new 64-bit powerpc board, I recommend either the 2/2 format or
|
||||
Apple's 2/1 format which is slightly more compact since sizes usually
|
||||
fit in a single 32 bit word. New 32 bit powerpc boards should use a
|
||||
fit in a single 32-bit word. New 32-bit powerpc boards should use a
|
||||
1/1 format, unless the processor supports physical addresses greater
|
||||
than 32-bits, in which case a 2/1 format is recommended.
|
||||
|
||||
@ -733,8 +748,7 @@ address which can extend beyond that limit.
|
||||
that typically get driven by the same platform code in the
|
||||
kernel, you would use a different "model" property but put a
|
||||
value in "compatible". The kernel doesn't directly use that
|
||||
value (see /chosen/linux,platform for how the kernel chooses a
|
||||
platform type) but it is generally useful.
|
||||
value but it is generally useful.
|
||||
|
||||
The root node is also generally where you add additional properties
|
||||
specific to your board like the serial number if any, that sort of
|
||||
@ -766,7 +780,7 @@ address which can extend beyond that limit.
|
||||
Required properties:
|
||||
|
||||
- device_type : has to be "cpu"
|
||||
- reg : This is the physical cpu number, it's a single 32 bit cell
|
||||
- reg : This is the physical CPU number, it's a single 32-bit cell
|
||||
and is also used as-is as the unit number for constructing the
|
||||
unit name in the full path. For example, with 2 CPUs, you would
|
||||
have the full path:
|
||||
@ -778,7 +792,6 @@ address which can extend beyond that limit.
|
||||
bytes
|
||||
- d-cache-size : one cell, size of L1 data cache in bytes
|
||||
- i-cache-size : one cell, size of L1 instruction cache in bytes
|
||||
- linux, boot-cpu : Should be defined if this cpu is the boot cpu.
|
||||
|
||||
Recommended properties:
|
||||
|
||||
@ -788,7 +801,7 @@ address which can extend beyond that limit.
|
||||
the kernel timebase/decrementer calibration based on this
|
||||
value.
|
||||
- clock-frequency : a cell indicating the CPU core clock frequency
|
||||
in Hz. A new property will be defined for 64 bit values, but if
|
||||
in Hz. A new property will be defined for 64-bit values, but if
|
||||
your frequency is < 4Ghz, one cell is enough. Here as well as
|
||||
for the above, the common code doesn't use that property, but
|
||||
you are welcome to re-use the pSeries or Maple one. A future
|
||||
@ -835,19 +848,13 @@ address which can extend beyond that limit.
|
||||
|
||||
This node is a bit "special". Normally, that's where open firmware
|
||||
puts some variable environment information, like the arguments, or
|
||||
phandle pointers to nodes like the main interrupt controller, or the
|
||||
default input/output devices.
|
||||
the default input/output devices.
|
||||
|
||||
This specification makes a few of these mandatory, but also defines
|
||||
some linux-specific properties that would be normally constructed by
|
||||
the prom_init() trampoline when booting with an OF client interface,
|
||||
but that you have to provide yourself when using the flattened format.
|
||||
|
||||
Required properties:
|
||||
|
||||
- linux,platform : This is your platform number as assigned by the
|
||||
architecture maintainers
|
||||
|
||||
Recommended properties:
|
||||
|
||||
- bootargs : This zero-terminated string is passed as the kernel
|
||||
@ -861,14 +868,14 @@ address which can extend beyond that limit.
|
||||
that the kernel tries to find out the default console and has
|
||||
knowledge of various types like 8250 serial ports. You may want
|
||||
to extend this function to add your own.
|
||||
- interrupt-controller : This is one cell containing a phandle
|
||||
value that matches the "linux,phandle" property of your main
|
||||
interrupt controller node. May be used for interrupt routing.
|
||||
|
||||
|
||||
Note that u-boot creates and fills in the chosen node for platforms
|
||||
that use it.
|
||||
|
||||
(Note: a practice that is now obsolete was to include a property
|
||||
under /chosen called interrupt-controller which had a phandle value
|
||||
that pointed to the main interrupt controller)
|
||||
|
||||
f) the /soc<SOCname> node
|
||||
|
||||
This node is used to represent a system-on-a-chip (SOC) and must be
|
||||
@ -916,8 +923,7 @@ address which can extend beyond that limit.
|
||||
The SOC node may contain child nodes for each SOC device that the
|
||||
platform uses. Nodes should not be created for devices which exist
|
||||
on the SOC but are not used by a particular platform. See chapter VI
|
||||
for more information on how to specify devices that are part of an
|
||||
SOC.
|
||||
for more information on how to specify devices that are part of a SOC.
|
||||
|
||||
Example SOC node for the MPC8540:
|
||||
|
||||
@ -980,7 +986,7 @@ The syntax of the dtc tool is
|
||||
[-o output-filename] [-V output_version] input_filename
|
||||
|
||||
|
||||
The "output_version" defines what versio of the "blob" format will be
|
||||
The "output_version" defines what version of the "blob" format will be
|
||||
generated. Supported versions are 1,2,3 and 16. The default is
|
||||
currently version 3 but that may change in the future to version 16.
|
||||
|
||||
@ -1002,12 +1008,12 @@ supported currently at the toplevel.
|
||||
*/
|
||||
|
||||
property2 = <1234abcd>; /* define a property containing a
|
||||
* numerical 32 bits value (hexadecimal)
|
||||
* numerical 32-bit value (hexadecimal)
|
||||
*/
|
||||
|
||||
property3 = <12345678 12345678 deadbeef>;
|
||||
/* define a property containing 3
|
||||
* numerical 32 bits values (cells) in
|
||||
* numerical 32-bit values (cells) in
|
||||
* hexadecimal
|
||||
*/
|
||||
property4 = [0a 0b 0c 0d de ea ad be ef];
|
||||
@ -1076,7 +1082,7 @@ while all this has been defined and implemented.
|
||||
its usage in early_init_devtree(), and the corresponding various
|
||||
early_init_dt_scan_*() callbacks. That code can be re-used in a
|
||||
GPL bootloader, and as the author of that code, I would be happy
|
||||
to discuss possible free licencing to any vendor who wishes to
|
||||
to discuss possible free licensing to any vendor who wishes to
|
||||
integrate all or part of this code into a non-GPL bootloader.
|
||||
|
||||
|
||||
@ -1085,7 +1091,7 @@ VI - System-on-a-chip devices and nodes
|
||||
=======================================
|
||||
|
||||
Many companies are now starting to develop system-on-a-chip
|
||||
processors, where the processor core (cpu) and many peripheral devices
|
||||
processors, where the processor core (CPU) and many peripheral devices
|
||||
exist on a single piece of silicon. For these SOCs, an SOC node
|
||||
should be used that defines child nodes for the devices that make
|
||||
up the SOC. While platforms are not required to use this model in
|
||||
@ -1117,42 +1123,7 @@ See appendix A for an example partial SOC node definition for the
|
||||
MPC8540.
|
||||
|
||||
|
||||
2) Specifying interrupt information for SOC devices
|
||||
---------------------------------------------------
|
||||
|
||||
Each device that is part of an SOC and which generates interrupts
|
||||
should have the following properties:
|
||||
|
||||
- interrupt-parent : contains the phandle of the interrupt
|
||||
controller which handles interrupts for this device
|
||||
- interrupts : a list of tuples representing the interrupt
|
||||
number and the interrupt sense and level for each interrupt
|
||||
for this device.
|
||||
|
||||
This information is used by the kernel to build the interrupt table
|
||||
for the interrupt controllers in the system.
|
||||
|
||||
Sense and level information should be encoded as follows:
|
||||
|
||||
Devices connected to openPIC-compatible controllers should encode
|
||||
sense and polarity as follows:
|
||||
|
||||
0 = low to high edge sensitive type enabled
|
||||
1 = active low level sensitive type enabled
|
||||
2 = active high level sensitive type enabled
|
||||
3 = high to low edge sensitive type enabled
|
||||
|
||||
ISA PIC interrupt controllers should adhere to the ISA PIC
|
||||
encodings listed below:
|
||||
|
||||
0 = active low level sensitive type enabled
|
||||
1 = active high level sensitive type enabled
|
||||
2 = high to low edge sensitive type enabled
|
||||
3 = low to high edge sensitive type enabled
|
||||
|
||||
|
||||
|
||||
3) Representing devices without a current OF specification
|
||||
2) Representing devices without a current OF specification
|
||||
----------------------------------------------------------
|
||||
|
||||
Currently, there are many devices on SOCs that do not have a standard
|
||||
@ -1209,6 +1180,13 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
- phy-handle : The phandle for the PHY connected to this ethernet
|
||||
controller.
|
||||
|
||||
Recommended properties:
|
||||
|
||||
- linux,network-index : This is the intended "index" of this
|
||||
network device. This is used by the bootwrapper to interpret
|
||||
MAC addresses passed by the firmware when no information other
|
||||
than indices is available to associate an address with a device.
|
||||
|
||||
Example:
|
||||
|
||||
ethernet@24000 {
|
||||
@ -1320,10 +1298,10 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
and additions :
|
||||
|
||||
Required properties :
|
||||
- compatible : Should be "fsl-usb2-mph" for multi port host usb
|
||||
controllers, or "fsl-usb2-dr" for dual role usb controllers
|
||||
- phy_type : For multi port host usb controllers, should be one of
|
||||
"ulpi", or "serial". For dual role usb controllers, should be
|
||||
- compatible : Should be "fsl-usb2-mph" for multi port host USB
|
||||
controllers, or "fsl-usb2-dr" for dual role USB controllers
|
||||
- phy_type : For multi port host USB controllers, should be one of
|
||||
"ulpi", or "serial". For dual role USB controllers, should be
|
||||
one of "ulpi", "utmi", "utmi_wide", or "serial".
|
||||
- reg : Offset and length of the register set for the device
|
||||
- port0 : boolean; if defined, indicates port0 is connected for
|
||||
@ -1347,7 +1325,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
|
||||
Example multi port host usb controller device node :
|
||||
Example multi port host USB controller device node :
|
||||
usb@22000 {
|
||||
device_type = "usb";
|
||||
compatible = "fsl-usb2-mph";
|
||||
@ -1361,7 +1339,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
port1;
|
||||
};
|
||||
|
||||
Example dual role usb controller device node :
|
||||
Example dual role USB controller device node :
|
||||
usb@23000 {
|
||||
device_type = "usb";
|
||||
compatible = "fsl-usb2-dr";
|
||||
@ -1395,7 +1373,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
- channel-fifo-len : An integer representing the number of
|
||||
descriptor pointers each channel fetch fifo can hold.
|
||||
- exec-units-mask : The bitmask representing what execution units
|
||||
(EUs) are available. It's a single 32 bit cell. EU information
|
||||
(EUs) are available. It's a single 32-bit cell. EU information
|
||||
should be encoded following the SEC's Descriptor Header Dword
|
||||
EU_SEL0 field documentation, i.e. as follows:
|
||||
|
||||
@ -1411,7 +1389,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
bits 8 through 31 are reserved for future SEC EUs.
|
||||
|
||||
- descriptor-types-mask : The bitmask representing what descriptors
|
||||
are available. It's a single 32 bit cell. Descriptor type
|
||||
are available. It's a single 32-bit cell. Descriptor type
|
||||
information should be encoded following the SEC's Descriptor
|
||||
Header Dword DESC_TYPE field documentation, i.e. as follows:
|
||||
|
||||
@ -1500,7 +1478,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
Required properties:
|
||||
- device_type : should be "spi".
|
||||
- compatible : should be "fsl_spi".
|
||||
- mode : the spi operation mode, it can be "cpu" or "qe".
|
||||
- mode : the SPI operation mode, it can be "cpu" or "qe".
|
||||
- reg : Offset and length of the register set for the device
|
||||
- interrupts : <a b> where a is the interrupt number and b is a
|
||||
field that represents an encoding of the sense and level
|
||||
@ -1577,6 +1555,12 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
- mac-address : list of bytes representing the ethernet address.
|
||||
- phy-handle : The phandle for the PHY connected to this controller.
|
||||
|
||||
Recommended properties:
|
||||
- linux,network-index : This is the intended "index" of this
|
||||
network device. This is used by the bootwrapper to interpret
|
||||
MAC addresses passed by the firmware when no information other
|
||||
than indices is available to associate an address with a device.
|
||||
|
||||
Example:
|
||||
ucc@2000 {
|
||||
device_type = "network";
|
||||
@ -1720,7 +1704,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
- partitions : Several pairs of 32-bit values where the first value is
|
||||
partition's offset from the start of the device and the second one is
|
||||
partition size in bytes with LSB used to signify a read only
|
||||
partition (so, the parition size should always be an even number).
|
||||
partition (so, the partition size should always be an even number).
|
||||
- partition-names : The list of concatenated zero terminated strings
|
||||
representing the partition names.
|
||||
- probe-type : The type of probe which should be done for the chip
|
||||
@ -1741,6 +1725,92 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
|
||||
More devices will be defined as this spec matures.
|
||||
|
||||
VII - Specifying interrupt information for devices
|
||||
===================================================
|
||||
|
||||
The device tree represents the busses and devices of a hardware
|
||||
system in a form similar to the physical bus topology of the
|
||||
hardware.
|
||||
|
||||
In addition, a logical 'interrupt tree' exists which represents the
|
||||
hierarchy and routing of interrupts in the hardware.
|
||||
|
||||
The interrupt tree model is fully described in the
|
||||
document "Open Firmware Recommended Practice: Interrupt
|
||||
Mapping Version 0.9". The document is available at:
|
||||
<http://playground.sun.com/1275/practice>.
|
||||
|
||||
1) interrupts property
|
||||
----------------------
|
||||
|
||||
Devices that generate interrupts to a single interrupt controller
|
||||
should use the conventional OF representation described in the
|
||||
OF interrupt mapping documentation.
|
||||
|
||||
Each device which generates interrupts must have an 'interrupt'
|
||||
property. The interrupt property value is an arbitrary number of
|
||||
of 'interrupt specifier' values which describe the interrupt or
|
||||
interrupts for the device.
|
||||
|
||||
The encoding of an interrupt specifier is determined by the
|
||||
interrupt domain in which the device is located in the
|
||||
interrupt tree. The root of an interrupt domain specifies in
|
||||
its #interrupt-cells property the number of 32-bit cells
|
||||
required to encode an interrupt specifier. See the OF interrupt
|
||||
mapping documentation for a detailed description of domains.
|
||||
|
||||
For example, the binding for the OpenPIC interrupt controller
|
||||
specifies an #interrupt-cells value of 2 to encode the interrupt
|
||||
number and level/sense information. All interrupt children in an
|
||||
OpenPIC interrupt domain use 2 cells per interrupt in their interrupts
|
||||
property.
|
||||
|
||||
The PCI bus binding specifies a #interrupt-cell value of 1 to encode
|
||||
which interrupt pin (INTA,INTB,INTC,INTD) is used.
|
||||
|
||||
2) interrupt-parent property
|
||||
----------------------------
|
||||
|
||||
The interrupt-parent property is specified to define an explicit
|
||||
link between a device node and its interrupt parent in
|
||||
the interrupt tree. The value of interrupt-parent is the
|
||||
phandle of the parent node.
|
||||
|
||||
If the interrupt-parent property is not defined for a node, it's
|
||||
interrupt parent is assumed to be an ancestor in the node's
|
||||
_device tree_ hierarchy.
|
||||
|
||||
3) OpenPIC Interrupt Controllers
|
||||
--------------------------------
|
||||
|
||||
OpenPIC interrupt controllers require 2 cells to encode
|
||||
interrupt information. The first cell defines the interrupt
|
||||
number. The second cell defines the sense and level
|
||||
information.
|
||||
|
||||
Sense and level information should be encoded as follows:
|
||||
|
||||
0 = low to high edge sensitive type enabled
|
||||
1 = active low level sensitive type enabled
|
||||
2 = active high level sensitive type enabled
|
||||
3 = high to low edge sensitive type enabled
|
||||
|
||||
4) ISA Interrupt Controllers
|
||||
----------------------------
|
||||
|
||||
ISA PIC interrupt controllers require 2 cells to encode
|
||||
interrupt information. The first cell defines the interrupt
|
||||
number. The second cell defines the sense and level
|
||||
information.
|
||||
|
||||
ISA PIC interrupt controllers should adhere to the ISA PIC
|
||||
encodings listed below:
|
||||
|
||||
0 = active low level sensitive type enabled
|
||||
1 = active high level sensitive type enabled
|
||||
2 = high to low edge sensitive type enabled
|
||||
3 = low to high edge sensitive type enabled
|
||||
|
||||
|
||||
Appendix A - Sample SOC node for MPC8540
|
||||
========================================
|
||||
|
@ -1,83 +0,0 @@
|
||||
crypto-API support for z990 Message Security Assist (MSA) instructions
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
AUTHOR: Thomas Spatzier (tspat@de.ibm.com)
|
||||
|
||||
|
||||
1. Introduction crypto-API
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
See Documentation/crypto/api-intro.txt for an introduction/description of the
|
||||
kernel crypto API.
|
||||
According to api-intro.txt support for z990 crypto instructions has been added
|
||||
in the algorithm api layer of the crypto API. Several files containing z990
|
||||
optimized implementations of crypto algorithms are placed in the
|
||||
arch/s390/crypto directory.
|
||||
|
||||
|
||||
2. Probing for availability of MSA
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
It should be possible to use Kernels with the z990 crypto implementations both
|
||||
on machines with MSA available and on those without MSA (pre z990 or z990
|
||||
without MSA). Therefore a simple probing mechanism has been implemented:
|
||||
In the init function of each crypto module the availability of MSA and of the
|
||||
respective crypto algorithm in particular will be tested. If the algorithm is
|
||||
available the module will load and register its algorithm with the crypto API.
|
||||
|
||||
If the respective crypto algorithm is not available, the init function will
|
||||
return -ENOSYS. In that case a fallback to the standard software implementation
|
||||
of the crypto algorithm must be taken ( -> the standard crypto modules are
|
||||
also built when compiling the kernel).
|
||||
|
||||
|
||||
3. Ensuring z990 crypto module preference
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
If z990 crypto instructions are available the optimized modules should be
|
||||
preferred instead of standard modules.
|
||||
|
||||
3.1. compiled-in modules
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
For compiled-in modules it has to be ensured that the z990 modules are linked
|
||||
before the standard crypto modules. Then, on system startup the init functions
|
||||
of z990 crypto modules will be called first and query for availability of z990
|
||||
crypto instructions. If instruction is available, the z990 module will register
|
||||
its crypto algorithm implementation -> the load of the standard module will fail
|
||||
since the algorithm is already registered.
|
||||
If z990 crypto instruction is not available the load of the z990 module will
|
||||
fail -> the standard module will load and register its algorithm.
|
||||
|
||||
3.2. dynamic modules
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
A system administrator has to take care of giving preference to z990 crypto
|
||||
modules. If MSA is available appropriate lines have to be added to
|
||||
/etc/modprobe.conf.
|
||||
|
||||
Example: z990 crypto instruction for SHA1 algorithm is available
|
||||
|
||||
add the following line to /etc/modprobe.conf (assuming the
|
||||
z990 crypto modules for SHA1 is called sha1_z990):
|
||||
|
||||
alias sha1 sha1_z990
|
||||
|
||||
-> when the sha1 algorithm is requested through the crypto API
|
||||
(which has a module autoloader) the z990 module will be loaded.
|
||||
|
||||
TBD: a userspace module probing mechanism
|
||||
something like 'probe sha1 sha1_z990 sha1' in modprobe.conf
|
||||
-> try module sha1_z990, if it fails to load standard module sha1
|
||||
the 'probe' statement is currently not supported in modprobe.conf
|
||||
|
||||
|
||||
4. Currently implemented z990 crypto algorithms
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The following crypto algorithms with z990 MSA support are currently implemented.
|
||||
The name of each algorithm under which it is registered in crypto API and the
|
||||
name of the respective module is given in square brackets.
|
||||
|
||||
- SHA1 Digest Algorithm [sha1 -> sha1_z990]
|
||||
- DES Encrypt/Decrypt Algorithm (64bit key) [des -> des_z990]
|
||||
- Triple DES Encrypt/Decrypt Algorithm (128bit key) [des3_ede128 -> des_z990]
|
||||
- Triple DES Encrypt/Decrypt Algorithm (192bit key) [des3_ede -> des_z990]
|
||||
|
||||
In order to load, for example, the sha1_z990 module when the sha1 algorithm is
|
||||
requested (see 3.2.) add 'alias sha1 sha1_z990' to /etc/modprobe.conf.
|
||||
|
87
Documentation/s390/zfcpdump.txt
Normal file
87
Documentation/s390/zfcpdump.txt
Normal file
@ -0,0 +1,87 @@
|
||||
s390 SCSI dump tool (zfcpdump)
|
||||
|
||||
System z machines (z900 or higher) provide hardware support for creating system
|
||||
dumps on SCSI disks. The dump process is initiated by booting a dump tool, which
|
||||
has to create a dump of the current (probably crashed) Linux image. In order to
|
||||
not overwrite memory of the crashed Linux with data of the dump tool, the
|
||||
hardware saves some memory plus the register sets of the boot cpu before the
|
||||
dump tool is loaded. There exists an SCLP hardware interface to obtain the saved
|
||||
memory afterwards. Currently 32 MB are saved.
|
||||
|
||||
This zfcpdump implementation consists of a Linux dump kernel together with
|
||||
a userspace dump tool, which are loaded together into the saved memory region
|
||||
below 32 MB. zfcpdump is installed on a SCSI disk using zipl (as contained in
|
||||
the s390-tools package) to make the device bootable. The operator of a Linux
|
||||
system can then trigger a SCSI dump by booting the SCSI disk, where zfcpdump
|
||||
resides on.
|
||||
|
||||
The kernel part of zfcpdump is implemented as a debugfs file under "zcore/mem",
|
||||
which exports memory and registers of the crashed Linux in an s390
|
||||
standalone dump format. It can be used in the same way as e.g. /dev/mem. The
|
||||
dump format defines a 4K header followed by plain uncompressed memory. The
|
||||
register sets are stored in the prefix pages of the respective cpus. To build a
|
||||
dump enabled kernel with the zcore driver, the kernel config option
|
||||
CONFIG_ZFCPDUMP has to be set. When reading from "zcore/mem", the part of
|
||||
memory, which has been saved by hardware is read by the driver via the SCLP
|
||||
hardware interface. The second part is just copied from the non overwritten real
|
||||
memory.
|
||||
|
||||
The userspace application of zfcpdump can reside e.g. in an intitramfs or an
|
||||
initrd. It reads from zcore/mem and writes the system dump to a file on a
|
||||
SCSI disk.
|
||||
|
||||
To build a zfcpdump kernel use the following settings in your kernel
|
||||
configuration:
|
||||
* CONFIG_ZFCPDUMP=y
|
||||
* Enable ZFCP driver
|
||||
* Enable SCSI driver
|
||||
* Enable ext2 and ext3 filesystems
|
||||
* Disable as many features as possible to keep the kernel small.
|
||||
E.g. network support is not needed at all.
|
||||
|
||||
To use the zfcpdump userspace application in an initramfs you have to do the
|
||||
following:
|
||||
|
||||
* Copy the zfcpdump executable somewhere into your Linux tree.
|
||||
E.g. to "arch/s390/boot/zfcpdump. If you do not want to include
|
||||
shared libraries, compile the tool with the "-static" gcc option.
|
||||
* If you want to include e2fsck, add it to your source tree, too. The zfcpdump
|
||||
application attempts to start /sbin/e2fsck from the ramdisk.
|
||||
* Use an initramfs config file like the following:
|
||||
|
||||
dir /dev 755 0 0
|
||||
nod /dev/console 644 0 0 c 5 1
|
||||
nod /dev/null 644 0 0 c 1 3
|
||||
nod /dev/sda1 644 0 0 b 8 1
|
||||
nod /dev/sda2 644 0 0 b 8 2
|
||||
nod /dev/sda3 644 0 0 b 8 3
|
||||
nod /dev/sda4 644 0 0 b 8 4
|
||||
nod /dev/sda5 644 0 0 b 8 5
|
||||
nod /dev/sda6 644 0 0 b 8 6
|
||||
nod /dev/sda7 644 0 0 b 8 7
|
||||
nod /dev/sda8 644 0 0 b 8 8
|
||||
nod /dev/sda9 644 0 0 b 8 9
|
||||
nod /dev/sda10 644 0 0 b 8 10
|
||||
nod /dev/sda11 644 0 0 b 8 11
|
||||
nod /dev/sda12 644 0 0 b 8 12
|
||||
nod /dev/sda13 644 0 0 b 8 13
|
||||
nod /dev/sda14 644 0 0 b 8 14
|
||||
nod /dev/sda15 644 0 0 b 8 15
|
||||
file /init arch/s390/boot/zfcpdump 755 0 0
|
||||
file /sbin/e2fsck arch/s390/boot/e2fsck 755 0 0
|
||||
dir /proc 755 0 0
|
||||
dir /sys 755 0 0
|
||||
dir /mnt 755 0 0
|
||||
dir /sbin 755 0 0
|
||||
|
||||
* Issue "make image" to build the zfcpdump image with initramfs.
|
||||
|
||||
In a Linux distribution the zfcpdump enabled kernel image must be copied to
|
||||
/usr/share/zfcpdump/zfcpdump.image, where the s390 zipl tool is looking for the
|
||||
dump kernel when preparing a SCSI dump disk.
|
||||
|
||||
If you use a ramdisk copy it to "/usr/share/zfcpdump/zfcpdump.rd".
|
||||
|
||||
For more information on how to use zfcpdump refer to the s390 'Using the Dump
|
||||
Tools book', which is available from
|
||||
http://www.ibm.com/developerworks/linux/linux390.
|
@ -17,7 +17,7 @@ of the board-specific code (with the exception of stboards) ended up
|
||||
in arch/sh/kernel/ directly, with board-specific headers ending up in
|
||||
include/asm-sh/. For the new kernel, things are broken out by board type,
|
||||
companion chip type, and CPU type. Looking at a tree view of this directory
|
||||
heirarchy looks like the following:
|
||||
hierarchy looks like the following:
|
||||
|
||||
Board-specific code:
|
||||
|
||||
@ -108,7 +108,7 @@ overloading), and you can feel free to name the directory after the family
|
||||
member itself.
|
||||
|
||||
There are a few things that each board is required to have, both in the
|
||||
arch/sh/boards and the include/asm-sh/ heirarchy. In order to better
|
||||
arch/sh/boards and the include/asm-sh/ hierarchy. In order to better
|
||||
explain this, we use some examples for adding an imaginary board. For
|
||||
setup code, we're required at the very least to provide definitions for
|
||||
get_system_type() and platform_setup(). For our imaginary board, this
|
||||
|
117
Documentation/sony-laptop.txt
Normal file
117
Documentation/sony-laptop.txt
Normal file
@ -0,0 +1,117 @@
|
||||
Sony Notebook Control Driver (SNC) Readme
|
||||
-----------------------------------------
|
||||
Copyright (C) 2004- 2005 Stelian Pop <stelian@popies.net>
|
||||
Copyright (C) 2007 Mattia Dongili <malattia@linux.it>
|
||||
|
||||
This mini-driver drives the SNC and SPIC device present in the ACPI BIOS of the
|
||||
Sony Vaio laptops. This driver mixes both devices functions under the same
|
||||
(hopefully consistent) interface. This also means that the sonypi driver is
|
||||
obsoleted by sony-laptop now.
|
||||
|
||||
Fn keys (hotkeys):
|
||||
------------------
|
||||
Some models report hotkeys through the SNC or SPIC devices, such events are
|
||||
reported both through the ACPI subsystem as acpi events and through the INPUT
|
||||
subsystem. See the logs of acpid or /proc/acpi/event and
|
||||
/proc/bus/input/devices to find out what those events are and which input
|
||||
devices are created by the driver.
|
||||
|
||||
Backlight control:
|
||||
------------------
|
||||
If your laptop model supports it, you will find sysfs files in the
|
||||
/sys/class/backlight/sony/
|
||||
directory. You will be able to query and set the current screen
|
||||
brightness:
|
||||
brightness get/set screen brightness (an iteger
|
||||
between 0 and 7)
|
||||
actual_brightness reading from this file will query the HW
|
||||
to get real brightness value
|
||||
max_brightness the maximum brightness value
|
||||
|
||||
|
||||
Platform specific:
|
||||
------------------
|
||||
Loading the sony-laptop module will create a
|
||||
/sys/devices/platform/sony-laptop/
|
||||
directory populated with some files.
|
||||
|
||||
You then read/write integer values from/to those files by using
|
||||
standard UNIX tools.
|
||||
|
||||
The files are:
|
||||
brightness_default screen brightness which will be set
|
||||
when the laptop will be rebooted
|
||||
cdpower power on/off the internal CD drive
|
||||
audiopower power on/off the internal sound card
|
||||
lanpower power on/off the internal ethernet card
|
||||
(only in debug mode)
|
||||
bluetoothpower power on/off the internal bluetooth device
|
||||
fanspeed get/set the fan speed
|
||||
|
||||
Note that some files may be missing if they are not supported
|
||||
by your particular laptop model.
|
||||
|
||||
Example usage:
|
||||
# echo "1" > /sys/devices/platform/sony-laptop/brightness_default
|
||||
sets the lowest screen brightness for the next and later reboots,
|
||||
# echo "8" > /sys/devices/platform/sony-laptop/brightness_default
|
||||
sets the highest screen brightness for the next and later reboots,
|
||||
# cat /sys/devices/platform/sony-laptop/brightness_default
|
||||
retrieves the value.
|
||||
|
||||
# echo "0" > /sys/devices/platform/sony-laptop/audiopower
|
||||
powers off the sound card,
|
||||
# echo "1" > /sys/devices/platform/sony-laptop/audiopower
|
||||
powers on the sound card.
|
||||
|
||||
Development:
|
||||
------------
|
||||
|
||||
If you want to help with the development of this driver (and
|
||||
you are not afraid of any side effects doing strange things with
|
||||
your ACPI BIOS could have on your laptop), load the driver and
|
||||
pass the option 'debug=1'.
|
||||
|
||||
REPEAT: DON'T DO THIS IF YOU DON'T LIKE RISKY BUSINESS.
|
||||
|
||||
In your kernel logs you will find the list of all ACPI methods
|
||||
the SNC device has on your laptop. You can see the GCDP/GCDP methods
|
||||
used to pwer on/off the CD drive, but there are others.
|
||||
|
||||
I HAVE NO IDEA WHAT THOSE METHODS DO.
|
||||
|
||||
The sony-laptop driver creates, for some of those methods (the most
|
||||
current ones found on several Vaio models), an entry under
|
||||
/sys/devices/platform/sony-laptop, just like the 'cdpower' one.
|
||||
You can create other entries corresponding to your own laptop methods by
|
||||
further editing the source (see the 'sony_nc_values' table, and add a new
|
||||
entry to this table with your get/set method names using the
|
||||
SNC_HANDLE_NAMES macro).
|
||||
|
||||
Your mission, should you accept it, is to try finding out what
|
||||
those entries are for, by reading/writing random values from/to those
|
||||
files and find out what is the impact on your laptop.
|
||||
|
||||
Should you find anything interesting, please report it back to me,
|
||||
I will not disavow all knowledge of your actions :)
|
||||
|
||||
See also http://www.linux.it/~malattia/wiki/index.php/Sony_drivers for other
|
||||
useful info.
|
||||
|
||||
Bugs/Limitations:
|
||||
-----------------
|
||||
|
||||
* This driver is not based on official documentation from Sony
|
||||
(because there is none), so there is no guarantee this driver
|
||||
will work at all, or do the right thing. Although this hasn't
|
||||
happened to me, this driver could do very bad things to your
|
||||
laptop, including permanent damage.
|
||||
|
||||
* The sony-laptop and sonypi drivers do not interact at all. In the
|
||||
future, sonypi could use sony-laptop to do (part of) its business.
|
||||
|
||||
* spicctrl, which is the userspace tool used to communicate with the
|
||||
sonypi driver (through /dev/sonypi) does not try to use the
|
||||
sony-laptop driver. In the future, spicctrl could try sonypi first,
|
||||
and if it isn't present, try sony-laptop instead.
|
||||
|
@ -370,7 +370,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
mpu_port - 0x300,0x310,0x320,0x330 = legacy port,
|
||||
1 = integrated PCI port,
|
||||
0 = disable (default)
|
||||
fm_port - 0x388 (default), 0 = disable (default)
|
||||
fm_port - 0x388 = legacy port,
|
||||
1 = integrated PCI port (default),
|
||||
0 = disable
|
||||
soft_ac3 - Software-conversion of raw SPDIF packets (model 033 only)
|
||||
(default = 1)
|
||||
joystick_port - Joystick port address (0 = disable, 1 = auto-detect)
|
||||
@ -864,6 +866,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
basic 3-jack (default)
|
||||
hp HP nx6320
|
||||
thinkpad Lenovo Thinkpad T60/X60/Z60
|
||||
toshiba Toshiba U205
|
||||
|
||||
AD1986A
|
||||
6stack 6-jack, separate surrounds (default)
|
||||
@ -895,10 +898,17 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
can be adjusted. Appearing only when compiled with
|
||||
$CONFIG_SND_DEBUG=y
|
||||
|
||||
STAC9200/9205/9220/9221/9254
|
||||
STAC9200/9205/9254
|
||||
ref Reference board
|
||||
|
||||
STAC9220/9221
|
||||
ref Reference board
|
||||
3stack D945 3stack
|
||||
5stack D945 5stack + SPDIF
|
||||
macmini Intel Mac Mini
|
||||
macbook Intel Mac Book
|
||||
macbook-pro-v1 Intel Mac Book Pro 1st generation
|
||||
macbook-pro Intel Mac Book Pro 2nd generation
|
||||
|
||||
STAC9202/9250/9251
|
||||
ref Reference board, base config
|
||||
|
@ -45,11 +45,15 @@ special.
|
||||
Getting sparse
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
With git, you can just get it from
|
||||
You can get latest released versions from the Sparse homepage at
|
||||
http://www.kernel.org/pub/linux/kernel/people/josh/sparse/
|
||||
|
||||
rsync://rsync.kernel.org/pub/scm/devel/sparse/sparse.git
|
||||
Alternatively, you can get snapshots of the latest development version
|
||||
of sparse using git to clone..
|
||||
|
||||
and DaveJ has tar-balls at
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/josh/sparse.git
|
||||
|
||||
DaveJ has hourly generated tarballs of the git tree available at..
|
||||
|
||||
http://www.codemonkey.org.uk/projects/git-snapshots/sparse/
|
||||
|
||||
|
@ -93,6 +93,8 @@ On all - write a character to /proc/sysrq-trigger. e.g.:
|
||||
|
||||
'p' - Will dump the current registers and flags to your console.
|
||||
|
||||
'q' - Will dump a list of all running timers.
|
||||
|
||||
'r' - Turns off keyboard raw mode and sets it to XLATE.
|
||||
|
||||
's' - Will attempt to sync all mounted filesystems.
|
||||
|
981
Documentation/thinkpad-acpi.txt
Normal file
981
Documentation/thinkpad-acpi.txt
Normal file
@ -0,0 +1,981 @@
|
||||
ThinkPad ACPI Extras Driver
|
||||
|
||||
Version 0.14
|
||||
April 21st, 2007
|
||||
|
||||
Borislav Deianov <borislav@users.sf.net>
|
||||
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||
http://ibm-acpi.sf.net/
|
||||
|
||||
|
||||
This is a Linux driver for the IBM and Lenovo ThinkPad laptops. It
|
||||
supports various features of these laptops which are accessible
|
||||
through the ACPI and ACPI EC framework, but not otherwise fully
|
||||
supported by the generic Linux ACPI drivers.
|
||||
|
||||
This driver used to be named ibm-acpi until kernel 2.6.21 and release
|
||||
0.13-20070314. It used to be in the drivers/acpi tree, but it was
|
||||
moved to the drivers/misc tree and renamed to thinkpad-acpi for kernel
|
||||
2.6.22, and release 0.14.
|
||||
|
||||
|
||||
Status
|
||||
------
|
||||
|
||||
The features currently supported are the following (see below for
|
||||
detailed description):
|
||||
|
||||
- Fn key combinations
|
||||
- Bluetooth enable and disable
|
||||
- video output switching, expansion control
|
||||
- ThinkLight on and off
|
||||
- limited docking and undocking
|
||||
- UltraBay eject
|
||||
- CMOS control
|
||||
- LED control
|
||||
- ACPI sounds
|
||||
- temperature sensors
|
||||
- Experimental: embedded controller register dump
|
||||
- LCD brightness control
|
||||
- Volume control
|
||||
- Fan control and monitoring: fan speed, fan enable/disable
|
||||
- Experimental: WAN enable and disable
|
||||
|
||||
A compatibility table by model and feature is maintained on the web
|
||||
site, http://ibm-acpi.sf.net/. I appreciate any success or failure
|
||||
reports, especially if they add to or correct the compatibility table.
|
||||
Please include the following information in your report:
|
||||
|
||||
- ThinkPad model name
|
||||
- a copy of your DSDT, from /proc/acpi/dsdt
|
||||
- a copy of the output of dmidecode, with serial numbers
|
||||
and UUIDs masked off
|
||||
- which driver features work and which don't
|
||||
- the observed behavior of non-working features
|
||||
|
||||
Any other comments or patches are also more than welcome.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
If you are compiling this driver as included in the Linux kernel
|
||||
sources, simply enable the CONFIG_THINKPAD_ACPI option, and optionally
|
||||
enable the CONFIG_THINKPAD_ACPI_BAY option if you want the
|
||||
thinkpad-specific bay functionality.
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
The driver exports two different interfaces to userspace, which can be
|
||||
used to access the features it provides. One is a legacy procfs-based
|
||||
interface, which will be removed at some time in the distant future.
|
||||
The other is a new sysfs-based interface which is not complete yet.
|
||||
|
||||
The procfs interface creates the /proc/acpi/ibm directory. There is a
|
||||
file under that directory for each feature it supports. The procfs
|
||||
interface is mostly frozen, and will change very little if at all: it
|
||||
will not be extended to add any new functionality in the driver, instead
|
||||
all new functionality will be implemented on the sysfs interface.
|
||||
|
||||
The sysfs interface tries to blend in the generic Linux sysfs subsystems
|
||||
and classes as much as possible. Since some of these subsystems are not
|
||||
yet ready or stabilized, it is expected that this interface will change,
|
||||
and any and all userspace programs must deal with it.
|
||||
|
||||
|
||||
Notes about the sysfs interface:
|
||||
|
||||
Unlike what was done with the procfs interface, correctness when talking
|
||||
to the sysfs interfaces will be enforced, as will correctness in the
|
||||
thinkpad-acpi's implementation of sysfs interfaces.
|
||||
|
||||
Also, any bugs in the thinkpad-acpi sysfs driver code or in the
|
||||
thinkpad-acpi's implementation of the sysfs interfaces will be fixed for
|
||||
maximum correctness, even if that means changing an interface in
|
||||
non-compatible ways. As these interfaces mature both in the kernel and
|
||||
in thinkpad-acpi, such changes should become quite rare.
|
||||
|
||||
Applications interfacing to the thinkpad-acpi sysfs interfaces must
|
||||
follow all sysfs guidelines and correctly process all errors (the sysfs
|
||||
interface makes extensive use of errors). File descriptors and open /
|
||||
close operations to the sysfs inodes must also be properly implemented.
|
||||
|
||||
The version of thinkpad-acpi's sysfs interface is exported by the driver
|
||||
as a driver attribute (see below).
|
||||
|
||||
Sysfs driver attributes are on the driver's sysfs attribute space,
|
||||
for 2.6.20 this is /sys/bus/platform/drivers/thinkpad-acpi/.
|
||||
|
||||
Sysfs device attributes are on the driver's sysfs attribute space,
|
||||
for 2.6.20 this is /sys/devices/platform/thinkpad-acpi/.
|
||||
|
||||
Driver version
|
||||
--------------
|
||||
|
||||
procfs: /proc/acpi/ibm/driver
|
||||
sysfs driver attribute: version
|
||||
|
||||
The driver name and version. No commands can be written to this file.
|
||||
|
||||
Sysfs interface version
|
||||
-----------------------
|
||||
|
||||
sysfs driver attribute: interface_version
|
||||
|
||||
Version of the thinkpad-acpi sysfs interface, as an unsigned long
|
||||
(output in hex format: 0xAAAABBCC), where:
|
||||
AAAA - major revision
|
||||
BB - minor revision
|
||||
CC - bugfix revision
|
||||
|
||||
The sysfs interface version changelog for the driver can be found at the
|
||||
end of this document. Changes to the sysfs interface done by the kernel
|
||||
subsystems are not documented here, nor are they tracked by this
|
||||
attribute.
|
||||
|
||||
Hot keys
|
||||
--------
|
||||
|
||||
procfs: /proc/acpi/ibm/hotkey
|
||||
sysfs device attribute: hotkey/*
|
||||
|
||||
Without this driver, only the Fn-F4 key (sleep button) generates an
|
||||
ACPI event. With the driver loaded, the hotkey feature enabled and the
|
||||
mask set (see below), the various hot keys generate ACPI events in the
|
||||
following format:
|
||||
|
||||
ibm/hotkey HKEY 00000080 0000xxxx
|
||||
|
||||
The last four digits vary depending on the key combination pressed.
|
||||
All labeled Fn-Fx key combinations generate distinct events. In
|
||||
addition, the lid microswitch and some docking station buttons may
|
||||
also generate such events.
|
||||
|
||||
The bit mask allows some control over which hot keys generate ACPI
|
||||
events. Not all bits in the mask can be modified. Not all bits that
|
||||
can be modified do anything. Not all hot keys can be individually
|
||||
controlled by the mask. Most recent ThinkPad models honor the
|
||||
following bits (assuming the hot keys feature has been enabled):
|
||||
|
||||
key bit behavior when set behavior when unset
|
||||
|
||||
Fn-F3 always generates ACPI event
|
||||
Fn-F4 always generates ACPI event
|
||||
Fn-F5 0010 generate ACPI event enable/disable Bluetooth
|
||||
Fn-F7 0040 generate ACPI event switch LCD and external display
|
||||
Fn-F8 0080 generate ACPI event expand screen or none
|
||||
Fn-F9 0100 generate ACPI event none
|
||||
Fn-F12 always generates ACPI event
|
||||
|
||||
Some models do not support all of the above. For example, the T30 does
|
||||
not support Fn-F5 and Fn-F9. Other models do not support the mask at
|
||||
all. On those models, hot keys cannot be controlled individually.
|
||||
|
||||
Note that enabling ACPI events for some keys prevents their default
|
||||
behavior. For example, if events for Fn-F5 are enabled, that key will
|
||||
no longer enable/disable Bluetooth by itself. This can still be done
|
||||
from an acpid handler for the ibm/hotkey event.
|
||||
|
||||
Note also that not all Fn key combinations are supported through
|
||||
ACPI. For example, on the X40, the brightness, volume and "Access IBM"
|
||||
buttons do not generate ACPI events even with this driver. They *can*
|
||||
be used through the "ThinkPad Buttons" utility, see
|
||||
http://www.nongnu.org/tpb/
|
||||
|
||||
procfs notes:
|
||||
|
||||
The following commands can be written to the /proc/acpi/ibm/hotkey file:
|
||||
|
||||
echo enable > /proc/acpi/ibm/hotkey -- enable the hot keys feature
|
||||
echo disable > /proc/acpi/ibm/hotkey -- disable the hot keys feature
|
||||
echo 0xffff > /proc/acpi/ibm/hotkey -- enable all possible hot keys
|
||||
echo 0x0000 > /proc/acpi/ibm/hotkey -- disable all possible hot keys
|
||||
... any other 4-hex-digit mask ...
|
||||
echo reset > /proc/acpi/ibm/hotkey -- restore the original mask
|
||||
|
||||
sysfs notes:
|
||||
|
||||
The hot keys attributes are in a hotkey/ subdirectory off the
|
||||
thinkpad device.
|
||||
|
||||
bios_enabled:
|
||||
Returns the status of the hot keys feature when
|
||||
thinkpad-acpi was loaded. Upon module unload, the hot
|
||||
key feature status will be restored to this value.
|
||||
|
||||
0: hot keys were disabled
|
||||
1: hot keys were enabled
|
||||
|
||||
bios_mask:
|
||||
Returns the hot keys mask when thinkpad-acpi was loaded.
|
||||
Upon module unload, the hot keys mask will be restored
|
||||
to this value.
|
||||
|
||||
enable:
|
||||
Enables/disables the hot keys feature, and reports
|
||||
current status of the hot keys feature.
|
||||
|
||||
0: disables the hot keys feature / feature disabled
|
||||
1: enables the hot keys feature / feature enabled
|
||||
|
||||
mask:
|
||||
bit mask to enable ACPI event generation for each hot
|
||||
key (see above). Returns the current status of the hot
|
||||
keys mask, and allows one to modify it.
|
||||
|
||||
|
||||
Bluetooth
|
||||
---------
|
||||
|
||||
procfs: /proc/acpi/ibm/bluetooth
|
||||
sysfs device attribute: bluetooth/enable
|
||||
|
||||
This feature shows the presence and current state of a ThinkPad
|
||||
Bluetooth device in the internal ThinkPad CDC slot.
|
||||
|
||||
Procfs notes:
|
||||
|
||||
If Bluetooth is installed, the following commands can be used:
|
||||
|
||||
echo enable > /proc/acpi/ibm/bluetooth
|
||||
echo disable > /proc/acpi/ibm/bluetooth
|
||||
|
||||
Sysfs notes:
|
||||
|
||||
If the Bluetooth CDC card is installed, it can be enabled /
|
||||
disabled through the "bluetooth/enable" thinkpad-acpi device
|
||||
attribute, and its current status can also be queried.
|
||||
|
||||
enable:
|
||||
0: disables Bluetooth / Bluetooth is disabled
|
||||
1: enables Bluetooth / Bluetooth is enabled.
|
||||
|
||||
Note: this interface will be probably be superseeded by the
|
||||
generic rfkill class.
|
||||
|
||||
Video output control -- /proc/acpi/ibm/video
|
||||
--------------------------------------------
|
||||
|
||||
This feature allows control over the devices used for video output -
|
||||
LCD, CRT or DVI (if available). The following commands are available:
|
||||
|
||||
echo lcd_enable > /proc/acpi/ibm/video
|
||||
echo lcd_disable > /proc/acpi/ibm/video
|
||||
echo crt_enable > /proc/acpi/ibm/video
|
||||
echo crt_disable > /proc/acpi/ibm/video
|
||||
echo dvi_enable > /proc/acpi/ibm/video
|
||||
echo dvi_disable > /proc/acpi/ibm/video
|
||||
echo auto_enable > /proc/acpi/ibm/video
|
||||
echo auto_disable > /proc/acpi/ibm/video
|
||||
echo expand_toggle > /proc/acpi/ibm/video
|
||||
echo video_switch > /proc/acpi/ibm/video
|
||||
|
||||
Each video output device can be enabled or disabled individually.
|
||||
Reading /proc/acpi/ibm/video shows the status of each device.
|
||||
|
||||
Automatic video switching can be enabled or disabled. When automatic
|
||||
video switching is enabled, certain events (e.g. opening the lid,
|
||||
docking or undocking) cause the video output device to change
|
||||
automatically. While this can be useful, it also causes flickering
|
||||
and, on the X40, video corruption. By disabling automatic switching,
|
||||
the flickering or video corruption can be avoided.
|
||||
|
||||
The video_switch command cycles through the available video outputs
|
||||
(it simulates the behavior of Fn-F7).
|
||||
|
||||
Video expansion can be toggled through this feature. This controls
|
||||
whether the display is expanded to fill the entire LCD screen when a
|
||||
mode with less than full resolution is used. Note that the current
|
||||
video expansion status cannot be determined through this feature.
|
||||
|
||||
Note that on many models (particularly those using Radeon graphics
|
||||
chips) the X driver configures the video card in a way which prevents
|
||||
Fn-F7 from working. This also disables the video output switching
|
||||
features of this driver, as it uses the same ACPI methods as
|
||||
Fn-F7. Video switching on the console should still work.
|
||||
|
||||
UPDATE: There's now a patch for the X.org Radeon driver which
|
||||
addresses this issue. Some people are reporting success with the patch
|
||||
while others are still having problems. For more information:
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=2000
|
||||
|
||||
ThinkLight control -- /proc/acpi/ibm/light
|
||||
------------------------------------------
|
||||
|
||||
The current status of the ThinkLight can be found in this file. A few
|
||||
models which do not make the status available will show it as
|
||||
"unknown". The available commands are:
|
||||
|
||||
echo on > /proc/acpi/ibm/light
|
||||
echo off > /proc/acpi/ibm/light
|
||||
|
||||
Docking / undocking -- /proc/acpi/ibm/dock
|
||||
------------------------------------------
|
||||
|
||||
Docking and undocking (e.g. with the X4 UltraBase) requires some
|
||||
actions to be taken by the operating system to safely make or break
|
||||
the electrical connections with the dock.
|
||||
|
||||
The docking feature of this driver generates the following ACPI events:
|
||||
|
||||
ibm/dock GDCK 00000003 00000001 -- eject request
|
||||
ibm/dock GDCK 00000003 00000002 -- undocked
|
||||
ibm/dock GDCK 00000000 00000003 -- docked
|
||||
|
||||
NOTE: These events will only be generated if the laptop was docked
|
||||
when originally booted. This is due to the current lack of support for
|
||||
hot plugging of devices in the Linux ACPI framework. If the laptop was
|
||||
booted while not in the dock, the following message is shown in the
|
||||
logs:
|
||||
|
||||
Mar 17 01:42:34 aero kernel: thinkpad_acpi: dock device not present
|
||||
|
||||
In this case, no dock-related events are generated but the dock and
|
||||
undock commands described below still work. They can be executed
|
||||
manually or triggered by Fn key combinations (see the example acpid
|
||||
configuration files included in the driver tarball package available
|
||||
on the web site).
|
||||
|
||||
When the eject request button on the dock is pressed, the first event
|
||||
above is generated. The handler for this event should issue the
|
||||
following command:
|
||||
|
||||
echo undock > /proc/acpi/ibm/dock
|
||||
|
||||
After the LED on the dock goes off, it is safe to eject the laptop.
|
||||
Note: if you pressed this key by mistake, go ahead and eject the
|
||||
laptop, then dock it back in. Otherwise, the dock may not function as
|
||||
expected.
|
||||
|
||||
When the laptop is docked, the third event above is generated. The
|
||||
handler for this event should issue the following command to fully
|
||||
enable the dock:
|
||||
|
||||
echo dock > /proc/acpi/ibm/dock
|
||||
|
||||
The contents of the /proc/acpi/ibm/dock file shows the current status
|
||||
of the dock, as provided by the ACPI framework.
|
||||
|
||||
The docking support in this driver does not take care of enabling or
|
||||
disabling any other devices you may have attached to the dock. For
|
||||
example, a CD drive plugged into the UltraBase needs to be disabled or
|
||||
enabled separately. See the provided example acpid configuration files
|
||||
for how this can be accomplished.
|
||||
|
||||
There is no support yet for PCI devices that may be attached to a
|
||||
docking station, e.g. in the ThinkPad Dock II. The driver currently
|
||||
does not recognize, enable or disable such devices. This means that
|
||||
the only docking stations currently supported are the X-series
|
||||
UltraBase docks and "dumb" port replicators like the Mini Dock (the
|
||||
latter don't need any ACPI support, actually).
|
||||
|
||||
UltraBay eject -- /proc/acpi/ibm/bay
|
||||
------------------------------------
|
||||
|
||||
Inserting or ejecting an UltraBay device requires some actions to be
|
||||
taken by the operating system to safely make or break the electrical
|
||||
connections with the device.
|
||||
|
||||
This feature generates the following ACPI events:
|
||||
|
||||
ibm/bay MSTR 00000003 00000000 -- eject request
|
||||
ibm/bay MSTR 00000001 00000000 -- eject lever inserted
|
||||
|
||||
NOTE: These events will only be generated if the UltraBay was present
|
||||
when the laptop was originally booted (on the X series, the UltraBay
|
||||
is in the dock, so it may not be present if the laptop was undocked).
|
||||
This is due to the current lack of support for hot plugging of devices
|
||||
in the Linux ACPI framework. If the laptop was booted without the
|
||||
UltraBay, the following message is shown in the logs:
|
||||
|
||||
Mar 17 01:42:34 aero kernel: thinkpad_acpi: bay device not present
|
||||
|
||||
In this case, no bay-related events are generated but the eject
|
||||
command described below still works. It can be executed manually or
|
||||
triggered by a hot key combination.
|
||||
|
||||
Sliding the eject lever generates the first event shown above. The
|
||||
handler for this event should take whatever actions are necessary to
|
||||
shut down the device in the UltraBay (e.g. call idectl), then issue
|
||||
the following command:
|
||||
|
||||
echo eject > /proc/acpi/ibm/bay
|
||||
|
||||
After the LED on the UltraBay goes off, it is safe to pull out the
|
||||
device.
|
||||
|
||||
When the eject lever is inserted, the second event above is
|
||||
generated. The handler for this event should take whatever actions are
|
||||
necessary to enable the UltraBay device (e.g. call idectl).
|
||||
|
||||
The contents of the /proc/acpi/ibm/bay file shows the current status
|
||||
of the UltraBay, as provided by the ACPI framework.
|
||||
|
||||
EXPERIMENTAL warm eject support on the 600e/x, A22p and A3x (To use
|
||||
this feature, you need to supply the experimental=1 parameter when
|
||||
loading the module):
|
||||
|
||||
These models do not have a button near the UltraBay device to request
|
||||
a hot eject but rather require the laptop to be put to sleep
|
||||
(suspend-to-ram) before the bay device is ejected or inserted).
|
||||
The sequence of steps to eject the device is as follows:
|
||||
|
||||
echo eject > /proc/acpi/ibm/bay
|
||||
put the ThinkPad to sleep
|
||||
remove the drive
|
||||
resume from sleep
|
||||
cat /proc/acpi/ibm/bay should show that the drive was removed
|
||||
|
||||
On the A3x, both the UltraBay 2000 and UltraBay Plus devices are
|
||||
supported. Use "eject2" instead of "eject" for the second bay.
|
||||
|
||||
Note: the UltraBay eject support on the 600e/x, A22p and A3x is
|
||||
EXPERIMENTAL and may not work as expected. USE WITH CAUTION!
|
||||
|
||||
CMOS control
|
||||
------------
|
||||
|
||||
procfs: /proc/acpi/ibm/cmos
|
||||
sysfs device attribute: cmos_command
|
||||
|
||||
This feature is used internally by the ACPI firmware to control the
|
||||
ThinkLight on most newer ThinkPad models. It may also control LCD
|
||||
brightness, sounds volume and more, but only on some models.
|
||||
|
||||
The range of valid cmos command numbers is 0 to 21, but not all have an
|
||||
effect and the behavior varies from model to model. Here is the behavior
|
||||
on the X40 (tpb is the ThinkPad Buttons utility):
|
||||
|
||||
0 - no effect but tpb reports "Volume down"
|
||||
1 - no effect but tpb reports "Volume up"
|
||||
2 - no effect but tpb reports "Mute on"
|
||||
3 - simulate pressing the "Access IBM" button
|
||||
4 - LCD brightness up
|
||||
5 - LCD brightness down
|
||||
11 - toggle screen expansion
|
||||
12 - ThinkLight on
|
||||
13 - ThinkLight off
|
||||
14 - no effect but tpb reports ThinkLight status change
|
||||
|
||||
The cmos command interface is prone to firmware split-brain problems, as
|
||||
in newer ThinkPads it is just a compatibility layer.
|
||||
|
||||
LED control -- /proc/acpi/ibm/led
|
||||
---------------------------------
|
||||
|
||||
Some of the LED indicators can be controlled through this feature. The
|
||||
available commands are:
|
||||
|
||||
echo '<led number> on' >/proc/acpi/ibm/led
|
||||
echo '<led number> off' >/proc/acpi/ibm/led
|
||||
echo '<led number> blink' >/proc/acpi/ibm/led
|
||||
|
||||
The <led number> range is 0 to 7. The set of LEDs that can be
|
||||
controlled varies from model to model. Here is the mapping on the X40:
|
||||
|
||||
0 - power
|
||||
1 - battery (orange)
|
||||
2 - battery (green)
|
||||
3 - UltraBase
|
||||
4 - UltraBay
|
||||
7 - standby
|
||||
|
||||
All of the above can be turned on and off and can be made to blink.
|
||||
|
||||
ACPI sounds -- /proc/acpi/ibm/beep
|
||||
----------------------------------
|
||||
|
||||
The BEEP method is used internally by the ACPI firmware to provide
|
||||
audible alerts in various situations. This feature allows the same
|
||||
sounds to be triggered manually.
|
||||
|
||||
The commands are non-negative integer numbers:
|
||||
|
||||
echo <number> >/proc/acpi/ibm/beep
|
||||
|
||||
The valid <number> range is 0 to 17. Not all numbers trigger sounds
|
||||
and the sounds vary from model to model. Here is the behavior on the
|
||||
X40:
|
||||
|
||||
0 - stop a sound in progress (but use 17 to stop 16)
|
||||
2 - two beeps, pause, third beep ("low battery")
|
||||
3 - single beep
|
||||
4 - high, followed by low-pitched beep ("unable")
|
||||
5 - single beep
|
||||
6 - very high, followed by high-pitched beep ("AC/DC")
|
||||
7 - high-pitched beep
|
||||
9 - three short beeps
|
||||
10 - very long beep
|
||||
12 - low-pitched beep
|
||||
15 - three high-pitched beeps repeating constantly, stop with 0
|
||||
16 - one medium-pitched beep repeating constantly, stop with 17
|
||||
17 - stop 16
|
||||
|
||||
Temperature sensors
|
||||
-------------------
|
||||
|
||||
procfs: /proc/acpi/ibm/thermal
|
||||
sysfs device attributes: (hwmon) temp*_input
|
||||
|
||||
Most ThinkPads include six or more separate temperature sensors but
|
||||
only expose the CPU temperature through the standard ACPI methods.
|
||||
This feature shows readings from up to eight different sensors on older
|
||||
ThinkPads, and it has experimental support for up to sixteen different
|
||||
sensors on newer ThinkPads.
|
||||
|
||||
EXPERIMENTAL: The 16-sensors feature is marked EXPERIMENTAL because the
|
||||
implementation directly accesses hardware registers and may not work as
|
||||
expected. USE WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module. When EXPERIMENTAL
|
||||
mode is enabled, reading the first 8 sensors on newer ThinkPads will
|
||||
also use an new experimental thermal sensor access mode.
|
||||
|
||||
For example, on the X40, a typical output may be:
|
||||
temperatures: 42 42 45 41 36 -128 33 -128
|
||||
|
||||
EXPERIMENTAL: On the T43/p, a typical output may be:
|
||||
temperatures: 48 48 36 52 38 -128 31 -128 48 52 48 -128 -128 -128 -128 -128
|
||||
|
||||
The mapping of thermal sensors to physical locations varies depending on
|
||||
system-board model (and thus, on ThinkPad model).
|
||||
|
||||
http://thinkwiki.org/wiki/Thermal_Sensors is a public wiki page that
|
||||
tries to track down these locations for various models.
|
||||
|
||||
Most (newer?) models seem to follow this pattern:
|
||||
|
||||
1: CPU
|
||||
2: (depends on model)
|
||||
3: (depends on model)
|
||||
4: GPU
|
||||
5: Main battery: main sensor
|
||||
6: Bay battery: main sensor
|
||||
7: Main battery: secondary sensor
|
||||
8: Bay battery: secondary sensor
|
||||
9-15: (depends on model)
|
||||
|
||||
For the R51 (source: Thomas Gruber):
|
||||
2: Mini-PCI
|
||||
3: Internal HDD
|
||||
|
||||
For the T43, T43/p (source: Shmidoax/Thinkwiki.org)
|
||||
http://thinkwiki.org/wiki/Thermal_Sensors#ThinkPad_T43.2C_T43p
|
||||
2: System board, left side (near PCMCIA slot), reported as HDAPS temp
|
||||
3: PCMCIA slot
|
||||
9: MCH (northbridge) to DRAM Bus
|
||||
10: ICH (southbridge), under Mini-PCI card, under touchpad
|
||||
11: Power regulator, underside of system board, below F2 key
|
||||
|
||||
The A31 has a very atypical layout for the thermal sensors
|
||||
(source: Milos Popovic, http://thinkwiki.org/wiki/Thermal_Sensors#ThinkPad_A31)
|
||||
1: CPU
|
||||
2: Main Battery: main sensor
|
||||
3: Power Converter
|
||||
4: Bay Battery: main sensor
|
||||
5: MCH (northbridge)
|
||||
6: PCMCIA/ambient
|
||||
7: Main Battery: secondary sensor
|
||||
8: Bay Battery: secondary sensor
|
||||
|
||||
|
||||
Procfs notes:
|
||||
Readings from sensors that are not available return -128.
|
||||
No commands can be written to this file.
|
||||
|
||||
Sysfs notes:
|
||||
Sensors that are not available return the ENXIO error. This
|
||||
status may change at runtime, as there are hotplug thermal
|
||||
sensors, like those inside the batteries and docks.
|
||||
|
||||
thinkpad-acpi thermal sensors are reported through the hwmon
|
||||
subsystem, and follow all of the hwmon guidelines at
|
||||
Documentation/hwmon.
|
||||
|
||||
|
||||
EXPERIMENTAL: Embedded controller register dump -- /proc/acpi/ibm/ecdump
|
||||
------------------------------------------------------------------------
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
|
||||
This feature dumps the values of 256 embedded controller
|
||||
registers. Values which have changed since the last time the registers
|
||||
were dumped are marked with a star:
|
||||
|
||||
[root@x40 ibm-acpi]# cat /proc/acpi/ibm/ecdump
|
||||
EC +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f
|
||||
EC 0x00: a7 47 87 01 fe 96 00 08 01 00 cb 00 00 00 40 00
|
||||
EC 0x10: 00 00 ff ff f4 3c 87 09 01 ff 42 01 ff ff 0d 00
|
||||
EC 0x20: 00 00 00 00 00 00 00 00 00 00 00 03 43 00 00 80
|
||||
EC 0x30: 01 07 1a 00 30 04 00 00 *85 00 00 10 00 50 00 00
|
||||
EC 0x40: 00 00 00 00 00 00 14 01 00 04 00 00 00 00 00 00
|
||||
EC 0x50: 00 c0 02 0d 00 01 01 02 02 03 03 03 03 *bc *02 *bc
|
||||
EC 0x60: *02 *bc *02 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0x70: 00 00 00 00 00 12 30 40 *24 *26 *2c *27 *20 80 *1f 80
|
||||
EC 0x80: 00 00 00 06 *37 *0e 03 00 00 00 0e 07 00 00 00 00
|
||||
EC 0x90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xa0: *ff 09 ff 09 ff ff *64 00 *00 *00 *a2 41 *ff *ff *e0 00
|
||||
EC 0xb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xd0: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xe0: 00 00 00 00 00 00 00 00 11 20 49 04 24 06 55 03
|
||||
EC 0xf0: 31 55 48 54 35 38 57 57 08 2f 45 73 07 65 6c 1a
|
||||
|
||||
This feature can be used to determine the register holding the fan
|
||||
speed on some models. To do that, do the following:
|
||||
|
||||
- make sure the battery is fully charged
|
||||
- make sure the fan is running
|
||||
- run 'cat /proc/acpi/ibm/ecdump' several times, once per second or so
|
||||
|
||||
The first step makes sure various charging-related values don't
|
||||
vary. The second ensures that the fan-related values do vary, since
|
||||
the fan speed fluctuates a bit. The third will (hopefully) mark the
|
||||
fan register with a star:
|
||||
|
||||
[root@x40 ibm-acpi]# cat /proc/acpi/ibm/ecdump
|
||||
EC +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f
|
||||
EC 0x00: a7 47 87 01 fe 96 00 08 01 00 cb 00 00 00 40 00
|
||||
EC 0x10: 00 00 ff ff f4 3c 87 09 01 ff 42 01 ff ff 0d 00
|
||||
EC 0x20: 00 00 00 00 00 00 00 00 00 00 00 03 43 00 00 80
|
||||
EC 0x30: 01 07 1a 00 30 04 00 00 85 00 00 10 00 50 00 00
|
||||
EC 0x40: 00 00 00 00 00 00 14 01 00 04 00 00 00 00 00 00
|
||||
EC 0x50: 00 c0 02 0d 00 01 01 02 02 03 03 03 03 bc 02 bc
|
||||
EC 0x60: 02 bc 02 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0x70: 00 00 00 00 00 12 30 40 24 27 2c 27 21 80 1f 80
|
||||
EC 0x80: 00 00 00 06 *be 0d 03 00 00 00 0e 07 00 00 00 00
|
||||
EC 0x90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xa0: ff 09 ff 09 ff ff 64 00 00 00 a2 41 ff ff e0 00
|
||||
EC 0xb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xd0: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
EC 0xe0: 00 00 00 00 00 00 00 00 11 20 49 04 24 06 55 03
|
||||
EC 0xf0: 31 55 48 54 35 38 57 57 08 2f 45 73 07 65 6c 1a
|
||||
|
||||
Another set of values that varies often is the temperature
|
||||
readings. Since temperatures don't change vary fast, you can take
|
||||
several quick dumps to eliminate them.
|
||||
|
||||
You can use a similar method to figure out the meaning of other
|
||||
embedded controller registers - e.g. make sure nothing else changes
|
||||
except the charging or discharging battery to determine which
|
||||
registers contain the current battery capacity, etc. If you experiment
|
||||
with this, do send me your results (including some complete dumps with
|
||||
a description of the conditions when they were taken.)
|
||||
|
||||
LCD brightness control
|
||||
----------------------
|
||||
|
||||
procfs: /proc/acpi/ibm/brightness
|
||||
sysfs backlight device "thinkpad_screen"
|
||||
|
||||
This feature allows software control of the LCD brightness on ThinkPad
|
||||
models which don't have a hardware brightness slider.
|
||||
|
||||
It has some limitations: the LCD backlight cannot be actually turned on or off
|
||||
by this interface, and in many ThinkPad models, the "dim while on battery"
|
||||
functionality will be enabled by the BIOS when this interface is used, and
|
||||
cannot be controlled.
|
||||
|
||||
The backlight control has eight levels, ranging from 0 to 7. Some of the
|
||||
levels may not be distinct.
|
||||
|
||||
Procfs notes:
|
||||
|
||||
The available commands are:
|
||||
|
||||
echo up >/proc/acpi/ibm/brightness
|
||||
echo down >/proc/acpi/ibm/brightness
|
||||
echo 'level <level>' >/proc/acpi/ibm/brightness
|
||||
|
||||
Sysfs notes:
|
||||
|
||||
The interface is implemented through the backlight sysfs class, which is poorly
|
||||
documented at this time.
|
||||
|
||||
Locate the thinkpad_screen device under /sys/class/backlight, and inside it
|
||||
there will be the following attributes:
|
||||
|
||||
max_brightness:
|
||||
Reads the maximum brightness the hardware can be set to.
|
||||
The minimum is always zero.
|
||||
|
||||
actual_brightness:
|
||||
Reads what brightness the screen is set to at this instant.
|
||||
|
||||
brightness:
|
||||
Writes request the driver to change brightness to the given
|
||||
value. Reads will tell you what brightness the driver is trying
|
||||
to set the display to when "power" is set to zero and the display
|
||||
has not been dimmed by a kernel power management event.
|
||||
|
||||
power:
|
||||
power management mode, where 0 is "display on", and 1 to 3 will
|
||||
dim the display backlight to brightness level 0 because
|
||||
thinkpad-acpi cannot really turn the backlight off. Kernel
|
||||
power management events can temporarily increase the current
|
||||
power management level, i.e. they can dim the display.
|
||||
|
||||
|
||||
Volume control -- /proc/acpi/ibm/volume
|
||||
---------------------------------------
|
||||
|
||||
This feature allows volume control on ThinkPad models which don't have
|
||||
a hardware volume knob. The available commands are:
|
||||
|
||||
echo up >/proc/acpi/ibm/volume
|
||||
echo down >/proc/acpi/ibm/volume
|
||||
echo mute >/proc/acpi/ibm/volume
|
||||
echo 'level <level>' >/proc/acpi/ibm/volume
|
||||
|
||||
The <level> number range is 0 to 15 although not all of them may be
|
||||
distinct. The unmute the volume after the mute command, use either the
|
||||
up or down command (the level command will not unmute the volume).
|
||||
The current volume level and mute state is shown in the file.
|
||||
|
||||
Fan control and monitoring: fan speed, fan enable/disable
|
||||
---------------------------------------------------------
|
||||
|
||||
procfs: /proc/acpi/ibm/fan
|
||||
sysfs device attributes: (hwmon) fan_input, pwm1, pwm1_enable
|
||||
|
||||
NOTE NOTE NOTE: fan control operations are disabled by default for
|
||||
safety reasons. To enable them, the module parameter "fan_control=1"
|
||||
must be given to thinkpad-acpi.
|
||||
|
||||
This feature attempts to show the current fan speed, control mode and
|
||||
other fan data that might be available. The speed is read directly
|
||||
from the hardware registers of the embedded controller. This is known
|
||||
to work on later R, T, X and Z series ThinkPads but may show a bogus
|
||||
value on other models.
|
||||
|
||||
Fan levels:
|
||||
|
||||
Most ThinkPad fans work in "levels" at the firmware interface. Level 0
|
||||
stops the fan. The higher the level, the higher the fan speed, although
|
||||
adjacent levels often map to the same fan speed. 7 is the highest
|
||||
level, where the fan reaches the maximum recommended speed.
|
||||
|
||||
Level "auto" means the EC changes the fan level according to some
|
||||
internal algorithm, usually based on readings from the thermal sensors.
|
||||
|
||||
There is also a "full-speed" level, also known as "disengaged" level.
|
||||
In this level, the EC disables the speed-locked closed-loop fan control,
|
||||
and drives the fan as fast as it can go, which might exceed hardware
|
||||
limits, so use this level with caution.
|
||||
|
||||
The fan usually ramps up or down slowly from one speed to another, and
|
||||
it is normal for the EC to take several seconds to react to fan
|
||||
commands. The full-speed level may take up to two minutes to ramp up to
|
||||
maximum speed, and in some ThinkPads, the tachometer readings go stale
|
||||
while the EC is transitioning to the full-speed level.
|
||||
|
||||
WARNING WARNING WARNING: do not leave the fan disabled unless you are
|
||||
monitoring all of the temperature sensor readings and you are ready to
|
||||
enable it if necessary to avoid overheating.
|
||||
|
||||
An enabled fan in level "auto" may stop spinning if the EC decides the
|
||||
ThinkPad is cool enough and doesn't need the extra airflow. This is
|
||||
normal, and the EC will spin the fan up if the varios thermal readings
|
||||
rise too much.
|
||||
|
||||
On the X40, this seems to depend on the CPU and HDD temperatures.
|
||||
Specifically, the fan is turned on when either the CPU temperature
|
||||
climbs to 56 degrees or the HDD temperature climbs to 46 degrees. The
|
||||
fan is turned off when the CPU temperature drops to 49 degrees and the
|
||||
HDD temperature drops to 41 degrees. These thresholds cannot
|
||||
currently be controlled.
|
||||
|
||||
The ThinkPad's ACPI DSDT code will reprogram the fan on its own when
|
||||
certain conditions are met. It will override any fan programming done
|
||||
through thinkpad-acpi.
|
||||
|
||||
The thinkpad-acpi kernel driver can be programmed to revert the fan
|
||||
level to a safe setting if userspace does not issue one of the procfs
|
||||
fan commands: "enable", "disable", "level" or "watchdog", or if there
|
||||
are no writes to pwm1_enable (or to pwm1 *if and only if* pwm1_enable is
|
||||
set to 1, manual mode) within a configurable amount of time of up to
|
||||
120 seconds. This functionality is called fan safety watchdog.
|
||||
|
||||
Note that the watchdog timer stops after it enables the fan. It will be
|
||||
rearmed again automatically (using the same interval) when one of the
|
||||
above mentioned fan commands is received. The fan watchdog is,
|
||||
therefore, not suitable to protect against fan mode changes made through
|
||||
means other than the "enable", "disable", and "level" procfs fan
|
||||
commands, or the hwmon fan control sysfs interface.
|
||||
|
||||
Procfs notes:
|
||||
|
||||
The fan may be enabled or disabled with the following commands:
|
||||
|
||||
echo enable >/proc/acpi/ibm/fan
|
||||
echo disable >/proc/acpi/ibm/fan
|
||||
|
||||
Placing a fan on level 0 is the same as disabling it. Enabling a fan
|
||||
will try to place it in a safe level if it is too slow or disabled.
|
||||
|
||||
The fan level can be controlled with the command:
|
||||
|
||||
echo 'level <level>' > /proc/acpi/ibm/fan
|
||||
|
||||
Where <level> is an integer from 0 to 7, or one of the words "auto" or
|
||||
"full-speed" (without the quotes). Not all ThinkPads support the "auto"
|
||||
and "full-speed" levels. The driver accepts "disengaged" as an alias for
|
||||
"full-speed", and reports it as "disengaged" for backwards
|
||||
compatibility.
|
||||
|
||||
On the X31 and X40 (and ONLY on those models), the fan speed can be
|
||||
controlled to a certain degree. Once the fan is running, it can be
|
||||
forced to run faster or slower with the following command:
|
||||
|
||||
echo 'speed <speed>' > /proc/acpi/ibm/fan
|
||||
|
||||
The sustainable range of fan speeds on the X40 appears to be from about
|
||||
3700 to about 7350. Values outside this range either do not have any
|
||||
effect or the fan speed eventually settles somewhere in that range. The
|
||||
fan cannot be stopped or started with this command. This functionality
|
||||
is incomplete, and not available through the sysfs interface.
|
||||
|
||||
To program the safety watchdog, use the "watchdog" command.
|
||||
|
||||
echo 'watchdog <interval in seconds>' > /proc/acpi/ibm/fan
|
||||
|
||||
If you want to disable the watchdog, use 0 as the interval.
|
||||
|
||||
Sysfs notes:
|
||||
|
||||
The sysfs interface follows the hwmon subsystem guidelines for the most
|
||||
part, and the exception is the fan safety watchdog.
|
||||
|
||||
Writes to any of the sysfs attributes may return the EINVAL error if
|
||||
that operation is not supported in a given ThinkPad or if the parameter
|
||||
is out-of-bounds, and EPERM if it is forbidden. They may also return
|
||||
EINTR (interrupted system call), and EIO (I/O error while trying to talk
|
||||
to the firmware).
|
||||
|
||||
Features not yet implemented by the driver return ENOSYS.
|
||||
|
||||
hwmon device attribute pwm1_enable:
|
||||
0: PWM offline (fan is set to full-speed mode)
|
||||
1: Manual PWM control (use pwm1 to set fan level)
|
||||
2: Hardware PWM control (EC "auto" mode)
|
||||
3: reserved (Software PWM control, not implemented yet)
|
||||
|
||||
Modes 0 and 2 are not supported by all ThinkPads, and the
|
||||
driver is not always able to detect this. If it does know a
|
||||
mode is unsupported, it will return -EINVAL.
|
||||
|
||||
hwmon device attribute pwm1:
|
||||
Fan level, scaled from the firmware values of 0-7 to the hwmon
|
||||
scale of 0-255. 0 means fan stopped, 255 means highest normal
|
||||
speed (level 7).
|
||||
|
||||
This attribute only commands the fan if pmw1_enable is set to 1
|
||||
(manual PWM control).
|
||||
|
||||
hwmon device attribute fan1_input:
|
||||
Fan tachometer reading, in RPM. May go stale on certain
|
||||
ThinkPads while the EC transitions the PWM to offline mode,
|
||||
which can take up to two minutes. May return rubbish on older
|
||||
ThinkPads.
|
||||
|
||||
driver attribute fan_watchdog:
|
||||
Fan safety watchdog timer interval, in seconds. Minimum is
|
||||
1 second, maximum is 120 seconds. 0 disables the watchdog.
|
||||
|
||||
To stop the fan: set pwm1 to zero, and pwm1_enable to 1.
|
||||
|
||||
To start the fan in a safe mode: set pwm1_enable to 2. If that fails
|
||||
with EINVAL, try to set pwm1_enable to 1 and pwm1 to at least 128 (255
|
||||
would be the safest choice, though).
|
||||
|
||||
|
||||
EXPERIMENTAL: WAN
|
||||
-----------------
|
||||
|
||||
procfs: /proc/acpi/ibm/wan
|
||||
sysfs device attribute: wwan/enable
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
|
||||
This feature shows the presence and current state of a W-WAN (Sierra
|
||||
Wireless EV-DO) device.
|
||||
|
||||
It was tested on a Lenovo Thinkpad X60. It should probably work on other
|
||||
Thinkpad models which come with this module installed.
|
||||
|
||||
Procfs notes:
|
||||
|
||||
If the W-WAN card is installed, the following commands can be used:
|
||||
|
||||
echo enable > /proc/acpi/ibm/wan
|
||||
echo disable > /proc/acpi/ibm/wan
|
||||
|
||||
Sysfs notes:
|
||||
|
||||
If the W-WAN card is installed, it can be enabled /
|
||||
disabled through the "wwan/enable" thinkpad-acpi device
|
||||
attribute, and its current status can also be queried.
|
||||
|
||||
enable:
|
||||
0: disables WWAN card / WWAN card is disabled
|
||||
1: enables WWAN card / WWAN card is enabled.
|
||||
|
||||
Note: this interface will be probably be superseeded by the
|
||||
generic rfkill class.
|
||||
|
||||
Multiple Commands, Module Parameters
|
||||
------------------------------------
|
||||
|
||||
Multiple commands can be written to the proc files in one shot by
|
||||
separating them with commas, for example:
|
||||
|
||||
echo enable,0xffff > /proc/acpi/ibm/hotkey
|
||||
echo lcd_disable,crt_enable > /proc/acpi/ibm/video
|
||||
|
||||
Commands can also be specified when loading the thinkpad-acpi module,
|
||||
for example:
|
||||
|
||||
modprobe thinkpad_acpi hotkey=enable,0xffff video=auto_disable
|
||||
|
||||
Enabling debugging output
|
||||
-------------------------
|
||||
|
||||
The module takes a debug paramater which can be used to selectively
|
||||
enable various classes of debugging output, for example:
|
||||
|
||||
modprobe ibm_acpi debug=0xffff
|
||||
|
||||
will enable all debugging output classes. It takes a bitmask, so
|
||||
to enable more than one output class, just add their values.
|
||||
|
||||
Debug bitmask Description
|
||||
0x0001 Initialization and probing
|
||||
0x0002 Removal
|
||||
|
||||
There is also a kernel build option to enable more debugging
|
||||
information, which may be necessary to debug driver problems.
|
||||
|
||||
The level of debugging information output by the driver can be changed
|
||||
at runtime through sysfs, using the driver attribute debug_level. The
|
||||
attribute takes the same bitmask as the debug module parameter above.
|
||||
|
||||
Force loading of module
|
||||
-----------------------
|
||||
|
||||
If thinkpad-acpi refuses to detect your ThinkPad, you can try to specify
|
||||
the module parameter force_load=1. Regardless of whether this works or
|
||||
not, please contact ibm-acpi-devel@lists.sourceforge.net with a report.
|
||||
|
||||
|
||||
Sysfs interface changelog:
|
||||
|
||||
0x000100: Initial sysfs support, as a single platform driver and
|
||||
device.
|
@ -16,7 +16,7 @@ situation as with tcpdump.
|
||||
|
||||
Unlike the packet socket, usbmon has an interface which provides traces
|
||||
in a text format. This is used for two purposes. First, it serves as a
|
||||
common trace exchange format for tools while most sophisticated formats
|
||||
common trace exchange format for tools while more sophisticated formats
|
||||
are finalized. Second, humans can read it in case tools are not available.
|
||||
|
||||
To collect a raw text trace, execute following steps.
|
||||
@ -34,7 +34,7 @@ if usbmon is built into the kernel.
|
||||
Verify that bus sockets are present.
|
||||
|
||||
# ls /sys/kernel/debug/usbmon
|
||||
1s 1t 2s 2t 3s 3t 4s 4t
|
||||
1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
|
||||
#
|
||||
|
||||
2. Find which bus connects to the desired device
|
||||
@ -54,7 +54,7 @@ Bus=03 means it's bus 3.
|
||||
|
||||
3. Start 'cat'
|
||||
|
||||
# cat /sys/kernel/debug/usbmon/3t > /tmp/1.mon.out
|
||||
# cat /sys/kernel/debug/usbmon/3u > /tmp/1.mon.out
|
||||
|
||||
This process will be reading until killed. Naturally, the output can be
|
||||
redirected to a desirable location. This is preferred, because it is going
|
||||
@ -75,46 +75,80 @@ that the file size is not excessive for your favourite editor.
|
||||
|
||||
* Raw text data format
|
||||
|
||||
The '1t' type data consists of a stream of events, such as URB submission,
|
||||
Two formats are supported currently: the original, or '1t' format, and
|
||||
the '1u' format. The '1t' format is deprecated in kernel 2.6.21. The '1u'
|
||||
format adds a few fields, such as ISO frame descriptors, interval, etc.
|
||||
It produces slightly longer lines, but otherwise is a perfect superset
|
||||
of '1t' format.
|
||||
|
||||
If it is desired to recognize one from the other in a program, look at the
|
||||
"address" word (see below), where '1u' format adds a bus number. If 2 colons
|
||||
are present, it's the '1t' format, otherwise '1u'.
|
||||
|
||||
Any text format data consists of a stream of events, such as URB submission,
|
||||
URB callback, submission error. Every event is a text line, which consists
|
||||
of whitespace separated words. The number or position of words may depend
|
||||
on the event type, but there is a set of words, common for all types.
|
||||
|
||||
Here is the list of words, from left to right:
|
||||
|
||||
- URB Tag. This is used to identify URBs is normally a kernel mode address
|
||||
of the URB structure in hexadecimal.
|
||||
|
||||
- Timestamp in microseconds, a decimal number. The timestamp's resolution
|
||||
depends on available clock, and so it can be much worse than a microsecond
|
||||
(if the implementation uses jiffies, for example).
|
||||
|
||||
- Event Type. This type refers to the format of the event, not URB type.
|
||||
Available types are: S - submission, C - callback, E - submission error.
|
||||
- "Pipe". The pipe concept is deprecated. This is a composite word, used to
|
||||
be derived from information in pipes. It consists of three fields, separated
|
||||
by colons: URB type and direction, Device address, Endpoint number.
|
||||
|
||||
- "Address" word (formerly a "pipe"). It consists of four fields, separated by
|
||||
colons: URB type and direction, Bus number, Device address, Endpoint number.
|
||||
Type and direction are encoded with two bytes in the following manner:
|
||||
Ci Co Control input and output
|
||||
Zi Zo Isochronous input and output
|
||||
Ii Io Interrupt input and output
|
||||
Bi Bo Bulk input and output
|
||||
Device address and Endpoint number are 3-digit and 2-digit (respectively)
|
||||
decimal numbers, with leading zeroes.
|
||||
- URB Status. In most cases, this field contains a number, sometimes negative,
|
||||
which represents a "status" field of the URB. This field makes no sense for
|
||||
submissions, but is present anyway to help scripts with parsing. When an
|
||||
error occurs, the field contains the error code. In case of a submission of
|
||||
a Control packet, this field contains a Setup Tag instead of an error code.
|
||||
It is easy to tell whether the Setup Tag is present because it is never a
|
||||
number. Thus if scripts find a number in this field, they proceed to read
|
||||
Data Length. If they find something else, like a letter, they read the setup
|
||||
packet before reading the Data Length.
|
||||
Bus number, Device address, and Endpoint are decimal numbers, but they may
|
||||
have leading zeros, for the sake of human readers.
|
||||
|
||||
- URB Status word. This is either a letter, or several numbers separated
|
||||
by colons: URB status, interval, start frame, and error count. Unlike the
|
||||
"address" word, all fields save the status are optional. Interval is printed
|
||||
only for interrupt and isochronous URBs. Start frame is printed only for
|
||||
isochronous URBs. Error count is printed only for isochronous callback
|
||||
events.
|
||||
|
||||
The status field is a decimal number, sometimes negative, which represents
|
||||
a "status" field of the URB. This field makes no sense for submissions, but
|
||||
is present anyway to help scripts with parsing. When an error occurs, the
|
||||
field contains the error code.
|
||||
|
||||
In case of a submission of a Control packet, this field contains a Setup Tag
|
||||
instead of an group of numbers. It is easy to tell whether the Setup Tag is
|
||||
present because it is never a number. Thus if scripts find a set of numbers
|
||||
in this word, they proceed to read Data Length (except for isochronous URBs).
|
||||
If they find something else, like a letter, they read the setup packet before
|
||||
reading the Data Length or isochronous descriptors.
|
||||
|
||||
- Setup packet, if present, consists of 5 words: one of each for bmRequestType,
|
||||
bRequest, wValue, wIndex, wLength, as specified by the USB Specification 2.0.
|
||||
These words are safe to decode if Setup Tag was 's'. Otherwise, the setup
|
||||
packet was present, but not captured, and the fields contain filler.
|
||||
|
||||
- Number of isochronous frame descriptors and descriptors themselves.
|
||||
If an Isochronous transfer event has a set of descriptors, a total number
|
||||
of them in an URB is printed first, then a word per descriptor, up to a
|
||||
total of 5. The word consists of 3 colon-separated decimal numbers for
|
||||
status, offset, and length respectively. For submissions, initial length
|
||||
is reported. For callbacks, actual length is reported.
|
||||
|
||||
- Data Length. For submissions, this is the requested length. For callbacks,
|
||||
this is the actual length.
|
||||
|
||||
- Data tag. The usbmon may not always capture data, even if length is nonzero.
|
||||
The data words are present only if this tag is '='.
|
||||
|
||||
- Data words follow, in big endian hexadecimal format. Notice that they are
|
||||
not machine words, but really just a byte stream split into words to make
|
||||
it easier to read. Thus, the last word may contain from one to four bytes.
|
||||
@ -153,20 +187,18 @@ class ParsedLine {
|
||||
}
|
||||
}
|
||||
|
||||
This format may be changed in the future.
|
||||
|
||||
Examples:
|
||||
|
||||
An input control transfer to get a port status.
|
||||
|
||||
d5ea89a0 3575914555 S Ci:001:00 s a3 00 0000 0003 0004 4 <
|
||||
d5ea89a0 3575914560 C Ci:001:00 0 4 = 01050000
|
||||
d5ea89a0 3575914555 S Ci:1:001:0 s a3 00 0000 0003 0004 4 <
|
||||
d5ea89a0 3575914560 C Ci:1:001:0 0 4 = 01050000
|
||||
|
||||
An output bulk transfer to send a SCSI command 0x5E in a 31-byte Bulk wrapper
|
||||
to a storage device at address 5:
|
||||
|
||||
dd65f0e8 4128379752 S Bo:005:02 -115 31 = 55534243 5e000000 00000000 00000600 00000000 00000000 00000000 000000
|
||||
dd65f0e8 4128379808 C Bo:005:02 0 31 >
|
||||
dd65f0e8 4128379752 S Bo:1:005:2 -115 31 = 55534243 5e000000 00000000 00000600 00000000 00000000 00000000 000000
|
||||
dd65f0e8 4128379808 C Bo:1:005:2 0 31 >
|
||||
|
||||
* Raw binary format and API
|
||||
|
||||
|
@ -126,7 +126,7 @@
|
||||
125 -> MATRIX Vision Sigma-SQ
|
||||
126 -> MATRIX Vision Sigma-SLC
|
||||
127 -> APAC Viewcomp 878(AMAX)
|
||||
128 -> DViCO FusionHDTV DVB-T Lite [18ac:db10]
|
||||
128 -> DViCO FusionHDTV DVB-T Lite [18ac:db10,18ac:db11]
|
||||
129 -> V-Gear MyVCD
|
||||
130 -> Super TV Tuner
|
||||
131 -> Tibet Systems 'Progress DVR' CS16
|
||||
@ -143,3 +143,5 @@
|
||||
142 -> Sabrent TV-FM (bttv version)
|
||||
143 -> Hauppauge ImpactVCB (bt878) [0070:13eb]
|
||||
144 -> MagicTV
|
||||
145 -> SSAI Security Video Interface [4149:5353]
|
||||
146 -> SSAI Ultrasound Video Interface [414a:5353]
|
||||
|
@ -37,7 +37,7 @@
|
||||
36 -> AVerTV 303 (M126) [1461:000a]
|
||||
37 -> Hauppauge Nova-S-Plus DVB-S [0070:9201,0070:9202]
|
||||
38 -> Hauppauge Nova-SE2 DVB-S [0070:9200]
|
||||
39 -> KWorld DVB-S 100 [17de:08b2]
|
||||
39 -> KWorld DVB-S 100 [17de:08b2,1421:0341]
|
||||
40 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid [0070:9400,0070:9402]
|
||||
41 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile) [0070:9800,0070:9802]
|
||||
42 -> digitalnow DNTV Live! DVB-T Pro [1822:0025,1822:0019]
|
||||
|
18
Documentation/video4linux/CARDLIST.ivtv
Normal file
18
Documentation/video4linux/CARDLIST.ivtv
Normal file
@ -0,0 +1,18 @@
|
||||
1 -> Hauppauge WinTV PVR-250
|
||||
2 -> Hauppauge WinTV PVR-350
|
||||
3 -> Hauppauge WinTV PVR-150 or PVR-500
|
||||
4 -> AVerMedia M179 [1461:a3ce,1461:a3cf]
|
||||
5 -> Yuan MPG600/Kuroutoshikou iTVC16-STVLP [12ab:fff3,12ab:ffff]
|
||||
6 -> Yuan MPG160/Kuroutoshikou iTVC15-STVLP [12ab:0000,10fc:40a0]
|
||||
7 -> Yuan PG600/DiamondMM PVR-550 [ff92:0070,ffab:0600]
|
||||
8 -> Adaptec AVC-2410 [9005:0093]
|
||||
9 -> Adaptec AVC-2010 [9005:0092]
|
||||
10 -> NAGASE TRANSGEAR 5000TV [1461:bfff]
|
||||
11 -> AOpen VA2000MAX-STN6 [0000:ff5f]
|
||||
12 -> YUAN MPG600GR/Kuroutoshikou CX23416GYC-STVLP [12ab:0600,fbab:0600,1154:0523]
|
||||
13 -> I/O Data GV-MVP/RX [10fc:d01e,10fc:d038,10fc:d039]
|
||||
14 -> I/O Data GV-MVP/RX2E [10fc:d025]
|
||||
15 -> GOTVIEW PCI DVD (partial support only) [12ab:0600]
|
||||
16 -> GOTVIEW PCI DVD2 Deluxe [ffac:0600]
|
||||
17 -> Yuan MPC622 [ff01:d998]
|
||||
18 -> Digital Cowboy DCT-MTVP1 [1461:bfff]
|
@ -53,7 +53,7 @@
|
||||
52 -> AverMedia AverTV/305 [1461:2108]
|
||||
53 -> ASUS TV-FM 7135 [1043:4845]
|
||||
54 -> LifeView FlyTV Platinum FM / Gold [5168:0214,1489:0214,5168:0304]
|
||||
55 -> LifeView FlyDVB-T DUO [5168:0306]
|
||||
55 -> LifeView FlyDVB-T DUO / MSI TV@nywhere Duo [5168:0306,4E42:0306]
|
||||
56 -> Avermedia AVerTV 307 [1461:a70a]
|
||||
57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
|
||||
58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0351,1421:0370,1421:1370]
|
||||
@ -76,7 +76,7 @@
|
||||
75 -> AVerMedia AVerTVHD MCE A180 [1461:1044]
|
||||
76 -> SKNet MonsterTV Mobile [1131:4ee9]
|
||||
77 -> Pinnacle PCTV 40i/50i/110i (saa7133) [11bd:002e]
|
||||
78 -> ASUSTeK P7131 Dual [1043:4862,1043:4876]
|
||||
78 -> ASUSTeK P7131 Dual [1043:4862,1043:4857]
|
||||
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
|
||||
80 -> ASUS Digimatrix TV [1043:0210]
|
||||
81 -> Philips Tiger reference design [1131:2018]
|
||||
@ -104,3 +104,10 @@
|
||||
103 -> Compro Videomate DVB-T200A
|
||||
104 -> Hauppauge WinTV-HVR1110 DVB-T/Hybrid [0070:6701]
|
||||
105 -> Terratec Cinergy HT PCMCIA [153b:1172]
|
||||
106 -> Encore ENLTV [1131:2342,1131:2341,3016:2344]
|
||||
107 -> Encore ENLTV-FM [1131:230f]
|
||||
108 -> Terratec Cinergy HT PCI [153b:1175]
|
||||
109 -> Philips Tiger - S Reference design
|
||||
110 -> Avermedia M102 [1461:f31e]
|
||||
111 -> ASUS P7131 4871 [1043:4871]
|
||||
112 -> ASUSTeK P7131 Hybrid [1043:4876]
|
||||
|
64
Documentation/video4linux/CARDLIST.usbvision
Normal file
64
Documentation/video4linux/CARDLIST.usbvision
Normal file
@ -0,0 +1,64 @@
|
||||
0 -> Xanboo [0a6f:0400]
|
||||
1 -> Belkin USB VideoBus II Adapter [050d:0106]
|
||||
2 -> Belkin Components USB VideoBus [050d:0207]
|
||||
3 -> Belkin USB VideoBus II [050d:0208]
|
||||
4 -> echoFX InterView Lite [0571:0002]
|
||||
5 -> USBGear USBG-V1 resp. HAMA USB [0573:0003]
|
||||
6 -> D-Link V100 [0573:0400]
|
||||
7 -> X10 USB Camera [0573:2000]
|
||||
8 -> Hauppauge WinTV USB Live (PAL B/G) [0573:2d00]
|
||||
9 -> Hauppauge WinTV USB Live Pro (NTSC M/N) [0573:2d01]
|
||||
10 -> Zoran Co. PMD (Nogatech) AV-grabber Manhattan [0573:2101]
|
||||
11 -> Nogatech USB-TV (NTSC) FM [0573:4100]
|
||||
12 -> PNY USB-TV (NTSC) FM [0573:4110]
|
||||
13 -> PixelView PlayTv-USB PRO (PAL) FM [0573:4450]
|
||||
14 -> ZTV ZT-721 2.4GHz USB A/V Receiver [0573:4550]
|
||||
15 -> Hauppauge WinTV USB (NTSC M/N) [0573:4d00]
|
||||
16 -> Hauppauge WinTV USB (PAL B/G) [0573:4d01]
|
||||
17 -> Hauppauge WinTV USB (PAL I) [0573:4d02]
|
||||
18 -> Hauppauge WinTV USB (PAL/SECAM L) [0573:4d03]
|
||||
19 -> Hauppauge WinTV USB (PAL D/K) [0573:4d04]
|
||||
20 -> Hauppauge WinTV USB (NTSC FM) [0573:4d10]
|
||||
21 -> Hauppauge WinTV USB (PAL B/G FM) [0573:4d11]
|
||||
22 -> Hauppauge WinTV USB (PAL I FM) [0573:4d12]
|
||||
23 -> Hauppauge WinTV USB (PAL D/K FM) [0573:4d14]
|
||||
24 -> Hauppauge WinTV USB Pro (NTSC M/N) [0573:4d2a]
|
||||
25 -> Hauppauge WinTV USB Pro (NTSC M/N) V2 [0573:4d2b]
|
||||
26 -> Hauppauge WinTV USB Pro (PAL/SECAM B/G/I/D/K/L) [0573:4d2c]
|
||||
27 -> Hauppauge WinTV USB Pro (NTSC M/N) V3 [0573:4d20]
|
||||
28 -> Hauppauge WinTV USB Pro (PAL B/G) [0573:4d21]
|
||||
29 -> Hauppauge WinTV USB Pro (PAL I) [0573:4d22]
|
||||
30 -> Hauppauge WinTV USB Pro (PAL/SECAM L) [0573:4d23]
|
||||
31 -> Hauppauge WinTV USB Pro (PAL D/K) [0573:4d24]
|
||||
32 -> Hauppauge WinTV USB Pro (PAL/SECAM BGDK/I/L) [0573:4d25]
|
||||
33 -> Hauppauge WinTV USB Pro (PAL/SECAM BGDK/I/L) V2 [0573:4d26]
|
||||
34 -> Hauppauge WinTV USB Pro (PAL B/G) V2 [0573:4d27]
|
||||
35 -> Hauppauge WinTV USB Pro (PAL B/G,D/K) [0573:4d28]
|
||||
36 -> Hauppauge WinTV USB Pro (PAL I,D/K) [0573:4d29]
|
||||
37 -> Hauppauge WinTV USB Pro (NTSC M/N FM) [0573:4d30]
|
||||
38 -> Hauppauge WinTV USB Pro (PAL B/G FM) [0573:4d31]
|
||||
39 -> Hauppauge WinTV USB Pro (PAL I FM) [0573:4d32]
|
||||
40 -> Hauppauge WinTV USB Pro (PAL D/K FM) [0573:4d34]
|
||||
41 -> Hauppauge WinTV USB Pro (Temic PAL/SECAM B/G/I/D/K/L FM) [0573:4d35]
|
||||
42 -> Hauppauge WinTV USB Pro (Temic PAL B/G FM) [0573:4d36]
|
||||
43 -> Hauppauge WinTV USB Pro (PAL/SECAM B/G/I/D/K/L FM) [0573:4d37]
|
||||
44 -> Hauppauge WinTV USB Pro (NTSC M/N FM) V2 [0573:4d38]
|
||||
45 -> Camtel Technology USB TV Genie Pro FM Model TVB330 [0768:0006]
|
||||
46 -> Digital Video Creator I [07d0:0001]
|
||||
47 -> Global Village GV-007 (NTSC) [07d0:0002]
|
||||
48 -> Dazzle Fusion Model DVC-50 Rev 1 (NTSC) [07d0:0003]
|
||||
49 -> Dazzle Fusion Model DVC-80 Rev 1 (PAL) [07d0:0004]
|
||||
50 -> Dazzle Fusion Model DVC-90 Rev 1 (SECAM) [07d0:0005]
|
||||
51 -> Eskape Labs MyTV2Go [07f8:9104]
|
||||
52 -> Pinnacle Studio PCTV USB (PAL) [2304:010d]
|
||||
53 -> Pinnacle Studio PCTV USB (SECAM) [2304:0109]
|
||||
54 -> Pinnacle Studio PCTV USB (PAL) FM [2304:0110]
|
||||
55 -> Miro PCTV USB [2304:0111]
|
||||
56 -> Pinnacle Studio PCTV USB (NTSC) FM [2304:0112]
|
||||
57 -> Pinnacle Studio PCTV USB (PAL) FM V2 [2304:0210]
|
||||
58 -> Pinnacle Studio PCTV USB (NTSC) FM V2 [2304:0212]
|
||||
59 -> Pinnacle Studio PCTV USB (PAL) FM V3 [2304:0214]
|
||||
60 -> Pinnacle Studio Linx Video input cable (NTSC) [2304:0300]
|
||||
61 -> Pinnacle Studio Linx Video input cable (PAL) [2304:0301]
|
||||
62 -> Pinnacle PCTV Bungee USB (PAL) FM [2304:0419]
|
||||
63 -> Hauppauge WinTv-USB [2400:4200]
|
@ -197,10 +197,10 @@ Use the ../../Maintainers file, particularly the VIDEO FOR LINUX and PARALLEL
|
||||
PORT SUPPORT sections
|
||||
|
||||
The video4linux page:
|
||||
http://roadrunner.swansea.linux.org.uk/v4l.shtml
|
||||
http://linuxtv.org
|
||||
|
||||
The video4linux2 page:
|
||||
http://millennium.diads.com/bdirks/v4l2.htm
|
||||
The V4L2 API spec:
|
||||
http://v4l2spec.bytesex.org/
|
||||
|
||||
Some web pages about the quickcams:
|
||||
http://www.dkfz-heidelberg.de/Macromol/wedemann/mini-HOWTO-cqcam.html
|
||||
|
187
Documentation/video4linux/README.ivtv
Normal file
187
Documentation/video4linux/README.ivtv
Normal file
@ -0,0 +1,187 @@
|
||||
|
||||
ivtv release notes
|
||||
==================
|
||||
|
||||
This is a v4l2 device driver for the Conexant cx23415/6 MPEG encoder/decoder.
|
||||
The cx23415 can do both encoding and decoding, the cx23416 can only do MPEG
|
||||
encoding. Currently the only card featuring full decoding support is the
|
||||
Hauppauge PVR-350.
|
||||
|
||||
NOTE: this driver requires the latest encoder firmware (version 2.06.039, size
|
||||
376836 bytes). Get the firmware from here:
|
||||
|
||||
http://dl.ivtvdriver.org/ivtv/firmware/firmware.tar.gz
|
||||
|
||||
NOTE: 'normal' TV applications do not work with this driver, you need
|
||||
an application that can handle MPEG input such as mplayer, xine, MythTV,
|
||||
etc.
|
||||
|
||||
The primary goal of the IVTV project is to provide a "clean room" Linux
|
||||
Open Source driver implementation for video capture cards based on the
|
||||
iCompression iTVC15 or Conexant CX23415/CX23416 MPEG Codec.
|
||||
|
||||
Features:
|
||||
* Hardware mpeg2 capture of broadcast video (and sound) via the tuner or
|
||||
S-Video/Composite and audio line-in.
|
||||
* Hardware mpeg2 capture of FM radio where hardware support exists
|
||||
* Supports NTSC, PAL, SECAM with stereo sound
|
||||
* Supports SAP and bilingual transmissions.
|
||||
* Supports raw VBI (closed captions and teletext).
|
||||
* Supports sliced VBI (closed captions and teletext) and is able to insert
|
||||
this into the captured MPEG stream.
|
||||
* Supports raw YUV and PCM input.
|
||||
|
||||
Additional features for the PVR-350 (CX23415 based):
|
||||
* Provides hardware mpeg2 playback
|
||||
* Provides comprehensive OSD (On Screen Display: ie. graphics overlaying the
|
||||
video signal)
|
||||
* Provides a framebuffer (allowing X applications to appear on the video
|
||||
device) (this framebuffer is not yet part of the kernel. In the meantime it
|
||||
is available from www.ivtvdriver.org).
|
||||
* Supports raw YUV output.
|
||||
|
||||
IMPORTANT: In case of problems first read this page:
|
||||
http://www.ivtvdriver.org/index.php/Troubleshooting
|
||||
|
||||
See also:
|
||||
|
||||
Homepage + Wiki
|
||||
http://www.ivtvdriver.org
|
||||
|
||||
IRC
|
||||
irc://irc.freenode.net/ivtv-dev
|
||||
|
||||
----------------------------------------------------------
|
||||
|
||||
Devices
|
||||
=======
|
||||
|
||||
A maximum of 12 ivtv boards are allowed at the moment.
|
||||
|
||||
Cards that don't have a video output capability (i.e. non PVR350 cards)
|
||||
lack the vbi8, vbi16, video16 and video48 devices. They also do not
|
||||
support the framebuffer device /dev/fbx for OSD.
|
||||
|
||||
The radio0 device may or may not be present, depending on whether the
|
||||
card has a radio tuner or not.
|
||||
|
||||
Here is a list of the base v4l devices:
|
||||
crw-rw---- 1 root video 81, 0 Jun 19 22:22 /dev/video0
|
||||
crw-rw---- 1 root video 81, 16 Jun 19 22:22 /dev/video16
|
||||
crw-rw---- 1 root video 81, 24 Jun 19 22:22 /dev/video24
|
||||
crw-rw---- 1 root video 81, 32 Jun 19 22:22 /dev/video32
|
||||
crw-rw---- 1 root video 81, 48 Jun 19 22:22 /dev/video48
|
||||
crw-rw---- 1 root video 81, 64 Jun 19 22:22 /dev/radio0
|
||||
crw-rw---- 1 root video 81, 224 Jun 19 22:22 /dev/vbi0
|
||||
crw-rw---- 1 root video 81, 228 Jun 19 22:22 /dev/vbi8
|
||||
crw-rw---- 1 root video 81, 232 Jun 19 22:22 /dev/vbi16
|
||||
|
||||
Base devices
|
||||
============
|
||||
|
||||
For every extra card you have the numbers increased by one. For example,
|
||||
/dev/video0 is listed as the 'base' encoding capture device so we have:
|
||||
|
||||
/dev/video0 is the encoding capture device for the first card (card 0)
|
||||
/dev/video1 is the encoding capture device for the second card (card 1)
|
||||
/dev/video2 is the encoding capture device for the third card (card 2)
|
||||
|
||||
Note that if the first card doesn't have a feature (eg no decoder, so no
|
||||
video16, the second card will still use video17. The simple rule is 'add
|
||||
the card number to the base device number'. If you have other capture
|
||||
cards (e.g. WinTV PCI) that are detected first, then you have to tell
|
||||
the ivtv module about it so that it will start counting at 1 (or 2, or
|
||||
whatever). Otherwise the device numbers can get confusing. The ivtv
|
||||
'ivtv_first_minor' module option can be used for that.
|
||||
|
||||
|
||||
/dev/video0
|
||||
The encoding capture device(s).
|
||||
Read-only.
|
||||
|
||||
Reading from this device gets you the MPEG1/2 program stream.
|
||||
Example:
|
||||
|
||||
cat /dev/video0 > my.mpg (you need to hit ctrl-c to exit)
|
||||
|
||||
|
||||
/dev/video16
|
||||
The decoder output device(s)
|
||||
Write-only. Only present if the MPEG decoder (i.e. CX23415) exists.
|
||||
|
||||
An mpeg2 stream sent to this device will appear on the selected video
|
||||
display, audio will appear on the line-out/audio out. It is only
|
||||
available for cards that support video out. Example:
|
||||
|
||||
cat my.mpg >/dev/video16
|
||||
|
||||
|
||||
/dev/video24
|
||||
The raw audio capture device(s).
|
||||
Read-only
|
||||
|
||||
The raw audio PCM stereo stream from the currently selected
|
||||
tuner or audio line-in. Reading from this device results in a raw
|
||||
(signed 16 bit Little Endian, 48000 Hz, stereo pcm) capture.
|
||||
This device only captures audio. This should be replaced by an ALSA
|
||||
device in the future.
|
||||
Note that there is no corresponding raw audio output device, this is
|
||||
not supported in the decoder firmware.
|
||||
|
||||
|
||||
/dev/video32
|
||||
The raw video capture device(s)
|
||||
Read-only
|
||||
|
||||
The raw YUV video output from the current video input. The YUV format
|
||||
is non-standard (V4L2_PIX_FMT_HM12).
|
||||
|
||||
Note that the YUV and PCM streams are not synchronized, so they are of
|
||||
limited use.
|
||||
|
||||
|
||||
/dev/video48
|
||||
The raw video display device(s)
|
||||
Write-only. Only present if the MPEG decoder (i.e. CX23415) exists.
|
||||
|
||||
Writes a YUV stream to the decoder of the card.
|
||||
|
||||
|
||||
/dev/radio0
|
||||
The radio tuner device(s)
|
||||
Cannot be read or written.
|
||||
|
||||
Used to enable the radio tuner and tune to a frequency. You cannot
|
||||
read or write audio streams with this device. Once you use this
|
||||
device to tune the radio, use /dev/video24 to read the raw pcm stream
|
||||
or /dev/video0 to get an mpeg2 stream with black video.
|
||||
|
||||
|
||||
/dev/vbi0
|
||||
The 'vertical blank interval' (Teletext, CC, WSS etc) capture device(s)
|
||||
Read-only
|
||||
|
||||
Captures the raw (or sliced) video data sent during the Vertical Blank
|
||||
Interval. This data is used to encode teletext, closed captions, VPS,
|
||||
widescreen signalling, electronic program guide information, and other
|
||||
services.
|
||||
|
||||
|
||||
/dev/vbi8
|
||||
Processed vbi feedback device(s)
|
||||
Read-only. Only present if the MPEG decoder (i.e. CX23415) exists.
|
||||
|
||||
The sliced VBI data embedded in an MPEG stream is reproduced on this
|
||||
device. So while playing back a recording on /dev/video16, you can
|
||||
read the embedded VBI data from /dev/vbi8.
|
||||
|
||||
|
||||
/dev/vbi16
|
||||
The vbi 'display' device(s)
|
||||
Write-only. Only present if the MPEG decoder (i.e. CX23415) exists.
|
||||
|
||||
Can be used to send sliced VBI data to the video-out connector.
|
||||
|
||||
---------------------------------
|
||||
|
||||
Hans Verkuil <hverkuil@xs4all.nl>
|
@ -339,9 +339,9 @@ Information - video4linux/mjpeg extensions:
|
||||
(also see below)
|
||||
|
||||
Information - video4linux2:
|
||||
http://www.thedirks.org/v4l2/
|
||||
http://linuxtv.org
|
||||
http://v4l2spec.bytesex.org/
|
||||
/usr/include/linux/videodev2.h
|
||||
http://www.bytesex.org/v4l/
|
||||
|
||||
More information on the video4linux/mjpeg extensions, by Serguei
|
||||
Miridonovi and Rainer Johanni:
|
||||
|
@ -57,7 +57,7 @@ bttv.o
|
||||
i2c_udelay= Allow reduce I2C speed. Default is 5 usecs
|
||||
(meaning 66,67 Kbps). The default is the
|
||||
maximum supported speed by kernel bitbang
|
||||
algoritm. You may use lower numbers, if I2C
|
||||
algorithm. You may use lower numbers, if I2C
|
||||
messages are lost (16 is known to work on
|
||||
all supported cards).
|
||||
|
||||
|
@ -21,7 +21,7 @@ Param[0]
|
||||
0 based frame number in GOP to begin playback from.
|
||||
Param[1]
|
||||
Specifies the number of muted audio frames to play before normal
|
||||
audio resumes.
|
||||
audio resumes. (This is not implemented in the firmware, leave at 0)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@ -32,6 +32,10 @@ Description
|
||||
playback stops at specified PTS.
|
||||
Param[0]
|
||||
Display 0=last frame, 1=black
|
||||
Note: this takes effect immediately, so if you want to wait for a PTS,
|
||||
then use '0', otherwise the screen goes to black at once.
|
||||
You can call this later (even if there is no playback) with a 1 value
|
||||
to set the screen to black.
|
||||
Param[1]
|
||||
PTS low
|
||||
Param[2]
|
||||
@ -60,8 +64,12 @@ Param[0]
|
||||
31 Speed:
|
||||
'0' slow
|
||||
'1' fast
|
||||
Note: n is limited to 2. Anything higher does not result in
|
||||
faster playback. Instead the host should start dropping frames.
|
||||
Param[1]
|
||||
Direction: 0=forward, 1=reverse
|
||||
Note: to make reverse playback work you have to write full GOPs in
|
||||
reverse order.
|
||||
Param[2]
|
||||
Picture mask:
|
||||
1=I frames
|
||||
@ -69,13 +77,16 @@ Param[2]
|
||||
7=I, P, B frames
|
||||
Param[3]
|
||||
B frames per GOP (for reverse play only)
|
||||
Note: for reverse playback the Picture Mask should be set to I or I, P.
|
||||
Adding B frames to the mask will result in corrupt video. This field
|
||||
has to be set to the correct value in order to keep the timing correct.
|
||||
Param[4]
|
||||
Mute audio: 0=disable, 1=enable
|
||||
Param[5]
|
||||
Display 0=frame, 1=field
|
||||
Param[6]
|
||||
Specifies the number of muted audio frames to play before normal audio
|
||||
resumes.
|
||||
resumes. (Not implemented in the firmware, leave at 0)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@ -212,6 +223,7 @@ Description
|
||||
Select audio mode
|
||||
Param[0]
|
||||
Dual mono mode action
|
||||
0=Stereo, 1=Left, 2=Right, 3=Mono, 4=Swap, -1=Unchanged
|
||||
Param[1]
|
||||
Stereo mode action:
|
||||
0=Stereo, 1=Left, 2=Right, 3=Mono, 4=Swap, -1=Unchanged
|
||||
@ -224,7 +236,10 @@ Description
|
||||
Setup firmware to notify the host about a particular event.
|
||||
Counterpart to API 0xD5
|
||||
Param[0]
|
||||
Event: 0=Audio mode change between stereo and dual channel
|
||||
Event: 0=Audio mode change between mono, (joint) stereo and dual channel.
|
||||
Event: 3=Decoder started
|
||||
Event: 4=Unknown: goes off 10-15 times per second while decoding.
|
||||
Event: 5=Some sync event: goes off once per frame.
|
||||
Param[1]
|
||||
Notification 0=disabled, 1=enabled
|
||||
Param[2]
|
||||
@ -273,43 +288,6 @@ Param[3]
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Name CX2341X_DEC_SET_AUDIO_OUTPUT
|
||||
Enum 27/0x1B
|
||||
Description
|
||||
Select audio output format
|
||||
Param[0]
|
||||
Bitmask:
|
||||
0:1 Data size:
|
||||
'00' 16 bit
|
||||
'01' 20 bit
|
||||
'10' 24 bit
|
||||
2:7 Unused
|
||||
8:9 Mode:
|
||||
'00' 2 channels
|
||||
'01' 4 channels
|
||||
'10' 6 channels
|
||||
'11' 6 channels with one line data mode
|
||||
(for left justified MSB first mode, 20 bit only)
|
||||
10:11 Unused
|
||||
12:13 Channel format:
|
||||
'00' right justified MSB first mode
|
||||
'01' left justified MSB first mode
|
||||
'10' I2S mode
|
||||
14:15 Unused
|
||||
16:21 Right justify bit count
|
||||
22:31 Unused
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Name CX2341X_DEC_SET_AV_DELAY
|
||||
Enum 28/0x1C
|
||||
Description
|
||||
Set audio/video delay in 90Khz ticks
|
||||
Param[0]
|
||||
0=A/V in sync, negative=audio lags, positive=video lags
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Name CX2341X_DEC_SET_PREBUFFERING
|
||||
Enum 30/0x1E
|
||||
Description
|
||||
|
817
Documentation/video4linux/cx2341x/fw-decoder-regs.txt
Normal file
817
Documentation/video4linux/cx2341x/fw-decoder-regs.txt
Normal file
@ -0,0 +1,817 @@
|
||||
PVR350 Video decoder registers 0x02002800 -> 0x02002B00
|
||||
=======================================================
|
||||
|
||||
This list has been worked out through trial and error. There will be mistakes
|
||||
and omissions. Some registers have no obvious effect so it's hard to say what
|
||||
they do, while others interact with each other, or require a certain load
|
||||
sequence. Horizontal filter setup is one example, with six registers working
|
||||
in unison and requiring a certain load sequence to correctly configure. The
|
||||
indexed colour palette is much easier to set at just two registers, but again
|
||||
it requires a certain load sequence.
|
||||
|
||||
Some registers are fussy about what they are set to. Load in a bad value & the
|
||||
decoder will fail. A firmware reload will often recover, but sometimes a reset
|
||||
is required. For registers containing size information, setting them to 0 is
|
||||
generally a bad idea. For other control registers i.e. 2878, you'll only find
|
||||
out what values are bad when it hangs.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2800
|
||||
bit 0
|
||||
Decoder enable
|
||||
0 = disable
|
||||
1 = enable
|
||||
--------------------------------------------------------------------------------
|
||||
2804
|
||||
bits 0:31
|
||||
Decoder horizontal Y alias register 1
|
||||
---------------
|
||||
2808
|
||||
bits 0:31
|
||||
Decoder horizontal Y alias register 2
|
||||
---------------
|
||||
280C
|
||||
bits 0:31
|
||||
Decoder horizontal Y alias register 3
|
||||
---------------
|
||||
2810
|
||||
bits 0:31
|
||||
Decoder horizontal Y alias register 4
|
||||
---------------
|
||||
2814
|
||||
bits 0:31
|
||||
Decoder horizontal Y alias register 5
|
||||
---------------
|
||||
2818
|
||||
bits 0:31
|
||||
Decoder horizontal Y alias trigger
|
||||
|
||||
These six registers control the horizontal aliasing filter for the Y plane.
|
||||
The first five registers must all be loaded before accessing the trigger
|
||||
(2818), as this register actually clocks the data through for the first
|
||||
five.
|
||||
|
||||
To correctly program set the filter, this whole procedure must be done 16
|
||||
times. The actual register contents are copied from a lookup-table in the
|
||||
firmware which contains 4 different filter settings.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
281C
|
||||
bits 0:31
|
||||
Decoder horizontal UV alias register 1
|
||||
---------------
|
||||
2820
|
||||
bits 0:31
|
||||
Decoder horizontal UV alias register 2
|
||||
---------------
|
||||
2824
|
||||
bits 0:31
|
||||
Decoder horizontal UV alias register 3
|
||||
---------------
|
||||
2828
|
||||
bits 0:31
|
||||
Decoder horizontal UV alias register 4
|
||||
---------------
|
||||
282C
|
||||
bits 0:31
|
||||
Decoder horizontal UV alias register 5
|
||||
---------------
|
||||
2830
|
||||
bits 0:31
|
||||
Decoder horizontal UV alias trigger
|
||||
|
||||
These six registers control the horizontal aliasing for the UV plane.
|
||||
Operation is the same as the Y filter, with 2830 being the trigger
|
||||
register.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2834
|
||||
bits 0:15
|
||||
Decoder Y source width in pixels
|
||||
|
||||
bits 16:31
|
||||
Decoder Y destination width in pixels
|
||||
---------------
|
||||
2838
|
||||
bits 0:15
|
||||
Decoder UV source width in pixels
|
||||
|
||||
bits 16:31
|
||||
Decoder UV destination width in pixels
|
||||
|
||||
NOTE: For both registers, the resulting image must be fully visible on
|
||||
screen. If the image exceeds the right edge both the source and destination
|
||||
size must be adjusted to reflect the visible portion. For the source width,
|
||||
you must take into account the scaling when calculating the new value.
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
283C
|
||||
bits 0:31
|
||||
Decoder Y horizontal scaling
|
||||
Normally = Reg 2854 >> 2
|
||||
---------------
|
||||
2840
|
||||
bits 0:31
|
||||
Decoder ?? unknown - horizontal scaling
|
||||
Usually 0x00080514
|
||||
---------------
|
||||
2844
|
||||
bits 0:31
|
||||
Decoder UV horizontal scaling
|
||||
Normally = Reg 2854 >> 2
|
||||
---------------
|
||||
2848
|
||||
bits 0:31
|
||||
Decoder ?? unknown - horizontal scaling
|
||||
Usually 0x00100514
|
||||
---------------
|
||||
284C
|
||||
bits 0:31
|
||||
Decoder ?? unknown - Y plane
|
||||
Usually 0x00200020
|
||||
---------------
|
||||
2850
|
||||
bits 0:31
|
||||
Decoder ?? unknown - UV plane
|
||||
Usually 0x00200020
|
||||
---------------
|
||||
2854
|
||||
bits 0:31
|
||||
Decoder 'master' value for horizontal scaling
|
||||
---------------
|
||||
2858
|
||||
bits 0:31
|
||||
Decoder ?? unknown
|
||||
Usually 0
|
||||
---------------
|
||||
285C
|
||||
bits 0:31
|
||||
Decoder ?? unknown
|
||||
Normally = Reg 2854 >> 1
|
||||
---------------
|
||||
2860
|
||||
bits 0:31
|
||||
Decoder ?? unknown
|
||||
Usually 0
|
||||
---------------
|
||||
2864
|
||||
bits 0:31
|
||||
Decoder ?? unknown
|
||||
Normally = Reg 2854 >> 1
|
||||
---------------
|
||||
2868
|
||||
bits 0:31
|
||||
Decoder ?? unknown
|
||||
Usually 0
|
||||
|
||||
Most of these registers either control horizontal scaling, or appear linked
|
||||
to it in some way. Register 2854 contains the 'master' value & the other
|
||||
registers can be calculated from that one. You must also remember to
|
||||
correctly set the divider in Reg 2874.
|
||||
|
||||
To enlarge:
|
||||
Reg 2854 = (source_width * 0x00200000) / destination_width
|
||||
Reg 2874 = No divide
|
||||
|
||||
To reduce from full size down to half size:
|
||||
Reg 2854 = (source_width/2 * 0x00200000) / destination width
|
||||
Reg 2874 = Divide by 2
|
||||
|
||||
To reduce from half size down to quarter size:
|
||||
Reg 2854 = (source_width/4 * 0x00200000) / destination width
|
||||
Reg 2874 = Divide by 4
|
||||
|
||||
The result is always rounded up.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
286C
|
||||
bits 0:15
|
||||
Decoder horizontal Y buffer offset
|
||||
|
||||
bits 15:31
|
||||
Decoder horizontal UV buffer offset
|
||||
|
||||
Offset into the video image buffer. If the offset is gradually incremented,
|
||||
the on screen image will move left & wrap around higher up on the right.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2870
|
||||
bits 0:15
|
||||
Decoder horizontal Y output offset
|
||||
|
||||
bits 16:31
|
||||
Decoder horizontal UV output offset
|
||||
|
||||
Offsets the actual video output. Controls output alignment of the Y & UV
|
||||
planes. The higher the value, the greater the shift to the left. Use
|
||||
reg 2890 to move the image right.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2874
|
||||
bits 0:1
|
||||
Decoder horizontal Y output size divider
|
||||
00 = No divide
|
||||
01 = Divide by 2
|
||||
10 = Divide by 3
|
||||
|
||||
bits 4:5
|
||||
Decoder horizontal UV output size divider
|
||||
00 = No divide
|
||||
01 = Divide by 2
|
||||
10 = Divide by 3
|
||||
|
||||
bit 8
|
||||
Decoder ?? unknown
|
||||
0 = Normal
|
||||
1 = Affects video output levels
|
||||
|
||||
bit 16
|
||||
Decoder ?? unknown
|
||||
0 = Normal
|
||||
1 = Disable horizontal filter
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2878
|
||||
bit 0
|
||||
?? unknown
|
||||
|
||||
bit 1
|
||||
osd on/off
|
||||
0 = osd off
|
||||
1 = osd on
|
||||
|
||||
bit 2
|
||||
Decoder + osd video timing
|
||||
0 = NTSC
|
||||
1 = PAL
|
||||
|
||||
bits 3:4
|
||||
?? unknown
|
||||
|
||||
bit 5
|
||||
Decoder + osd
|
||||
Swaps upper & lower fields
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
287C
|
||||
bits 0:10
|
||||
Decoder & osd ?? unknown
|
||||
Moves entire screen horizontally. Starts at 0x005 with the screen
|
||||
shifted heavily to the right. Incrementing in steps of 0x004 will
|
||||
gradually shift the screen to the left.
|
||||
|
||||
bits 11:31
|
||||
?? unknown
|
||||
|
||||
Normally contents are 0x00101111 (NTSC) or 0x1010111d (PAL)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2880 -------- ?? unknown
|
||||
2884 -------- ?? unknown
|
||||
--------------------------------------------------------------------------------
|
||||
2888
|
||||
bit 0
|
||||
Decoder + osd ?? unknown
|
||||
0 = Normal
|
||||
1 = Misaligned fields (Correctable through 289C & 28A4)
|
||||
|
||||
bit 4
|
||||
?? unknown
|
||||
|
||||
bit 8
|
||||
?? unknown
|
||||
|
||||
Warning: Bad values will require a firmware reload to recover.
|
||||
Known to be bad are 0x000,0x011,0x100,0x111
|
||||
--------------------------------------------------------------------------------
|
||||
288C
|
||||
bits 0:15
|
||||
osd ?? unknown
|
||||
Appears to affect the osd position stability. The higher the value the
|
||||
more unstable it becomes. Decoder output remains stable.
|
||||
|
||||
bits 16:31
|
||||
osd ?? unknown
|
||||
Same as bits 0:15
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2890
|
||||
bits 0:11
|
||||
Decoder output horizontal offset.
|
||||
|
||||
Horizontal offset moves the video image right. A small left shift is
|
||||
possible, but it's better to use reg 2870 for that due to its greater
|
||||
range.
|
||||
|
||||
NOTE: Video corruption will occur if video window is shifted off the right
|
||||
edge. To avoid this read the notes for 2834 & 2838.
|
||||
--------------------------------------------------------------------------------
|
||||
2894
|
||||
bits 0:23
|
||||
Decoder output video surround colour.
|
||||
|
||||
Contains the colour (in yuv) used to fill the screen when the video is
|
||||
running in a window.
|
||||
--------------------------------------------------------------------------------
|
||||
2898
|
||||
bits 0:23
|
||||
Decoder video window colour
|
||||
Contains the colour (in yuv) used to fill the video window when the
|
||||
video is turned off.
|
||||
|
||||
bit 24
|
||||
Decoder video output
|
||||
0 = Video on
|
||||
1 = Video off
|
||||
|
||||
bit 28
|
||||
Decoder plane order
|
||||
0 = Y,UV
|
||||
1 = UV,Y
|
||||
|
||||
bit 29
|
||||
Decoder second plane byte order
|
||||
0 = Normal (UV)
|
||||
1 = Swapped (VU)
|
||||
|
||||
In normal usage, the first plane is Y & the second plane is UV. Though the
|
||||
order of the planes can be swapped, only the byte order of the second plane
|
||||
can be swapped. This isn't much use for the Y plane, but can be useful for
|
||||
the UV plane.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
289C
|
||||
bits 0:15
|
||||
Decoder vertical field offset 1
|
||||
|
||||
bits 16:31
|
||||
Decoder vertical field offset 2
|
||||
|
||||
Controls field output vertical alignment. The higher the number, the lower
|
||||
the image on screen. Known starting values are 0x011E0017 (NTSC) &
|
||||
0x01500017 (PAL)
|
||||
--------------------------------------------------------------------------------
|
||||
28A0
|
||||
bits 0:15
|
||||
Decoder & osd width in pixels
|
||||
|
||||
bits 16:31
|
||||
Decoder & osd height in pixels
|
||||
|
||||
All output from the decoder & osd are disabled beyond this area. Decoder
|
||||
output will simply go black outside of this region. If the osd tries to
|
||||
exceed this area it will become corrupt.
|
||||
--------------------------------------------------------------------------------
|
||||
28A4
|
||||
bits 0:11
|
||||
osd left shift.
|
||||
|
||||
Has a range of 0x770->0x7FF. With the exception of 0, any value outside of
|
||||
this range corrupts the osd.
|
||||
--------------------------------------------------------------------------------
|
||||
28A8
|
||||
bits 0:15
|
||||
osd vertical field offset 1
|
||||
|
||||
bits 16:31
|
||||
osd vertical field offset 2
|
||||
|
||||
Controls field output vertical alignment. The higher the number, the lower
|
||||
the image on screen. Known starting values are 0x011E0017 (NTSC) &
|
||||
0x01500017 (PAL)
|
||||
--------------------------------------------------------------------------------
|
||||
28AC -------- ?? unknown
|
||||
|
|
||||
V
|
||||
28BC -------- ?? unknown
|
||||
--------------------------------------------------------------------------------
|
||||
28C0
|
||||
bit 0
|
||||
Current output field
|
||||
0 = first field
|
||||
1 = second field
|
||||
|
||||
bits 16:31
|
||||
Current scanline
|
||||
The scanline counts from the top line of the first field
|
||||
through to the last line of the second field.
|
||||
--------------------------------------------------------------------------------
|
||||
28C4 -------- ?? unknown
|
||||
|
|
||||
V
|
||||
28F8 -------- ?? unknown
|
||||
--------------------------------------------------------------------------------
|
||||
28FC
|
||||
bit 0
|
||||
?? unknown
|
||||
0 = Normal
|
||||
1 = Breaks decoder & osd output
|
||||
--------------------------------------------------------------------------------
|
||||
2900
|
||||
bits 0:31
|
||||
Decoder vertical Y alias register 1
|
||||
---------------
|
||||
2904
|
||||
bits 0:31
|
||||
Decoder vertical Y alias register 2
|
||||
---------------
|
||||
2908
|
||||
bits 0:31
|
||||
Decoder vertical Y alias trigger
|
||||
|
||||
These three registers control the vertical aliasing filter for the Y plane.
|
||||
Operation is similar to the horizontal Y filter (2804). The only real
|
||||
difference is that there are only two registers to set before accessing
|
||||
the trigger register (2908). As for the horizontal filter, the values are
|
||||
taken from a lookup table in the firmware, and the procedure must be
|
||||
repeated 16 times to fully program the filter.
|
||||
--------------------------------------------------------------------------------
|
||||
290C
|
||||
bits 0:31
|
||||
Decoder vertical UV alias register 1
|
||||
---------------
|
||||
2910
|
||||
bits 0:31
|
||||
Decoder vertical UV alias register 2
|
||||
---------------
|
||||
2914
|
||||
bits 0:31
|
||||
Decoder vertical UV alias trigger
|
||||
|
||||
These three registers control the vertical aliasing filter for the UV
|
||||
plane. Operation is the same as the Y filter, with 2914 being the trigger.
|
||||
--------------------------------------------------------------------------------
|
||||
2918
|
||||
bits 0:15
|
||||
Decoder Y source height in pixels
|
||||
|
||||
bits 16:31
|
||||
Decoder Y destination height in pixels
|
||||
---------------
|
||||
291C
|
||||
bits 0:15
|
||||
Decoder UV source height in pixels divided by 2
|
||||
|
||||
bits 16:31
|
||||
Decoder UV destination height in pixels
|
||||
|
||||
NOTE: For both registers, the resulting image must be fully visible on
|
||||
screen. If the image exceeds the bottom edge both the source and
|
||||
destination size must be adjusted to reflect the visible portion. For the
|
||||
source height, you must take into account the scaling when calculating the
|
||||
new value.
|
||||
--------------------------------------------------------------------------------
|
||||
2920
|
||||
bits 0:31
|
||||
Decoder Y vertical scaling
|
||||
Normally = Reg 2930 >> 2
|
||||
---------------
|
||||
2924
|
||||
bits 0:31
|
||||
Decoder Y vertical scaling
|
||||
Normally = Reg 2920 + 0x514
|
||||
---------------
|
||||
2928
|
||||
bits 0:31
|
||||
Decoder UV vertical scaling
|
||||
When enlarging = Reg 2930 >> 2
|
||||
When reducing = Reg 2930 >> 3
|
||||
---------------
|
||||
292C
|
||||
bits 0:31
|
||||
Decoder UV vertical scaling
|
||||
Normally = Reg 2928 + 0x514
|
||||
---------------
|
||||
2930
|
||||
bits 0:31
|
||||
Decoder 'master' value for vertical scaling
|
||||
---------------
|
||||
2934
|
||||
bits 0:31
|
||||
Decoder ?? unknown - Y vertical scaling
|
||||
---------------
|
||||
2938
|
||||
bits 0:31
|
||||
Decoder Y vertical scaling
|
||||
Normally = Reg 2930
|
||||
---------------
|
||||
293C
|
||||
bits 0:31
|
||||
Decoder ?? unknown - Y vertical scaling
|
||||
---------------
|
||||
2940
|
||||
bits 0:31
|
||||
Decoder UV vertical scaling
|
||||
When enlarging = Reg 2930 >> 1
|
||||
When reducing = Reg 2930
|
||||
---------------
|
||||
2944
|
||||
bits 0:31
|
||||
Decoder ?? unknown - UV vertical scaling
|
||||
---------------
|
||||
2948
|
||||
bits 0:31
|
||||
Decoder UV vertical scaling
|
||||
Normally = Reg 2940
|
||||
---------------
|
||||
294C
|
||||
bits 0:31
|
||||
Decoder ?? unknown - UV vertical scaling
|
||||
|
||||
Most of these registers either control vertical scaling, or appear linked
|
||||
to it in some way. Register 2930 contains the 'master' value & all other
|
||||
registers can be calculated from that one. You must also remember to
|
||||
correctly set the divider in Reg 296C
|
||||
|
||||
To enlarge:
|
||||
Reg 2930 = (source_height * 0x00200000) / destination_height
|
||||
Reg 296C = No divide
|
||||
|
||||
To reduce from full size down to half size:
|
||||
Reg 2930 = (source_height/2 * 0x00200000) / destination height
|
||||
Reg 296C = Divide by 2
|
||||
|
||||
To reduce from half down to quarter.
|
||||
Reg 2930 = (source_height/4 * 0x00200000) / destination height
|
||||
Reg 296C = Divide by 4
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2950
|
||||
bits 0:15
|
||||
Decoder Y line index into display buffer, first field
|
||||
|
||||
bits 16:31
|
||||
Decoder Y vertical line skip, first field
|
||||
--------------------------------------------------------------------------------
|
||||
2954
|
||||
bits 0:15
|
||||
Decoder Y line index into display buffer, second field
|
||||
|
||||
bits 16:31
|
||||
Decoder Y vertical line skip, second field
|
||||
--------------------------------------------------------------------------------
|
||||
2958
|
||||
bits 0:15
|
||||
Decoder UV line index into display buffer, first field
|
||||
|
||||
bits 16:31
|
||||
Decoder UV vertical line skip, first field
|
||||
--------------------------------------------------------------------------------
|
||||
295C
|
||||
bits 0:15
|
||||
Decoder UV line index into display buffer, second field
|
||||
|
||||
bits 16:31
|
||||
Decoder UV vertical line skip, second field
|
||||
--------------------------------------------------------------------------------
|
||||
2960
|
||||
bits 0:15
|
||||
Decoder destination height minus 1
|
||||
|
||||
bits 16:31
|
||||
Decoder destination height divided by 2
|
||||
--------------------------------------------------------------------------------
|
||||
2964
|
||||
bits 0:15
|
||||
Decoder Y vertical offset, second field
|
||||
|
||||
bits 16:31
|
||||
Decoder Y vertical offset, first field
|
||||
|
||||
These two registers shift the Y plane up. The higher the number, the
|
||||
greater the shift.
|
||||
--------------------------------------------------------------------------------
|
||||
2968
|
||||
bits 0:15
|
||||
Decoder UV vertical offset, second field
|
||||
|
||||
bits 16:31
|
||||
Decoder UV vertical offset, first field
|
||||
|
||||
These two registers shift the UV plane up. The higher the number, the
|
||||
greater the shift.
|
||||
--------------------------------------------------------------------------------
|
||||
296C
|
||||
bits 0:1
|
||||
Decoder vertical Y output size divider
|
||||
00 = No divide
|
||||
01 = Divide by 2
|
||||
10 = Divide by 4
|
||||
|
||||
bits 8:9
|
||||
Decoder vertical UV output size divider
|
||||
00 = No divide
|
||||
01 = Divide by 2
|
||||
10 = Divide by 4
|
||||
--------------------------------------------------------------------------------
|
||||
2970
|
||||
bit 0
|
||||
Decoder ?? unknown
|
||||
0 = Normal
|
||||
1 = Affect video output levels
|
||||
|
||||
bit 16
|
||||
Decoder ?? unknown
|
||||
0 = Normal
|
||||
1 = Disable vertical filter
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
2974 -------- ?? unknown
|
||||
|
|
||||
V
|
||||
29EF -------- ?? unknown
|
||||
--------------------------------------------------------------------------------
|
||||
2A00
|
||||
bits 0:2
|
||||
osd colour mode
|
||||
000 = 8 bit indexed
|
||||
001 = 16 bit (565)
|
||||
010 = 15 bit (555)
|
||||
011 = 12 bit (444)
|
||||
100 = 32 bit (8888)
|
||||
|
||||
bits 4:5
|
||||
osd display bpp
|
||||
01 = 8 bit
|
||||
10 = 16 bit
|
||||
11 = 32 bit
|
||||
|
||||
bit 8
|
||||
osd global alpha
|
||||
0 = Off
|
||||
1 = On
|
||||
|
||||
bit 9
|
||||
osd local alpha
|
||||
0 = Off
|
||||
1 = On
|
||||
|
||||
bit 10
|
||||
osd colour key
|
||||
0 = Off
|
||||
1 = On
|
||||
|
||||
bit 11
|
||||
osd ?? unknown
|
||||
Must be 1
|
||||
|
||||
bit 13
|
||||
osd colour space
|
||||
0 = ARGB
|
||||
1 = AYVU
|
||||
|
||||
bits 16:31
|
||||
osd ?? unknown
|
||||
Must be 0x001B (some kind of buffer pointer ?)
|
||||
|
||||
When the bits-per-pixel is set to 8, the colour mode is ignored and
|
||||
assumed to be 8 bit indexed. For 16 & 32 bits-per-pixel the colour depth
|
||||
is honoured, and when using a colour depth that requires fewer bytes than
|
||||
allocated the extra bytes are used as padding. So for a 32 bpp with 8 bit
|
||||
index colour, there are 3 padding bytes per pixel. It's also possible to
|
||||
select 16bpp with a 32 bit colour mode. This results in the pixel width
|
||||
being doubled, but the color key will not work as expected in this mode.
|
||||
|
||||
Colour key is as it suggests. You designate a colour which will become
|
||||
completely transparent. When using 565, 555 or 444 colour modes, the
|
||||
colour key is always 16 bits wide. The colour to key on is set in Reg 2A18.
|
||||
|
||||
Local alpha works differently depending on the colour mode. For 32bpp & 8
|
||||
bit indexed, local alpha is a per-pixel 256 step transparency, with 0 being
|
||||
transparent and 255 being solid. For the 16bpp modes 555 & 444, the unused
|
||||
bit(s) act as a simple transparency switch, with 0 being solid & 1 being
|
||||
fully transparent. There is no local alpha support for 16bit 565.
|
||||
|
||||
Global alpha is a 256 step transparency that applies to the entire osd,
|
||||
with 0 being transparent & 255 being solid.
|
||||
|
||||
It's possible to combine colour key, local alpha & global alpha.
|
||||
--------------------------------------------------------------------------------
|
||||
2A04
|
||||
bits 0:15
|
||||
osd x coord for left edge
|
||||
|
||||
bits 16:31
|
||||
osd y coord for top edge
|
||||
---------------
|
||||
2A08
|
||||
bits 0:15
|
||||
osd x coord for right edge
|
||||
|
||||
bits 16:31
|
||||
osd y coord for bottom edge
|
||||
|
||||
For both registers, (0,0) = top left corner of the display area. These
|
||||
registers do not control the osd size, only where it's positioned & how
|
||||
much is visible. The visible osd area cannot exceed the right edge of the
|
||||
display, otherwise the osd will become corrupt. See reg 2A10 for
|
||||
setting osd width.
|
||||
--------------------------------------------------------------------------------
|
||||
2A0C
|
||||
bits 0:31
|
||||
osd buffer index
|
||||
|
||||
An index into the osd buffer. Slowly incrementing this moves the osd left,
|
||||
wrapping around onto the right edge
|
||||
--------------------------------------------------------------------------------
|
||||
2A10
|
||||
bits 0:11
|
||||
osd buffer 32 bit word width
|
||||
|
||||
Contains the width of the osd measured in 32 bit words. This means that all
|
||||
colour modes are restricted to a byte width which is divisible by 4.
|
||||
--------------------------------------------------------------------------------
|
||||
2A14
|
||||
bits 0:15
|
||||
osd height in pixels
|
||||
|
||||
bits 16:32
|
||||
osd line index into buffer
|
||||
osd will start displaying from this line.
|
||||
--------------------------------------------------------------------------------
|
||||
2A18
|
||||
bits 0:31
|
||||
osd colour key
|
||||
|
||||
Contains the colour value which will be transparent.
|
||||
--------------------------------------------------------------------------------
|
||||
2A1C
|
||||
bits 0:7
|
||||
osd global alpha
|
||||
|
||||
Contains the global alpha value (equiv ivtvfbctl --alpha XX)
|
||||
--------------------------------------------------------------------------------
|
||||
2A20 -------- ?? unknown
|
||||
|
|
||||
V
|
||||
2A2C -------- ?? unknown
|
||||
--------------------------------------------------------------------------------
|
||||
2A30
|
||||
bits 0:7
|
||||
osd colour to change in indexed palette
|
||||
---------------
|
||||
2A34
|
||||
bits 0:31
|
||||
osd colour for indexed palette
|
||||
|
||||
To set the new palette, first load the index of the colour to change into
|
||||
2A30, then load the new colour into 2A34. The full palette is 256 colours,
|
||||
so the index range is 0x00-0xFF
|
||||
--------------------------------------------------------------------------------
|
||||
2A38 -------- ?? unknown
|
||||
2A3C -------- ?? unknown
|
||||
--------------------------------------------------------------------------------
|
||||
2A40
|
||||
bits 0:31
|
||||
osd ?? unknown
|
||||
|
||||
Affects overall brightness, wrapping around to black
|
||||
--------------------------------------------------------------------------------
|
||||
2A44
|
||||
bits 0:31
|
||||
osd ?? unknown
|
||||
|
||||
Green tint
|
||||
--------------------------------------------------------------------------------
|
||||
2A48
|
||||
bits 0:31
|
||||
osd ?? unknown
|
||||
|
||||
Red tint
|
||||
--------------------------------------------------------------------------------
|
||||
2A4C
|
||||
bits 0:31
|
||||
osd ?? unknown
|
||||
|
||||
Affects overall brightness, wrapping around to black
|
||||
--------------------------------------------------------------------------------
|
||||
2A50
|
||||
bits 0:31
|
||||
osd ?? unknown
|
||||
|
||||
Colour shift
|
||||
--------------------------------------------------------------------------------
|
||||
2A54
|
||||
bits 0:31
|
||||
osd ?? unknown
|
||||
|
||||
Colour shift
|
||||
--------------------------------------------------------------------------------
|
||||
2A58 -------- ?? unknown
|
||||
|
|
||||
V
|
||||
2AFC -------- ?? unknown
|
||||
--------------------------------------------------------------------------------
|
||||
2B00
|
||||
bit 0
|
||||
osd filter control
|
||||
0 = filter off
|
||||
1 = filter on
|
||||
|
||||
bits 1:4
|
||||
osd ?? unknown
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
v0.4 - 12 March 2007 - Ian Armstrong (ian@iarmst.demon.co.uk)
|
||||
|
@ -22,6 +22,8 @@ urged to choose a smaller block size and learn the scatter-gather technique.
|
||||
|
||||
Mailbox #10 is reserved for DMA transfer information.
|
||||
|
||||
Note: the hardware expects little-endian data ('intel format').
|
||||
|
||||
Flow
|
||||
====
|
||||
|
||||
@ -64,7 +66,7 @@ addresses are the physical memory location of the target DMA buffer.
|
||||
|
||||
Each S-G array element is a struct of three 32-bit words. The first word is
|
||||
the source address, the second is the destination address. Both take up the
|
||||
entire 32 bits. The lowest 16 bits of the third word is the transfer byte
|
||||
entire 32 bits. The lowest 18 bits of the third word is the transfer byte
|
||||
count. The high-bit of the third word is the "last" flag. The last-flag tells
|
||||
the card to raise the DMA_DONE interrupt. From hard personal experience, if
|
||||
you forget to set this bit, the card will still "work" but the stream will
|
||||
@ -78,8 +80,8 @@ Array Element:
|
||||
|
||||
- 32-bit Source Address
|
||||
- 32-bit Destination Address
|
||||
- 16-bit reserved (high bit is the last flag)
|
||||
- 16-bit byte count
|
||||
- 14-bit reserved (high bit is the last flag)
|
||||
- 18-bit byte count
|
||||
|
||||
DMA Transfer Status
|
||||
===================
|
||||
@ -87,8 +89,8 @@ DMA Transfer Status
|
||||
Register 0x0004 holds the DMA Transfer Status:
|
||||
|
||||
Bit
|
||||
4 Scatter-Gather array error
|
||||
3 DMA write error
|
||||
2 DMA read error
|
||||
1 write completed
|
||||
0 read completed
|
||||
1 write completed
|
||||
2 DMA read error
|
||||
3 DMA write error
|
||||
4 Scatter-Gather array error
|
||||
|
@ -213,16 +213,6 @@ Param[1]
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Name CX2341X_ENC_SET_3_2_PULLDOWN
|
||||
Enum 177/0xB1
|
||||
Description
|
||||
3:2 pulldown properties
|
||||
Param[0]
|
||||
0=enabled
|
||||
1=disabled
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Name CX2341X_ENC_SET_VBI_LINE
|
||||
Enum 183/0xB7
|
||||
Description
|
||||
@ -332,9 +322,7 @@ Param[0]
|
||||
'01'=JointStereo
|
||||
'10'=Dual
|
||||
'11'=Mono
|
||||
Note: testing seems to indicate that Mono and possibly
|
||||
JointStereo are not working (default to stereo).
|
||||
Dual does work, though.
|
||||
Note: the cx23415 cannot decode Joint Stereo properly.
|
||||
|
||||
10:11 Mode Extension used in joint_stereo mode.
|
||||
In Layer I and II they indicate which subbands are in
|
||||
@ -413,16 +401,34 @@ Name CX2341X_ENC_SET_PGM_INDEX_INFO
|
||||
Enum 199/0xC7
|
||||
Description
|
||||
Sets the Program Index Information.
|
||||
The information is stored as follows:
|
||||
|
||||
struct info {
|
||||
u32 length; // Length of this frame
|
||||
u32 offset_low; // Offset in the file of the
|
||||
u32 offset_high; // start of this frame
|
||||
u32 mask1; // Bits 0-1 are the type mask:
|
||||
// 1=I, 2=P, 4=B
|
||||
u32 pts; // The PTS of the frame
|
||||
u32 mask2; // Bit 0 is bit 32 of the pts.
|
||||
};
|
||||
u32 table_ptr;
|
||||
struct info index[400];
|
||||
|
||||
The table_ptr is the encoder memory address in the table were
|
||||
*new* entries will be written. Note that this is a ringbuffer,
|
||||
so the table_ptr will wraparound.
|
||||
Param[0]
|
||||
Picture Mask:
|
||||
0=No index capture
|
||||
1=I frames
|
||||
3=I,P frames
|
||||
7=I,P,B frames
|
||||
(Seems to be ignored, it always indexes I, P and B frames)
|
||||
Param[1]
|
||||
Elements requested (up to 400)
|
||||
Result[0]
|
||||
Offset in SDF memory of the table.
|
||||
Offset in the encoder memory of the start of the table.
|
||||
Result[1]
|
||||
Number of allocated elements up to a maximum of Param[1]
|
||||
|
||||
@ -492,12 +498,14 @@ Name CX2341X_ENC_GET_PREV_DMA_INFO_MB_9
|
||||
Enum 203/0xCB
|
||||
Description
|
||||
Returns information on the previous DMA transfer in conjunction with
|
||||
bit 27 of the interrupt mask. Uses mailbox 9.
|
||||
bit 27 or 18 of the interrupt mask. Uses mailbox 9.
|
||||
Result[0]
|
||||
Status bits:
|
||||
Bit 0 set indicates transfer complete
|
||||
Bit 2 set indicates transfer error
|
||||
Bit 4 set indicates linked list error
|
||||
0 read completed
|
||||
1 write completed
|
||||
2 DMA read error
|
||||
3 DMA write error
|
||||
4 Scatter-Gather array error
|
||||
Result[1]
|
||||
DMA type
|
||||
Result[2]
|
||||
@ -655,12 +663,13 @@ Param[0]
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Name CX2341X_ENC_UNKNOWN
|
||||
Name CX2341X_ENC_SET_VERT_CROP_LINE
|
||||
Enum 219/0xDB
|
||||
Description
|
||||
Unknown API, it's used by Hauppauge though.
|
||||
Something to do with 'Vertical Crop Line'
|
||||
Param[0]
|
||||
0 This is the value Hauppauge uses, Unknown what it means.
|
||||
If saa7114 and raw VBI capture and 60 Hz, then set to 10001.
|
||||
Else 0.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@ -672,21 +681,25 @@ Description
|
||||
the value.
|
||||
Param[0]
|
||||
Command number:
|
||||
1=set initial SCR value when starting encoding.
|
||||
1=set initial SCR value when starting encoding (works).
|
||||
2=set quality mode (apparently some test setting).
|
||||
3=setup advanced VIM protection handling (supposedly only for the cx23416
|
||||
for raw YUV).
|
||||
Actually it looks like this should be 0 for saa7114/5 based card and 1
|
||||
for cx25840 based cards.
|
||||
4=generate artificial PTS timestamps
|
||||
3=setup advanced VIM protection handling.
|
||||
Always 1 for the cx23416 and 0 for cx23415.
|
||||
4=generate DVD compatible PTS timestamps
|
||||
5=USB flush mode
|
||||
6=something to do with the quantization matrix
|
||||
7=set navigation pack insertion for DVD
|
||||
7=set navigation pack insertion for DVD: adds 0xbf (private stream 2)
|
||||
packets to the MPEG. The size of these packets is 2048 bytes (including
|
||||
the header of 6 bytes: 0x000001bf + length). The payload is zeroed and
|
||||
it is up to the application to fill them in. These packets are apparently
|
||||
inserted every four frames.
|
||||
8=enable scene change detection (seems to be a failure)
|
||||
9=set history parameters of the video input module
|
||||
10=set input field order of VIM
|
||||
11=set quantization matrix
|
||||
12=reset audio interface
|
||||
12=reset audio interface after channel change or input switch (has no argument).
|
||||
Needed for the cx2584x, not needed for the mspx4xx, but it doesn't seem to
|
||||
do any harm calling it regardless.
|
||||
13=set audio volume delay
|
||||
14=set audio delay
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
This document describes the cx2341x memory map and documents some of the register
|
||||
space.
|
||||
|
||||
Note: the memory long words are little-endian ('intel format').
|
||||
|
||||
Warning! This information was figured out from searching through the memory and
|
||||
registers, this information may not be correct and is certainly not complete, and
|
||||
was not derived from anything more than searching through the memory space with
|
||||
@ -67,7 +69,7 @@ DMA Registers 0x000-0xff:
|
||||
0x84 - first write linked list reg, for pci memory addr
|
||||
0x88 - first write linked list reg, for length of buffer in memory addr
|
||||
(|0x80000000 or this for last link)
|
||||
0x8c-0xcc - rest of write linked list reg, 8 sets of 3 total, DMA goes here
|
||||
0x8c-0xdc - rest of write linked list reg, 8 sets of 3 total, DMA goes here
|
||||
from linked list addr in reg 0x0c, firmware must push through or
|
||||
something.
|
||||
0xe0 - first (and only) read linked list reg, for pci memory addr
|
||||
@ -123,12 +125,8 @@ Bit
|
||||
29 Encoder VBI capture
|
||||
28 Encoder Video Input Module reset event
|
||||
27 Encoder DMA complete
|
||||
26
|
||||
25 Decoder copy protect detection event
|
||||
24 Decoder audio mode change detection event
|
||||
23
|
||||
24 Decoder audio mode change detection event (through event notification)
|
||||
22 Decoder data request
|
||||
21 Decoder I-Frame? done
|
||||
20 Decoder DMA complete
|
||||
19 Decoder VBI re-insertion
|
||||
18 Decoder DMA err (linked-list bad)
|
||||
|
@ -21,7 +21,11 @@ Enum 66/0x42
|
||||
Description
|
||||
Query OSD format
|
||||
Result[0]
|
||||
0=8bit index, 4=AlphaRGB 8:8:8:8
|
||||
0=8bit index
|
||||
1=16bit RGB 5:6:5
|
||||
2=16bit ARGB 1:5:5:5
|
||||
3=16bit ARGB 1:4:4:4
|
||||
4=32bit ARGB 8:8:8:8
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@ -30,7 +34,11 @@ Enum 67/0x43
|
||||
Description
|
||||
Assign pixel format
|
||||
Param[0]
|
||||
0=8bit index, 4=AlphaRGB 8:8:8:8
|
||||
0=8bit index
|
||||
1=16bit RGB 5:6:5
|
||||
2=16bit ARGB 1:5:5:5
|
||||
3=16bit ARGB 1:4:4:4
|
||||
4=32bit ARGB 8:8:8:8
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
@ -23,7 +23,7 @@ Index
|
||||
|
||||
1. Copyright
|
||||
============
|
||||
Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
||||
|
||||
2. Disclaimer
|
||||
@ -135,8 +135,9 @@ And finally:
|
||||
6. Module loading
|
||||
=================
|
||||
To use the driver, it is necessary to load the "et61x251" module into memory
|
||||
after every other module required: "videodev", "usbcore" and, depending on
|
||||
the USB host controller you have, "ehci-hcd", "uhci-hcd" or "ohci-hcd".
|
||||
after every other module required: "videodev", "v4l2_common", "compat_ioctl32",
|
||||
"usbcore" and, depending on the USB host controller you have, "ehci-hcd",
|
||||
"uhci-hcd" or "ohci-hcd".
|
||||
|
||||
Loading can be done as shown below:
|
||||
|
||||
|
@ -5,10 +5,9 @@ Vaio Picturebook Motion Eye Camera Driver Readme
|
||||
Copyright (C) 2000 Andrew Tridgell <tridge@samba.org>
|
||||
|
||||
This driver enable the use of video4linux compatible applications with the
|
||||
Motion Eye camera. This driver requires the "Sony Vaio Programmable I/O
|
||||
Control Device" driver (which can be found in the "Character drivers"
|
||||
section of the kernel configuration utility) to be compiled and installed
|
||||
(using its "camera=1" parameter).
|
||||
Motion Eye camera. This driver requires the "Sony Laptop Extras" driver (which
|
||||
can be found in the "Misc devices" section of the kernel configuration utility)
|
||||
to be compiled and installed (using its "camera=1" parameter).
|
||||
|
||||
It can do at maximum 30 fps @ 320x240 or 15 fps @ 640x480.
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
SN9C10x PC Camera Controllers
|
||||
SN9C1xx PC Camera Controllers
|
||||
Driver for Linux
|
||||
=============================
|
||||
|
||||
@ -25,7 +25,7 @@ Index
|
||||
|
||||
1. Copyright
|
||||
============
|
||||
Copyright (C) 2004-2006 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
Copyright (C) 2004-2007 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
||||
|
||||
2. Disclaimer
|
||||
@ -53,20 +53,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
4. Overview and features
|
||||
========================
|
||||
This driver attempts to support the video interface of the devices mounting the
|
||||
SONiX SN9C101, SN9C102 and SN9C103 PC Camera Controllers.
|
||||
|
||||
It's worth to note that SONiX has never collaborated with the author during the
|
||||
development of this project, despite several requests for enough detailed
|
||||
specifications of the register tables, compression engine and video data format
|
||||
of the above chips. Nevertheless, these informations are no longer necessary,
|
||||
because all the aspects related to these chips are known and have been
|
||||
described in detail in this documentation.
|
||||
This driver attempts to support the video interface of the devices assembling
|
||||
the SONiX SN9C101, SN9C102, SN9C103, SN9C105 and SN9C120 PC Camera Controllers
|
||||
("SN9C1xx" from now on).
|
||||
|
||||
The driver relies on the Video4Linux2 and USB core modules. It has been
|
||||
designed to run properly on SMP systems as well.
|
||||
|
||||
The latest version of the SN9C10x driver can be found at the following URL:
|
||||
The latest version of the SN9C1xx driver can be found at the following URL:
|
||||
http://www.linux-projects.org/
|
||||
|
||||
Some of the features of the driver are:
|
||||
@ -85,11 +79,11 @@ Some of the features of the driver are:
|
||||
high compression quality (see also "Notes for V4L2 application developers"
|
||||
and "Video frame formats" paragraphs);
|
||||
- full support for the capabilities of many of the possible image sensors that
|
||||
can be connected to the SN9C10x bridges, including, for instance, red, green,
|
||||
can be connected to the SN9C1xx bridges, including, for instance, red, green,
|
||||
blue and global gain adjustments and exposure (see "Supported devices"
|
||||
paragraph for details);
|
||||
- use of default color settings for sunlight conditions;
|
||||
- dynamic I/O interface for both SN9C10x and image sensor control and
|
||||
- dynamic I/O interface for both SN9C1xx and image sensor control and
|
||||
monitoring (see "Optional device control through 'sysfs'" paragraph);
|
||||
- dynamic driver control thanks to various module parameters (see "Module
|
||||
parameters" paragraph);
|
||||
@ -130,8 +124,8 @@ necessary:
|
||||
CONFIG_USB_UHCI_HCD=m
|
||||
CONFIG_USB_OHCI_HCD=m
|
||||
|
||||
The SN9C103 controller also provides a built-in microphone interface. It is
|
||||
supported by the USB Audio driver thanks to the ALSA API:
|
||||
The SN9C103, SN9c105 and SN9C120 controllers also provide a built-in microphone
|
||||
interface. It is supported by the USB Audio driver thanks to the ALSA API:
|
||||
|
||||
# Sound
|
||||
#
|
||||
@ -155,18 +149,27 @@ And finally:
|
||||
6. Module loading
|
||||
=================
|
||||
To use the driver, it is necessary to load the "sn9c102" module into memory
|
||||
after every other module required: "videodev", "usbcore" and, depending on
|
||||
the USB host controller you have, "ehci-hcd", "uhci-hcd" or "ohci-hcd".
|
||||
after every other module required: "videodev", "v4l2_common", "compat_ioctl32",
|
||||
"usbcore" and, depending on the USB host controller you have, "ehci-hcd",
|
||||
"uhci-hcd" or "ohci-hcd".
|
||||
|
||||
Loading can be done as shown below:
|
||||
|
||||
[root@localhost home]# modprobe sn9c102
|
||||
|
||||
At this point the devices should be recognized. You can invoke "dmesg" to
|
||||
analyze kernel messages and verify that the loading process has gone well:
|
||||
Note that the module is called "sn9c102" for historic reasons, althought it
|
||||
does not just support the SN9C102.
|
||||
|
||||
At this point all the devices supported by the driver and connected to the USB
|
||||
ports should be recognized. You can invoke "dmesg" to analyze kernel messages
|
||||
and verify that the loading process has gone well:
|
||||
|
||||
[user@localhost home]$ dmesg
|
||||
|
||||
or, to isolate all the kernel messages generated by the driver:
|
||||
|
||||
[user@localhost home]$ dmesg | grep sn9c102
|
||||
|
||||
|
||||
7. Module parameters
|
||||
====================
|
||||
@ -198,10 +201,11 @@ Default: 0
|
||||
-------------------------------------------------------------------------------
|
||||
Name: frame_timeout
|
||||
Type: uint array (min = 0, max = 64)
|
||||
Syntax: <n[,...]>
|
||||
Description: Timeout for a video frame in seconds. This parameter is
|
||||
specific for each detected camera. This parameter can be
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Syntax: <0|n[,...]>
|
||||
Description: Timeout for a video frame in seconds before returning an I/O
|
||||
error; 0 for infinity. This parameter is specific for each
|
||||
detected camera and can be changed at runtime thanks to the
|
||||
/sys filesystem interface.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
Name: debug
|
||||
@ -212,10 +216,10 @@ Description: Debugging information level, from 0 to 3:
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
3 = more verbose messages
|
||||
Level 3 is useful for testing only, when only one device
|
||||
is used. It also shows some more informations about the
|
||||
hardware being detected. This parameter can be changed at
|
||||
runtime thanks to the /sys filesystem interface.
|
||||
Level 3 is useful for testing only. It also shows some more
|
||||
informations about the hardware being detected.
|
||||
This parameter can be changed at runtime thanks to the /sys
|
||||
filesystem interface.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@ -223,20 +227,21 @@ Default: 2
|
||||
8. Optional device control through "sysfs" [1]
|
||||
==========================================
|
||||
If the kernel has been compiled with the CONFIG_VIDEO_ADV_DEBUG option enabled,
|
||||
it is possible to read and write both the SN9C10x and the image sensor
|
||||
it is possible to read and write both the SN9C1xx and the image sensor
|
||||
registers by using the "sysfs" filesystem interface.
|
||||
|
||||
Every time a supported device is recognized, a write-only file named "green" is
|
||||
created in the /sys/class/video4linux/videoX directory. You can set the green
|
||||
channel's gain by writing the desired value to it. The value may range from 0
|
||||
to 15 for SN9C101 or SN9C102 bridges, from 0 to 127 for SN9C103 bridges.
|
||||
Similarly, only for SN9C103 controllers, blue and red gain control files are
|
||||
available in the same directory, for which accepted values may range from 0 to
|
||||
127.
|
||||
to 15 for the SN9C101 or SN9C102 bridges, from 0 to 127 for the SN9C103,
|
||||
SN9C105 and SN9C120 bridges.
|
||||
Similarly, only for the SN9C103, SN9C105 and SN9C120 controllers, blue and red
|
||||
gain control files are available in the same directory, for which accepted
|
||||
values may range from 0 to 127.
|
||||
|
||||
There are other four entries in the directory above for each registered camera:
|
||||
"reg", "val", "i2c_reg" and "i2c_val". The first two files control the
|
||||
SN9C10x bridge, while the other two control the sensor chip. "reg" and
|
||||
SN9C1xx bridge, while the other two control the sensor chip. "reg" and
|
||||
"i2c_reg" hold the values of the current register index where the following
|
||||
reading/writing operations are addressed at through "val" and "i2c_val". Their
|
||||
use is not intended for end-users. Note that "i2c_reg" and "i2c_val" will not
|
||||
@ -259,61 +264,84 @@ Now let's set the green gain's register of the SN9C101 or SN9C102 chips to 2:
|
||||
[root@localhost #] echo 0x11 > reg
|
||||
[root@localhost #] echo 2 > val
|
||||
|
||||
Note that the SN9C10x always returns 0 when some of its registers are read.
|
||||
Note that the SN9C1xx always returns 0 when some of its registers are read.
|
||||
To avoid race conditions, all the I/O accesses to the above files are
|
||||
serialized.
|
||||
|
||||
The sysfs interface also provides the "frame_header" entry, which exports the
|
||||
frame header of the most recent requested and captured video frame. The header
|
||||
is always 18-bytes long and is appended to every video frame by the SN9C10x
|
||||
is always 18-bytes long and is appended to every video frame by the SN9C1xx
|
||||
controllers. As an example, this additional information can be used by the user
|
||||
application for implementing auto-exposure features via software.
|
||||
|
||||
The following table describes the frame header:
|
||||
The following table describes the frame header exported by the SN9C101 and
|
||||
SN9C102:
|
||||
|
||||
Byte # Value Description
|
||||
------ ----- -----------
|
||||
0x00 0xFF Frame synchronisation pattern.
|
||||
0x01 0xFF Frame synchronisation pattern.
|
||||
0x02 0x00 Frame synchronisation pattern.
|
||||
0x03 0xC4 Frame synchronisation pattern.
|
||||
0x04 0xC4 Frame synchronisation pattern.
|
||||
0x05 0x96 Frame synchronisation pattern.
|
||||
0x06 0xXX Unknown meaning. The exact value depends on the chip;
|
||||
possible values are 0x00, 0x01 and 0x20.
|
||||
0x07 0xXX Variable value, whose bits are ff00uzzc, where ff is a
|
||||
frame counter, u is unknown, zz is a size indicator
|
||||
(00 = VGA, 01 = SIF, 10 = QSIF) and c stands for
|
||||
"compression enabled" (1 = yes, 0 = no).
|
||||
0x08 0xXX Brightness sum inside Auto-Exposure area (low-byte).
|
||||
0x09 0xXX Brightness sum inside Auto-Exposure area (high-byte).
|
||||
For a pure white image, this number will be equal to 500
|
||||
times the area of the specified AE area. For images
|
||||
that are not pure white, the value scales down according
|
||||
to relative whiteness.
|
||||
0x0A 0xXX Brightness sum outside Auto-Exposure area (low-byte).
|
||||
0x0B 0xXX Brightness sum outside Auto-Exposure area (high-byte).
|
||||
For a pure white image, this number will be equal to 125
|
||||
times the area outside of the specified AE area. For
|
||||
images that are not pure white, the value scales down
|
||||
according to relative whiteness.
|
||||
according to relative whiteness.
|
||||
Byte # Value or bits Description
|
||||
------ ------------- -----------
|
||||
0x00 0xFF Frame synchronisation pattern
|
||||
0x01 0xFF Frame synchronisation pattern
|
||||
0x02 0x00 Frame synchronisation pattern
|
||||
0x03 0xC4 Frame synchronisation pattern
|
||||
0x04 0xC4 Frame synchronisation pattern
|
||||
0x05 0x96 Frame synchronisation pattern
|
||||
0x06 [3:0] Read channel gain control = (1+R_GAIN/8)
|
||||
[7:4] Blue channel gain control = (1+B_GAIN/8)
|
||||
0x07 [ 0 ] Compression mode. 0=No compression, 1=Compression enabled
|
||||
[2:1] Maximum scale factor for compression
|
||||
[ 3 ] 1 = USB fifo(2K bytes) is full
|
||||
[ 4 ] 1 = Digital gain is finish
|
||||
[ 5 ] 1 = Exposure is finish
|
||||
[7:6] Frame index
|
||||
0x08 [7:0] Y sum inside Auto-Exposure area (low-byte)
|
||||
0x09 [7:0] Y sum inside Auto-Exposure area (high-byte)
|
||||
where Y sum = (R/4 + 5G/16 + B/8) / 32
|
||||
0x0A [7:0] Y sum outside Auto-Exposure area (low-byte)
|
||||
0x0B [7:0] Y sum outside Auto-Exposure area (high-byte)
|
||||
where Y sum = (R/4 + 5G/16 + B/8) / 128
|
||||
0x0C 0xXX Not used
|
||||
0x0D 0xXX Not used
|
||||
0x0E 0xXX Not used
|
||||
0x0F 0xXX Not used
|
||||
0x10 0xXX Not used
|
||||
0x11 0xXX Not used
|
||||
|
||||
The following bytes are used by the SN9C103 bridge only:
|
||||
The following table describes the frame header exported by the SN9C103:
|
||||
|
||||
0x0C 0xXX Unknown meaning
|
||||
0x0D 0xXX Unknown meaning
|
||||
0x0E 0xXX Unknown meaning
|
||||
0x0F 0xXX Unknown meaning
|
||||
0x10 0xXX Unknown meaning
|
||||
0x11 0xXX Unknown meaning
|
||||
Byte # Value or bits Description
|
||||
------ ------------- -----------
|
||||
0x00 0xFF Frame synchronisation pattern
|
||||
0x01 0xFF Frame synchronisation pattern
|
||||
0x02 0x00 Frame synchronisation pattern
|
||||
0x03 0xC4 Frame synchronisation pattern
|
||||
0x04 0xC4 Frame synchronisation pattern
|
||||
0x05 0x96 Frame synchronisation pattern
|
||||
0x06 [6:0] Read channel gain control = (1/2+R_GAIN/64)
|
||||
0x07 [6:0] Blue channel gain control = (1/2+B_GAIN/64)
|
||||
[7:4]
|
||||
0x08 [ 0 ] Compression mode. 0=No compression, 1=Compression enabled
|
||||
[2:1] Maximum scale factor for compression
|
||||
[ 3 ] 1 = USB fifo(2K bytes) is full
|
||||
[ 4 ] 1 = Digital gain is finish
|
||||
[ 5 ] 1 = Exposure is finish
|
||||
[7:6] Frame index
|
||||
0x09 [7:0] Y sum inside Auto-Exposure area (low-byte)
|
||||
0x0A [7:0] Y sum inside Auto-Exposure area (high-byte)
|
||||
where Y sum = (R/4 + 5G/16 + B/8) / 32
|
||||
0x0B [7:0] Y sum outside Auto-Exposure area (low-byte)
|
||||
0x0C [7:0] Y sum outside Auto-Exposure area (high-byte)
|
||||
where Y sum = (R/4 + 5G/16 + B/8) / 128
|
||||
0x0D [1:0] Audio frame number
|
||||
[ 2 ] 1 = Audio is recording
|
||||
0x0E [7:0] Audio summation (low-byte)
|
||||
0x0F [7:0] Audio summation (high-byte)
|
||||
0x10 [7:0] Audio sample count
|
||||
0x11 [7:0] Audio peak data in audio frame
|
||||
|
||||
The AE area (sx, sy, ex, ey) in the active window can be set by programming the
|
||||
registers 0x1c, 0x1d, 0x1e and 0x1f of the SN9C10x controllers, where one unit
|
||||
registers 0x1c, 0x1d, 0x1e and 0x1f of the SN9C1xx controllers, where one unit
|
||||
corresponds to 32 pixels.
|
||||
|
||||
[1] Part of the meaning of the frame header has been documented by Bertrik
|
||||
Sikken.
|
||||
[1] The frame headers exported by the SN9C105 and SN9C120 are not described.
|
||||
|
||||
|
||||
9. Supported devices
|
||||
@ -323,15 +351,19 @@ here. They have never collaborated with the author, so no advertising.
|
||||
|
||||
From the point of view of a driver, what unambiguously identify a device are
|
||||
its vendor and product USB identifiers. Below is a list of known identifiers of
|
||||
devices mounting the SN9C10x PC camera controllers:
|
||||
devices assembling the SN9C1xx PC camera controllers:
|
||||
|
||||
Vendor ID Product ID
|
||||
--------- ----------
|
||||
0x0471 0x0327
|
||||
0x0471 0x0328
|
||||
0x0c45 0x6001
|
||||
0x0c45 0x6005
|
||||
0x0c45 0x6007
|
||||
0x0c45 0x6009
|
||||
0x0c45 0x600d
|
||||
0x0c45 0x6011
|
||||
0x0c45 0x6019
|
||||
0x0c45 0x6024
|
||||
0x0c45 0x6025
|
||||
0x0c45 0x6028
|
||||
@ -342,6 +374,7 @@ Vendor ID Product ID
|
||||
0x0c45 0x602d
|
||||
0x0c45 0x602e
|
||||
0x0c45 0x6030
|
||||
0x0c45 0x603f
|
||||
0x0c45 0x6080
|
||||
0x0c45 0x6082
|
||||
0x0c45 0x6083
|
||||
@ -368,24 +401,51 @@ Vendor ID Product ID
|
||||
0x0c45 0x60bb
|
||||
0x0c45 0x60bc
|
||||
0x0c45 0x60be
|
||||
0x0c45 0x60c0
|
||||
0x0c45 0x60c2
|
||||
0x0c45 0x60c8
|
||||
0x0c45 0x60cc
|
||||
0x0c45 0x60ea
|
||||
0x0c45 0x60ec
|
||||
0x0c45 0x60ef
|
||||
0x0c45 0x60fa
|
||||
0x0c45 0x60fb
|
||||
0x0c45 0x60fc
|
||||
0x0c45 0x60fe
|
||||
0x0c45 0x6102
|
||||
0x0c45 0x6108
|
||||
0x0c45 0x610f
|
||||
0x0c45 0x6130
|
||||
0x0c45 0x6138
|
||||
0x0c45 0x613a
|
||||
0x0c45 0x613b
|
||||
0x0c45 0x613c
|
||||
0x0c45 0x613e
|
||||
|
||||
The list above does not imply that all those devices work with this driver: up
|
||||
until now only the ones that mount the following image sensors are supported;
|
||||
kernel messages will always tell you whether this is the case:
|
||||
until now only the ones that assemble the following pairs of SN9C1xx bridges
|
||||
and image sensors are supported; kernel messages will always tell you whether
|
||||
this is the case (see "Module loading" paragraph):
|
||||
|
||||
Model Manufacturer
|
||||
----- ------------
|
||||
HV7131D Hynix Semiconductor, Inc.
|
||||
MI-0343 Micron Technology, Inc.
|
||||
OV7630 OmniVision Technologies, Inc.
|
||||
PAS106B PixArt Imaging, Inc.
|
||||
PAS202BCA PixArt Imaging, Inc.
|
||||
PAS202BCB PixArt Imaging, Inc.
|
||||
TAS5110C1B Taiwan Advanced Sensor Corporation
|
||||
TAS5130D1B Taiwan Advanced Sensor Corporation
|
||||
Image sensor / SN9C1xx bridge | SN9C10[12] SN9C103 SN9C105 SN9C120
|
||||
-------------------------------------------------------------------------------
|
||||
HV7131D Hynix Semiconductor | Yes No No No
|
||||
HV7131R Hynix Semiconductor | No Yes Yes Yes
|
||||
MI-0343 Micron Technology | Yes No No No
|
||||
MI-0360 Micron Technology | No Yes No No
|
||||
OV7630 OmniVision Technologies | Yes Yes No No
|
||||
OV7660 OmniVision Technologies | No No Yes Yes
|
||||
PAS106B PixArt Imaging | Yes No No No
|
||||
PAS202B PixArt Imaging | Yes Yes No No
|
||||
TAS5110C1B Taiwan Advanced Sensor | Yes No No No
|
||||
TAS5110D Taiwan Advanced Sensor | Yes No No No
|
||||
TAS5130D1B Taiwan Advanced Sensor | Yes No No No
|
||||
|
||||
All the available control settings of each image sensor are supported through
|
||||
the V4L2 interface.
|
||||
"Yes" means that the pair is supported by the driver, while "No" means that the
|
||||
pair does not exist or is not supported by the driver.
|
||||
|
||||
Only some of the available control settings of each image sensor are supported
|
||||
through the V4L2 interface.
|
||||
|
||||
Donations of new models for further testing and support would be much
|
||||
appreciated. Non-available hardware will not be supported by the author of this
|
||||
@ -429,12 +489,15 @@ supplied by this driver).
|
||||
|
||||
11. Video frame formats [1]
|
||||
=======================
|
||||
The SN9C10x PC Camera Controllers can send images in two possible video
|
||||
formats over the USB: either native "Sequential RGB Bayer" or Huffman
|
||||
compressed. The latter is used to achieve high frame rates. The current video
|
||||
format may be selected or queried from the user application by calling the
|
||||
VIDIOC_S_FMT or VIDIOC_G_FMT ioctl's, as described in the V4L2 API
|
||||
specifications.
|
||||
The SN9C1xx PC Camera Controllers can send images in two possible video
|
||||
formats over the USB: either native "Sequential RGB Bayer" or compressed.
|
||||
The compression is used to achieve high frame rates. With regard to the
|
||||
SN9C101, SN9C102 and SN9C103, the compression is based on the Huffman encoding
|
||||
algorithm described below, while with regard to the SN9C105 and SN9C120 the
|
||||
compression is based on the JPEG standard.
|
||||
The current video format may be selected or queried from the user application
|
||||
by calling the VIDIOC_S_FMT or VIDIOC_G_FMT ioctl's, as described in the V4L2
|
||||
API specifications.
|
||||
|
||||
The name "Sequential Bayer" indicates the organization of the red, green and
|
||||
blue pixels in one video frame. Each pixel is associated with a 8-bit long
|
||||
@ -447,14 +510,14 @@ G[m] R[m+1] G[m+2] R[m+2] ... G[2m-2] R[2m-1]
|
||||
... G[n(m-2)] R[n(m-1)]
|
||||
|
||||
The above matrix also represents the sequential or progressive read-out mode of
|
||||
the (n, m) Bayer color filter array used in many CCD/CMOS image sensors.
|
||||
the (n, m) Bayer color filter array used in many CCD or CMOS image sensors.
|
||||
|
||||
One compressed video frame consists of a bitstream that encodes for every R, G,
|
||||
or B pixel the difference between the value of the pixel itself and some
|
||||
reference pixel value. Pixels are organised in the Bayer pattern and the Bayer
|
||||
sub-pixels are tracked individually and alternatingly. For example, in the
|
||||
first line values for the B and G1 pixels are alternatingly encoded, while in
|
||||
the second line values for the G2 and R pixels are alternatingly encoded.
|
||||
The Huffman compressed video frame consists of a bitstream that encodes for
|
||||
every R, G, or B pixel the difference between the value of the pixel itself and
|
||||
some reference pixel value. Pixels are organised in the Bayer pattern and the
|
||||
Bayer sub-pixels are tracked individually and alternatingly. For example, in
|
||||
the first line values for the B and G1 pixels are alternatingly encoded, while
|
||||
in the second line values for the G2 and R pixels are alternatingly encoded.
|
||||
|
||||
The pixel reference value is calculated as follows:
|
||||
- the 4 top left pixels are encoded in raw uncompressed 8-bit format;
|
||||
@ -470,8 +533,9 @@ The pixel reference value is calculated as follows:
|
||||
decoding.
|
||||
|
||||
The algorithm purely describes the conversion from compressed Bayer code used
|
||||
in the SN9C10x chips to uncompressed Bayer. Additional steps are required to
|
||||
convert this to a color image (i.e. a color interpolation algorithm).
|
||||
in the SN9C101, SN9C102 and SN9C103 chips to uncompressed Bayer. Additional
|
||||
steps are required to convert this to a color image (i.e. a color interpolation
|
||||
algorithm).
|
||||
|
||||
The following Huffman codes have been found:
|
||||
0: +0 (relative to reference pixel value)
|
||||
@ -506,13 +570,19 @@ order):
|
||||
- Philippe Coval for having helped testing the PAS202BCA image sensor;
|
||||
- Joao Rodrigo Fuzaro, Joao Limirio, Claudio Filho and Caio Begotti for the
|
||||
donation of a webcam;
|
||||
- Dennis Heitmann for the donation of a webcam;
|
||||
- Jon Hollstrom for the donation of a webcam;
|
||||
- Nick McGill for the donation of a webcam;
|
||||
- Carlos Eduardo Medaglia Dyonisio, who added the support for the PAS202BCB
|
||||
image sensor;
|
||||
- Stefano Mozzi, who donated 45 EU;
|
||||
- Andrew Pearce for the donation of a webcam;
|
||||
- John Pullan for the donation of a webcam;
|
||||
- Bertrik Sikken, who reverse-engineered and documented the Huffman compression
|
||||
algorithm used in the SN9C10x controllers and implemented the first decoder;
|
||||
algorithm used in the SN9C101, SN9C102 and SN9C103 controllers and
|
||||
implemented the first decoder;
|
||||
- Mizuno Takafumi for the donation of a webcam;
|
||||
- an "anonymous" donator (who didn't want his name to be revealed) for the
|
||||
donation of a webcam.
|
||||
- an anonymous donator for the donation of four webcams and two boards with ten
|
||||
image sensors.
|
||||
|
@ -23,7 +23,7 @@ Index
|
||||
|
||||
1. Copyright
|
||||
============
|
||||
Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
||||
|
||||
2. Disclaimer
|
||||
@ -125,8 +125,9 @@ And finally:
|
||||
6. Module loading
|
||||
=================
|
||||
To use the driver, it is necessary to load the "zc0301" module into memory
|
||||
after every other module required: "videodev", "usbcore" and, depending on
|
||||
the USB host controller you have, "ehci-hcd", "uhci-hcd" or "ohci-hcd".
|
||||
after every other module required: "videodev", "v4l2_common", "compat_ioctl32",
|
||||
"usbcore" and, depending on the USB host controller you have, "ehci-hcd",
|
||||
"uhci-hcd" or "ohci-hcd".
|
||||
|
||||
Loading can be done as shown below:
|
||||
|
||||
@ -211,12 +212,11 @@ Vendor ID Product ID
|
||||
0x041e 0x4036
|
||||
0x041e 0x403a
|
||||
0x0458 0x7007
|
||||
0x0458 0x700C
|
||||
0x0458 0x700c
|
||||
0x0458 0x700f
|
||||
0x046d 0x08ae
|
||||
0x055f 0xd003
|
||||
0x055f 0xd004
|
||||
0x046d 0x08ae
|
||||
0x0ac8 0x0301
|
||||
0x0ac8 0x301b
|
||||
0x0ac8 0x303b
|
||||
|
65
Documentation/video4linux/zr364xx.txt
Normal file
65
Documentation/video4linux/zr364xx.txt
Normal file
@ -0,0 +1,65 @@
|
||||
Zoran 364xx based USB webcam module version 0.72
|
||||
site: http://royale.zerezo.com/zr364xx/
|
||||
mail: royale@zerezo.com
|
||||
|
||||
introduction:
|
||||
This brings support under Linux for the Aiptek PocketDV 3300 in webcam mode.
|
||||
If you just want to get on your PC the pictures and movies on the camera, you should use the usb-storage module instead.
|
||||
The driver works with several other cameras in webcam mode (see the list below).
|
||||
Maybe this code can work for other JPEG/USB cams based on the Coach chips from Zoran?
|
||||
Possible chipsets are : ZR36430 (ZR36430BGC) and maybe ZR36431, ZR36440, ZR36442...
|
||||
You can try the experience changing the vendor/product ID values (look at the source code).
|
||||
You can get these values by looking at /var/log/messages when you plug your camera, or by typing : cat /proc/bus/usb/devices.
|
||||
If you manage to use your cam with this code, you can send me a mail (royale@zerezo.com) with the name of your cam and a patch if needed.
|
||||
This is a beta release of the driver.
|
||||
Since version 0.70, this driver is only compatible with V4L2 API and 2.6.x kernels.
|
||||
If you need V4L1 or 2.4x kernels support, please use an older version, but the code is not maintained anymore.
|
||||
Good luck!
|
||||
|
||||
install:
|
||||
In order to use this driver, you must compile it with your kernel.
|
||||
Location: Device Drivers -> Multimedia devices -> Video For Linux -> Video Capture Adapters -> V4L USB devices
|
||||
|
||||
usage:
|
||||
modprobe zr364xx debug=X mode=Y
|
||||
- debug : set to 1 to enable verbose debug messages
|
||||
- mode : 0 = 320x240, 1 = 160x120, 2 = 640x480
|
||||
You can then use the camera with V4L2 compatible applications, for example Ekiga.
|
||||
To capture a single image, try this: dd if=/dev/video0 of=test.jpg bs=1 count=1
|
||||
|
||||
links :
|
||||
http://mxhaard.free.fr/ (support for many others cams including some Aiptek PocketDV)
|
||||
http://www.harmwal.nl/pccam880/ (this project also supports cameras based on this chipset)
|
||||
|
||||
supported devices:
|
||||
------ ------- ----------- -----
|
||||
Vendor Product Distributor Model
|
||||
------ ------- ----------- -----
|
||||
0x08ca 0x0109 Aiptek PocketDV 3300
|
||||
0x08ca 0x0109 Maxell Maxcam PRO DV3
|
||||
0x041e 0x4024 Creative PC-CAM 880
|
||||
0x0d64 0x0108 Aiptek Fidelity 3200
|
||||
0x0d64 0x0108 Praktica DCZ 1.3 S
|
||||
0x0d64 0x0108 Genius Digital Camera (?)
|
||||
0x0d64 0x0108 DXG Technology Fashion Cam
|
||||
0x0546 0x3187 Polaroid iON 230
|
||||
0x0d64 0x3108 Praktica Exakta DC 2200
|
||||
0x0d64 0x3108 Genius G-Shot D211
|
||||
0x0595 0x4343 Concord Eye-Q Duo 1300
|
||||
0x0595 0x4343 Concord Eye-Q Duo 2000
|
||||
0x0595 0x4343 Fujifilm EX-10
|
||||
0x0595 0x4343 Ricoh RDC-6000
|
||||
0x0595 0x4343 Digitrex DSC 1300
|
||||
0x0595 0x4343 Firstline FDC 2000
|
||||
0x0bb0 0x500d Concord EyeQ Go Wireless
|
||||
0x0feb 0x2004 CRS Electronic 3.3 Digital Camera
|
||||
0x0feb 0x2004 Packard Bell DSC-300
|
||||
0x055f 0xb500 Mustek MDC 3000
|
||||
0x08ca 0x2062 Aiptek PocketDV 5700
|
||||
0x052b 0x1a18 Chiphead Megapix V12
|
||||
0x04c8 0x0729 Konica Revio 2
|
||||
0x04f2 0xa208 Creative PC-CAM 850
|
||||
0x0784 0x0040 Traveler Slimline X5
|
||||
0x06d6 0x0034 Trust Powerc@m 750
|
||||
0x0a17 0x0062 Pentax Optio 50L
|
||||
|
@ -293,7 +293,3 @@ Debugging
|
||||
stuck (default)
|
||||
|
||||
Miscellaneous
|
||||
|
||||
noreplacement Don't replace instructions with more appropriate ones
|
||||
for the CPU. This may be useful on asymmetric MP systems
|
||||
where some CPUs have less capabilities than others.
|
||||
|
278
MAINTAINERS
278
MAINTAINERS
@ -198,10 +198,25 @@ L: linux-sound@vger.kernel.org
|
||||
W: http://www.stud.uni-karlsruhe.de/~uh1b/
|
||||
S: Maintained
|
||||
|
||||
IPS SCSI RAID DRIVER
|
||||
P: Adaptec OEM Raid Solutions
|
||||
M: aacraid@adaptec.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.adaptec.com/
|
||||
S: Maintained
|
||||
|
||||
DPT_I2O SCSI RAID DRIVER
|
||||
P: Adaptec OEM Raid Solutions
|
||||
M: aacraid@adaptec.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.adaptec.com/
|
||||
S: Maintained
|
||||
|
||||
AACRAID SCSI RAID DRIVER
|
||||
P: Adaptec OEM Raid Solutions
|
||||
M: aacraid@adaptec.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://linux.dell.com/storage.shtml
|
||||
W: http://www.adaptec.com/
|
||||
S: Supported
|
||||
|
||||
ACPI
|
||||
@ -247,6 +262,13 @@ L: linux-acpi@vger.kernel.org
|
||||
W: http://acpi.sourceforge.net/
|
||||
S: Supported
|
||||
|
||||
ACPI VIDEO DRIVER
|
||||
P: Luming Yu
|
||||
M: luming.yu@intel.com
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://acpi.sourceforge.net/
|
||||
S: Supported
|
||||
|
||||
AD1816 SOUND DRIVER
|
||||
P: Thorsten Knabe
|
||||
M: Thorsten Knabe <linux@thorsten-knabe.de>
|
||||
@ -268,6 +290,12 @@ M: khali@linux-fr.org
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
|
||||
ADM1029 HARDWARE MONITOR DRIVER
|
||||
P: Corentin Labbe
|
||||
M: corentin.labbe@geomatys.fr
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
|
||||
ADT746X FAN DRIVER
|
||||
P: Colin Leroy
|
||||
M: colin@colino.net
|
||||
@ -356,7 +384,7 @@ S: Supported
|
||||
|
||||
APPLETALK NETWORK LAYER
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@conectiva.com.br
|
||||
M: acme@ghostprotocols.net
|
||||
S: Maintained
|
||||
|
||||
ARC FRAMEBUFFER DRIVER
|
||||
@ -628,6 +656,7 @@ S: Supported
|
||||
ATMEL WIRELESS DRIVER
|
||||
P: Simon Kelley
|
||||
M: simon@thekelleys.org.uk
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://www.thekelleys.org.uk/atmel
|
||||
W: http://atmelwlandriver.sourceforge.net/
|
||||
S: Maintained
|
||||
@ -666,6 +695,11 @@ L: linux-hams@vger.kernel.org
|
||||
W: http://www.linux-ax25.org/
|
||||
S: Maintained
|
||||
|
||||
BACKLIGHT CLASS/SUBSYSTEM
|
||||
P: Richard Purdie
|
||||
M: rpurdie@rpsys.net
|
||||
S: Maintained
|
||||
|
||||
BAYCOM/HDLCDRV DRIVERS FOR AX.25
|
||||
P: Thomas Sailer
|
||||
M: t.sailer@alumni.ethz.ch
|
||||
@ -678,6 +712,7 @@ P: Larry Finger
|
||||
M: Larry.Finger@lwfinger.net
|
||||
P: Stefano Brivio
|
||||
M: st3@riseup.net
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://bcm43xx.berlios.de/
|
||||
S: Maintained
|
||||
|
||||
@ -838,6 +873,12 @@ W: http://linuxtv.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git
|
||||
S: Maintained
|
||||
|
||||
CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER
|
||||
P: Jonathan Corbet
|
||||
M: corbet@lwn.net
|
||||
L: video4linux-list@redhat.com
|
||||
S: Maintained
|
||||
|
||||
CALGARY x86-64 IOMMU
|
||||
P: Muli Ben-Yehuda
|
||||
M: muli@il.ibm.com
|
||||
@ -859,6 +900,12 @@ M: maxextreme@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
CFG80211 and NL80211
|
||||
P: Johannes Berg
|
||||
M: johannes@sipsolutions.net
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
COMMON INTERNET FILE SYSTEM (CIFS)
|
||||
P: Steve French
|
||||
M: sfrench@samba.org
|
||||
@ -934,6 +981,11 @@ M: mhw@wittsend.com
|
||||
W: http://www.wittsend.com/computone.html
|
||||
S: Maintained
|
||||
|
||||
CONEXANT ACCESSRUNNER USB DRIVER
|
||||
P: Simon Arlott
|
||||
M: cxacru@fire.lp0.eu
|
||||
S: Maintained
|
||||
|
||||
COSA/SRP SYNC SERIAL DRIVER
|
||||
P: Jan "Yenya" Kasprzak
|
||||
M: kas@fi.muni.cz
|
||||
@ -1001,9 +1053,8 @@ S: Maintained
|
||||
|
||||
CYCLADES 2X SYNC CARD DRIVER
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@conectiva.com.br
|
||||
W: http://advogato.org/person/acme
|
||||
L: cycsyn-devel@bazar.conectiva.com.br
|
||||
M: acme@ghostprotocols.net
|
||||
W: http://oops.ghostprotocols.net:81/blog
|
||||
S: Maintained
|
||||
|
||||
CYCLADES ASYNC MUX DRIVER
|
||||
@ -1044,7 +1095,7 @@ S: Maintained
|
||||
|
||||
DCCP PROTOCOL
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@mandriva.com
|
||||
M: acme@ghostprotocols.net
|
||||
L: dccp@vger.kernel.org
|
||||
W: http://linux-net.osdl.org/index.php/DCCP
|
||||
S: Maintained
|
||||
@ -1085,9 +1136,6 @@ W: http://lanana.org/docs/device-list/index.html
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
DEVICE FILESYSTEM
|
||||
S: Obsolete
|
||||
|
||||
DIGI INTL. EPCA DRIVER
|
||||
P: Digi International, Inc
|
||||
M: Eng.Linux@digi.com
|
||||
@ -1288,7 +1336,7 @@ S: Maintained
|
||||
ETHERNET BRIDGE
|
||||
P: Stephen Hemminger
|
||||
M: shemminger@linux-foundation.org
|
||||
L: bridge@osdl.org
|
||||
L: bridge@lists.linux-foundation.org
|
||||
W: http://bridge.sourceforge.net/
|
||||
S: Maintained
|
||||
|
||||
@ -1303,13 +1351,13 @@ S: Maintained
|
||||
|
||||
EXT3 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
||||
L: linux-ext4@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
EXT4 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
||||
L: linux-ext4@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@ -1325,9 +1373,14 @@ M: kevin.curtis@farsite.co.uk
|
||||
W: http://www.farsite.co.uk/
|
||||
S: Supported
|
||||
|
||||
FAULT INJECTION SUPPORT
|
||||
P: Akinobu Mita
|
||||
M: akinobu.mita@gmail.com
|
||||
S: Supported
|
||||
|
||||
FRAMEBUFFER LAYER
|
||||
P: Antonino Daplas
|
||||
M: adaplas@pol.net
|
||||
M: adaplas@gmail.com
|
||||
L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
|
||||
W: http://linux-fbdev.sourceforge.net/
|
||||
S: Maintained
|
||||
@ -1341,6 +1394,13 @@ L: linuxppc-embedded@ozlabs.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
FREESCALE HIGHSPEED USB DEVICE DRIVER
|
||||
P: Li Yang
|
||||
M: leoli@freescale.com
|
||||
L: linux-usb-devel@lists.sourceforge.net
|
||||
L: linuxppc-embedded@ozlabs.org
|
||||
S: Maintained
|
||||
|
||||
FILE LOCKING (flock() and fcntl()/lockf())
|
||||
P: Matthew Wilcox
|
||||
M: matthew@wil.cx
|
||||
@ -1374,7 +1434,7 @@ M: hch@infradead.org
|
||||
W: ftp://ftp.openlinux.org/pub/people/hch/vxfs
|
||||
S: Maintained
|
||||
|
||||
FUJITSU FR-V PORT
|
||||
FUJITSU FR-V (FRV) PORT
|
||||
P: David Howells
|
||||
M: dhowells@redhat.com
|
||||
S: Maintained
|
||||
@ -1474,6 +1534,13 @@ HID CORE LAYER
|
||||
P: Jiri Kosina
|
||||
M: jkosina@suse.cz
|
||||
L: linux-input@atrey.karlin.mff.cuni.cz
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/jikos/hid.git
|
||||
S: Maintained
|
||||
|
||||
HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
|
||||
P: Thomas Gleixner
|
||||
M: tglx@linutronix.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
HIGH-SPEED SCC DRIVER FOR AX.25
|
||||
@ -1515,8 +1582,9 @@ S: Supported
|
||||
|
||||
HOST AP DRIVER
|
||||
P: Jouni Malinen
|
||||
M: jkmaline@cc.hut.fi
|
||||
L: hostap@shmoo.com
|
||||
M: j@w1.fi
|
||||
L: hostap@shmoo.com (subscribers-only)
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://hostap.epitest.fi/
|
||||
S: Maintained
|
||||
|
||||
@ -1563,12 +1631,6 @@ L: i2c@lm-sensors.org
|
||||
T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
|
||||
S: Maintained
|
||||
|
||||
I2O
|
||||
P: Markus Lidel
|
||||
M: markus.lidel@shadowconnect.com
|
||||
W: http://i2o.shadowconnect.com/
|
||||
S: Maintained
|
||||
|
||||
i386 BOOT CODE
|
||||
P: Riley H. Williams
|
||||
M: Riley@Williams.Name
|
||||
@ -1596,15 +1658,6 @@ W: http://www.ia64-linux.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
||||
S: Maintained
|
||||
|
||||
IBM ACPI EXTRAS DRIVER
|
||||
P: Henrique de Moraes Holschuh
|
||||
M: ibm-acpi@hmh.eng.br
|
||||
L: ibm-acpi-devel@lists.sourceforge.net
|
||||
W: http://ibm-acpi.sourceforge.net
|
||||
W: http://thinkwiki.org/wiki/Ibm-acpi
|
||||
T: git repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
|
||||
S: Maintained
|
||||
|
||||
SN-IA64 (Itanium) SUB-PLATFORM
|
||||
P: Jes Sorensen
|
||||
M: jes@sgi.com
|
||||
@ -1659,7 +1712,7 @@ S: Maintained
|
||||
|
||||
IEEE 1394 SUBSYSTEM
|
||||
P: Ben Collins
|
||||
M: bcollins@debian.org
|
||||
M: ben.collins@ubuntu.com
|
||||
P: Stefan Richter
|
||||
M: stefanr@s5r6.in-berlin.de
|
||||
L: linux1394-devel@lists.sourceforge.net
|
||||
@ -1667,25 +1720,11 @@ W: http://www.linux1394.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
|
||||
S: Maintained
|
||||
|
||||
IEEE 1394 IPV4 DRIVER (eth1394)
|
||||
P: Stefan Richter
|
||||
M: stefanr@s5r6.in-berlin.de
|
||||
L: linux1394-devel@lists.sourceforge.net
|
||||
S: Odd Fixes
|
||||
|
||||
IEEE 1394 PCILYNX DRIVER
|
||||
P: Jody McIntyre
|
||||
M: scjody@modernduck.com
|
||||
P: Stefan Richter
|
||||
M: stefanr@s5r6.in-berlin.de
|
||||
L: linux1394-devel@lists.sourceforge.net
|
||||
S: Odd Fixes
|
||||
|
||||
IEEE 1394 RAW I/O DRIVER
|
||||
P: Ben Collins
|
||||
M: bcollins@debian.org
|
||||
IEEE 1394 RAW I/O DRIVER (raw1394)
|
||||
P: Dan Dennedy
|
||||
M: dan@dennedy.org
|
||||
P: Stefan Richter
|
||||
M: stefanr@s5r6.in-berlin.de
|
||||
L: linux1394-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
@ -1732,7 +1771,7 @@ S: Maintained
|
||||
|
||||
INTEL 810/815 FRAMEBUFFER DRIVER
|
||||
P: Antonino Daplas
|
||||
M: adaplas@pol.net
|
||||
M: adaplas@gmail.com
|
||||
L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
@ -1772,6 +1811,7 @@ P: Jeff Kirsher
|
||||
M: jeffrey.t.kirsher@intel.com
|
||||
P: Auke Kok
|
||||
M: auke-jan.h.kok@intel.com
|
||||
L: e1000-devel@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/e1000/
|
||||
S: Supported
|
||||
|
||||
@ -1786,6 +1826,7 @@ P: Jeff Kirsher
|
||||
M: jeffrey.t.kirsher@intel.com
|
||||
P: Auke Kok
|
||||
M: auke-jan.h.kok@intel.com
|
||||
L: e1000-devel@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/e1000/
|
||||
S: Supported
|
||||
|
||||
@ -1800,6 +1841,7 @@ P: Jesse Brandeburg
|
||||
M: jesse.brandeburg@intel.com
|
||||
P: Auke Kok
|
||||
M: auke-jan.h.kok@intel.com
|
||||
L: e1000-devel@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/e1000/
|
||||
S: Supported
|
||||
|
||||
@ -1808,6 +1850,7 @@ P: Yi Zhu
|
||||
M: yi.zhu@intel.com
|
||||
P: James Ketrenos
|
||||
M: jketreno@linux.intel.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ipw2100-devel@lists.sourceforge.net
|
||||
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
||||
W: http://ipw2100.sourceforge.net
|
||||
@ -1818,6 +1861,7 @@ P: Yi Zhu
|
||||
M: yi.zhu@intel.com
|
||||
P: James Ketrenos
|
||||
M: jketreno@linux.intel.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ipw2100-devel@lists.sourceforge.net
|
||||
L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
||||
W: http://ipw2200.sourceforge.net
|
||||
@ -1849,7 +1893,7 @@ S: Supported
|
||||
|
||||
IPX NETWORK LAYER
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@conectiva.com.br
|
||||
M: acme@ghostprotocols.net
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@ -1882,13 +1926,6 @@ L: isdn4linux@listserv.isdn4linux.de
|
||||
W: http://www.melware.de
|
||||
S: Maintained
|
||||
|
||||
JOURNALLING FLASH FILE SYSTEM (JFFS)
|
||||
P: Axis Communications AB
|
||||
M: jffs-dev@axis.com
|
||||
L: jffs-dev@axis.com
|
||||
W: http://www.developer.axis.com/software/jffs/
|
||||
S: Maintained
|
||||
|
||||
JOURNALLING FLASH FILE SYSTEM V2 (JFFS2)
|
||||
P: David Woodhouse
|
||||
M: dwmw2@infradead.org
|
||||
@ -1906,7 +1943,7 @@ S: Supported
|
||||
|
||||
JOURNALLING LAYER FOR BLOCK DEVICES (JBD)
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org
|
||||
M: sct@redhat.com, akpm@linux-foundation.org
|
||||
L: linux-ext4@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@ -1927,7 +1964,7 @@ P: Vivek Goyal
|
||||
M: vgoyal@in.ibm.com
|
||||
P: Haren Myneni
|
||||
M: hbabu@us.ibm.com
|
||||
L: fastboot@lists.osdl.org
|
||||
L: fastboot@lists.linux-foundation.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://lse.sourceforge.net/kdump/
|
||||
S: Maintained
|
||||
@ -1954,7 +1991,7 @@ S: Maintained
|
||||
|
||||
KERNEL JANITORS
|
||||
P: Several
|
||||
L: kernel-janitors@lists.osdl.org
|
||||
L: kernel-janitors@lists.linux-foundation.org
|
||||
W: http://www.kerneljanitors.org/
|
||||
S: Maintained
|
||||
|
||||
@ -1977,7 +2014,7 @@ P: Eric Biederman
|
||||
M: ebiederm@xmission.com
|
||||
W: http://www.xmission.com/~ebiederm/files/kexec/
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: fastboot@osdl.org
|
||||
L: fastboot@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
|
||||
KPROBES
|
||||
@ -2093,7 +2130,7 @@ S: Supported
|
||||
|
||||
LLC (802.2)
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@conectiva.com.br
|
||||
M: acme@ghostprotocols.net
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR 64BIT POWERPC
|
||||
@ -2221,6 +2258,14 @@ L: linux-mtd@lists.infradead.org
|
||||
T: git git://git.infradead.org/mtd-2.6.git
|
||||
S: Maintained
|
||||
|
||||
UNSORTED BLOCK IMAGES (UBI)
|
||||
P: Artem Bityutskiy
|
||||
M: dedekind@infradead.org
|
||||
W: http://www.linux-mtd.infradead.org/
|
||||
L: linux-mtd@lists.infradead.org
|
||||
T: git git://git.infradead.org/ubi-2.6.git
|
||||
S: Maintained
|
||||
|
||||
MICROTEK X6 SCANNER
|
||||
P: Oliver Neukum
|
||||
M: oliver@neukum.name
|
||||
@ -2315,7 +2360,7 @@ S: Maintained
|
||||
NETEM NETWORK EMULATOR
|
||||
P: Stephen Hemminger
|
||||
M: shemminger@linux-foundation.org
|
||||
L: netem@osdl.org
|
||||
L: netem@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
|
||||
NETFILTER/IPTABLES/IPCHAINS
|
||||
@ -2354,7 +2399,7 @@ S: Maintained
|
||||
|
||||
NETWORK DEVICE DRIVERS
|
||||
P: Andrew Morton
|
||||
M: akpm@osdl.org
|
||||
M: akpm@linux-foundation.org
|
||||
P: Jeff Garzik
|
||||
M: jgarzik@pobox.com
|
||||
L: netdev@vger.kernel.org
|
||||
@ -2454,10 +2499,23 @@ S: Maintained
|
||||
|
||||
NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER
|
||||
P: Antonino Daplas
|
||||
M: adaplas@pol.net
|
||||
M: adaplas@gmail.com
|
||||
L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
NETERION (S2IO) Xframe 10GbE DRIVER
|
||||
P: Ramkrishna Vepa
|
||||
M: ram.vepa@neterion.com
|
||||
P: Rastapur Santosh
|
||||
M: santosh.rastapur@neterion.com
|
||||
P: Sivakumar Subramani
|
||||
M: sivakumar.subramani@neterion.com
|
||||
P: Sreenivasa Honnur
|
||||
M: sreenivasa.honnur@neterion.com
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/TitleIndex?anonymous
|
||||
S: Supported
|
||||
|
||||
OPENCORES I2C BUS DRIVER
|
||||
P: Peter Korsgaard
|
||||
M: jacmet@sunsite.dk
|
||||
@ -2493,6 +2551,12 @@ P: Harald Welte
|
||||
M: laforge@gnumonks.org
|
||||
S: Maintained
|
||||
|
||||
OMNIVISION OV7670 SENSOR DRIVER
|
||||
P: Jonathan Corbet
|
||||
M: corbet@lwn.net
|
||||
L: video4linux-list@redhat.com
|
||||
S: Maintained
|
||||
|
||||
ONSTREAM SCSI TAPE DRIVER
|
||||
P: Willem Riede
|
||||
M: osst@riede.org
|
||||
@ -2517,6 +2581,7 @@ P: Pavel Roskin
|
||||
M: proski@gnu.org
|
||||
P: David Gibson
|
||||
M: hermes@gibson.dropbear.id.au
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: orinoco-users@lists.sourceforge.net
|
||||
L: orinoco-devel@lists.sourceforge.net
|
||||
W: http://www.nongnu.org/orinoco/
|
||||
@ -2535,16 +2600,8 @@ L: i2c@lm-sensors.org
|
||||
S: Maintained
|
||||
|
||||
PARALLEL PORT SUPPORT
|
||||
P: Phil Blundell
|
||||
M: philb@gnu.org
|
||||
P: Tim Waugh
|
||||
M: tim@cyberelk.net
|
||||
P: David Campbell
|
||||
P: Andrea Arcangeli
|
||||
M: andrea@suse.de
|
||||
L: linux-parport@lists.infradead.org
|
||||
W: http://people.redhat.com/twaugh/parport/
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
|
||||
PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES
|
||||
P: Tim Waugh
|
||||
@ -2623,8 +2680,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||
S: Maintained
|
||||
|
||||
PCNET32 NETWORK DRIVER
|
||||
P: Thomas Bogendörfer
|
||||
M: tsbogend@alpha.franken.de
|
||||
P: Don Fry
|
||||
M: pcnet32@verizon.net
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@ -2704,7 +2761,7 @@ S: Supported
|
||||
PRISM54 WIRELESS DRIVER
|
||||
P: Prism54 Development Team
|
||||
M: developers@islsm.org
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://prism54.org
|
||||
S: Maintained
|
||||
|
||||
@ -2730,7 +2787,7 @@ S: Supported
|
||||
PVRUSB2 VIDEO4LINUX DRIVER
|
||||
P: Mike Isely
|
||||
M: isely@pobox.com
|
||||
L: pvrusb2@isely.net
|
||||
L: pvrusb2@isely.net (subscribers-only)
|
||||
L: video4linux-list@redhat.com
|
||||
W: http://www.isely.net/pvrusb2/
|
||||
S: Maintained
|
||||
@ -2775,7 +2832,7 @@ S: Maintained
|
||||
RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER
|
||||
P: Corey Thomas
|
||||
M: corey@world.std.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
RANDOM NUMBER DRIVER
|
||||
@ -2838,7 +2895,7 @@ S: Orphan
|
||||
|
||||
S3 SAVAGE FRAMEBUFFER DRIVER
|
||||
P: Antonino Daplas
|
||||
M: adaplas@pol.net
|
||||
M: adaplas@gmail.com
|
||||
L: linux-fbdev-devel@lists.sourceforge.net (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
@ -2921,9 +2978,12 @@ L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
SCTP PROTOCOL
|
||||
P: Vlad Yasevich
|
||||
M: vladislav.yasevich@hp.com
|
||||
P: Sridhar Samudrala
|
||||
M: sri@us.ibm.com
|
||||
L: lksctp-developers@lists.sourceforge.net
|
||||
W: http://lksctp.sourceforge.net
|
||||
S: Supported
|
||||
|
||||
SCx200 CPU SUPPORT
|
||||
@ -2951,8 +3011,10 @@ P: Stephen Smalley
|
||||
M: sds@tycho.nsa.gov
|
||||
P: James Morris
|
||||
M: jmorris@namei.org
|
||||
P: Eric Paris
|
||||
M: eparis@parisplace.org
|
||||
L: linux-kernel@vger.kernel.org (kernel issues)
|
||||
L: selinux@tycho.nsa.gov (general discussion)
|
||||
L: selinux@tycho.nsa.gov (subscribers-only, general discussion)
|
||||
W: http://www.nsa.gov/selinux
|
||||
S: Supported
|
||||
|
||||
@ -3035,7 +3097,7 @@ M: josejx@gentoo.org
|
||||
P: Daniel Drake
|
||||
M: dsd@gentoo.org
|
||||
W: http://softmac.sipsolutions.net/
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
SOFTWARE RAID (Multiple Disks) SUPPORT
|
||||
@ -3049,7 +3111,7 @@ S: Supported
|
||||
SOFTWARE SUSPEND:
|
||||
P: Pavel Machek
|
||||
M: pavel@suse.cz
|
||||
L: linux-pm@osdl.org
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
|
||||
SONIC NETWORK DRIVER
|
||||
@ -3059,9 +3121,10 @@ L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
SONY VAIO CONTROL DEVICE DRIVER
|
||||
P: Stelian Pop
|
||||
M: stelian@popies.net
|
||||
W: http://popies.net/sonypi/
|
||||
P: Mattia Dongili
|
||||
M: malattia@linux.it
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://www.linux.it/~malattia/wiki/index.php/Sony_drivers
|
||||
S: Maintained
|
||||
|
||||
SOUND
|
||||
@ -3094,6 +3157,9 @@ TPM DEVICE DRIVER
|
||||
P: Kylene Hall
|
||||
M: kjhall@us.ibm.com
|
||||
W: http://tpmdd.sourceforge.net
|
||||
P: Marcel Selhorst
|
||||
M: tpm@selhorst.net
|
||||
W: http://www.prosec.rub.de/tpm/
|
||||
L: tpmdd-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
@ -3107,6 +3173,15 @@ P: Chris Zankel
|
||||
M: chris@zankel.net
|
||||
S: Maintained
|
||||
|
||||
THINKPAD ACPI EXTRAS DRIVER
|
||||
P: Henrique de Moraes Holschuh
|
||||
M: ibm-acpi@hmh.eng.br
|
||||
L: ibm-acpi-devel@lists.sourceforge.net
|
||||
W: http://ibm-acpi.sourceforge.net
|
||||
W: http://thinkwiki.org/wiki/Ibm-acpi
|
||||
T: git repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
|
||||
S: Maintained
|
||||
|
||||
UltraSPARC (sparc64):
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
@ -3158,8 +3233,8 @@ L: linux-kernel@vger.kernel.org ?
|
||||
S: Supported
|
||||
|
||||
SPIDERNET NETWORK DRIVER for CELL
|
||||
P: Jim Lewis
|
||||
M: jim@jklewis.com
|
||||
P: Linas Vepstas
|
||||
M: linas@austin.ibm.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
@ -3372,6 +3447,13 @@ L: linux-usb-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
W: http://www.kroah.com/linux-usb/
|
||||
|
||||
USB DAVICOM DM9601 DRIVER
|
||||
P: Peter Korsgaard
|
||||
M: jacmet@sunsite.dk
|
||||
L: linux-usb-devel@lists.sourceforge.net
|
||||
W: http://www.linux-usb.org/usbnet
|
||||
S: Maintained
|
||||
|
||||
USB EHCI DRIVER
|
||||
P: David Brownell
|
||||
M: dbrownell@users.sourceforge.net
|
||||
@ -3397,6 +3479,7 @@ USB HID/HIDBP DRIVERS
|
||||
P: Jiri Kosina
|
||||
M: jkosina@suse.cz
|
||||
L: linux-usb-devel@lists.sourceforge.net
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/jikos/hid.git
|
||||
S: Maintained
|
||||
|
||||
USB HUB DRIVER
|
||||
@ -3551,7 +3634,7 @@ L: linux-usb-devel@lists.sourceforge.net
|
||||
W: http://www.connecttech.com
|
||||
S: Supported
|
||||
|
||||
USB SN9C10x DRIVER
|
||||
USB SN9C1xx DRIVER
|
||||
P: Luca Risolia
|
||||
M: luca.risolia@studio.unibo.it
|
||||
L: linux-usb-devel@lists.sourceforge.net
|
||||
@ -3606,6 +3689,14 @@ L: linux-usb-devel@lists.sourceforge.net
|
||||
W: http://linux-lc100020.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
USB ZR364XX DRIVER
|
||||
P: Antoine Jacquet
|
||||
M: royale@zerezo.com
|
||||
L: linux-usb-devel@lists.sourceforge.net
|
||||
L: video4linux-list@redhat.com
|
||||
W: http://royale.zerezo.com/zr364xx/
|
||||
S: Maintained
|
||||
|
||||
USER-MODE LINUX
|
||||
P: Jeff Dike
|
||||
M: jdike@karaya.com
|
||||
@ -3728,6 +3819,7 @@ S: Maintained
|
||||
WAVELAN NETWORK DRIVER & WIRELESS EXTENSIONS
|
||||
P: Jean Tourrilhes
|
||||
M: jt@hpl.hp.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/
|
||||
S: Maintained
|
||||
|
||||
@ -3744,8 +3836,9 @@ S: Maintained
|
||||
|
||||
WL3501 WIRELESS PCMCIA CARD DRIVER
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@conectiva.com.br
|
||||
W: http://advogato.org/person/acme
|
||||
M: acme@ghostprotocols.net
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://oops.ghostprotocols.net:81/blog
|
||||
S: Maintained
|
||||
|
||||
X.25 NETWORK LAYER
|
||||
@ -3808,6 +3901,7 @@ M: dsd@gentoo.org
|
||||
P: Ulrich Kunitz
|
||||
M: kune@deine-taler.de
|
||||
W: http://zd1211.ath.cx/wiki/DriverRewrite
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: zd1211-devs@lists.sourceforge.net (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
|
4
Makefile
4
Makefile
@ -1,8 +1,8 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 20
|
||||
SUBLEVEL = 21
|
||||
EXTRAVERSION =
|
||||
NAME = Homicidal Dwarf Hamster
|
||||
NAME = Nocturnal Monster Puppy
|
||||
|
||||
# *DOCUMENTATION*
|
||||
# To see a list of typical targets execute "make help"
|
||||
|
2
README
2
README
@ -24,7 +24,7 @@ ON WHAT HARDWARE DOES IT RUN?
|
||||
today Linux also runs on (at least) the Compaq Alpha AXP, Sun SPARC and
|
||||
UltraSPARC, Motorola 68000, PowerPC, PowerPC64, ARM, Hitachi SuperH, Cell,
|
||||
IBM S/390, MIPS, HP PA-RISC, Intel IA-64, DEC VAX, AMD x86-64, AXIS CRIS,
|
||||
Cris, Xtensa, AVR32 and Renesas M32R architectures.
|
||||
Xtensa, AVR32 and Renesas M32R architectures.
|
||||
|
||||
Linux is easily portable to most general-purpose 32- or 64-bit architectures
|
||||
as long as they have a paged memory management unit (PMMU) and a port of the
|
||||
|
@ -40,8 +40,6 @@
|
||||
# define DBG_CFG(args)
|
||||
#endif
|
||||
|
||||
#define MCPCIA_MAX_HOSES 4
|
||||
|
||||
/*
|
||||
* Given a bus, device, and function number, compute resulting
|
||||
* configuration space address and setup the MCPCIA_HAXR2 register
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <asm/smp.h>
|
||||
#include <asm/err_common.h>
|
||||
#include <asm/err_ev6.h>
|
||||
#include <asm/irq_regs.h>
|
||||
|
||||
#include "err_impl.h"
|
||||
#include "proto.h"
|
||||
|
@ -285,12 +285,12 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
|
||||
reloc_overflow:
|
||||
if (ELF64_ST_TYPE (sym->st_info) == STT_SECTION)
|
||||
printk(KERN_ERR
|
||||
"module %s: Relocation overflow vs section %d\n",
|
||||
me->name, sym->st_shndx);
|
||||
"module %s: Relocation (type %lu) overflow vs section %d\n",
|
||||
me->name, r_type, sym->st_shndx);
|
||||
else
|
||||
printk(KERN_ERR
|
||||
"module %s: Relocation overflow vs %s\n",
|
||||
me->name, strtab + sym->st_name);
|
||||
"module %s: Relocation (type %lu) overflow vs %s\n",
|
||||
me->name, r_type, strtab + sym->st_name);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
}
|
||||
|
@ -70,6 +70,12 @@ nautilus_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
/* Preserve the IRQ set up by the console. */
|
||||
|
||||
u8 irq;
|
||||
/* UP1500: AGP INTA is actually routed to IRQ 5, not IRQ 10 as
|
||||
console reports. Check the device id of AGP bridge to distinguish
|
||||
UP1500 from UP1000/1100. Note: 'pin' is 2 due to bridge swizzle. */
|
||||
if (slot == 1 && pin == 2 &&
|
||||
dev->bus->self && dev->bus->self->device == 0x700f)
|
||||
return 5;
|
||||
pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
|
||||
return irq;
|
||||
}
|
||||
|
@ -66,6 +66,13 @@ noritake_startup_irq(unsigned int irq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
noritake_end_irq(unsigned int irq)
|
||||
{
|
||||
if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
noritake_enable_irq(irq);
|
||||
}
|
||||
|
||||
static struct hw_interrupt_type noritake_irq_type = {
|
||||
.typename = "NORITAKE",
|
||||
.startup = noritake_startup_irq,
|
||||
@ -73,7 +80,7 @@ static struct hw_interrupt_type noritake_irq_type = {
|
||||
.enable = noritake_enable_irq,
|
||||
.disable = noritake_disable_irq,
|
||||
.ack = noritake_disable_irq,
|
||||
.end = noritake_enable_irq,
|
||||
.end = noritake_end_irq,
|
||||
};
|
||||
|
||||
static void
|
||||
|
@ -52,6 +52,9 @@ rawhide_update_irq_hw(int hose, int mask)
|
||||
*(vuip)MCPCIA_INT_MASK0(MCPCIA_HOSE2MID(hose));
|
||||
}
|
||||
|
||||
#define hose_exists(h) \
|
||||
(((h) < MCPCIA_MAX_HOSES) && (cached_irq_masks[(h)] != 0))
|
||||
|
||||
static inline void
|
||||
rawhide_enable_irq(unsigned int irq)
|
||||
{
|
||||
@ -59,6 +62,9 @@ rawhide_enable_irq(unsigned int irq)
|
||||
|
||||
irq -= 16;
|
||||
hose = irq / 24;
|
||||
if (!hose_exists(hose)) /* if hose non-existent, exit */
|
||||
return;
|
||||
|
||||
irq -= hose * 24;
|
||||
mask = 1 << irq;
|
||||
|
||||
@ -76,6 +82,9 @@ rawhide_disable_irq(unsigned int irq)
|
||||
|
||||
irq -= 16;
|
||||
hose = irq / 24;
|
||||
if (!hose_exists(hose)) /* if hose non-existent, exit */
|
||||
return;
|
||||
|
||||
irq -= hose * 24;
|
||||
mask = ~(1 << irq) | hose_irq_masks[hose];
|
||||
|
||||
@ -93,6 +102,9 @@ rawhide_mask_and_ack_irq(unsigned int irq)
|
||||
|
||||
irq -= 16;
|
||||
hose = irq / 24;
|
||||
if (!hose_exists(hose)) /* if hose non-existent, exit */
|
||||
return;
|
||||
|
||||
irq -= hose * 24;
|
||||
mask1 = 1 << irq;
|
||||
mask = ~mask1 | hose_irq_masks[hose];
|
||||
@ -169,6 +181,9 @@ rawhide_init_irq(void)
|
||||
|
||||
mcpcia_init_hoses();
|
||||
|
||||
/* Clear them all; only hoses that exist will be non-zero. */
|
||||
for (i = 0; i < MCPCIA_MAX_HOSES; i++) cached_irq_masks[i] = 0;
|
||||
|
||||
for (hose = hose_head; hose; hose = hose->next) {
|
||||
unsigned int h = hose->index;
|
||||
unsigned int mask = hose_irq_masks[h];
|
||||
|
@ -84,12 +84,16 @@ alphabook1_init_arch(void)
|
||||
static void __init
|
||||
sio_pci_route(void)
|
||||
{
|
||||
#if defined(ALPHA_RESTORE_SRM_SETUP)
|
||||
/* First, read and save the original setting. */
|
||||
unsigned int orig_route_tab;
|
||||
|
||||
/* First, ALWAYS read and print the original setting. */
|
||||
pci_bus_read_config_dword(pci_isa_hose->bus, PCI_DEVFN(7, 0), 0x60,
|
||||
&saved_config.orig_route_tab);
|
||||
&orig_route_tab);
|
||||
printk("%s: PIRQ original 0x%x new 0x%x\n", __FUNCTION__,
|
||||
saved_config.orig_route_tab, alpha_mv.sys.sio.route_tab);
|
||||
orig_route_tab, alpha_mv.sys.sio.route_tab);
|
||||
|
||||
#if defined(ALPHA_RESTORE_SRM_SETUP)
|
||||
saved_config.orig_route_tab = orig_route_tab;
|
||||
#endif
|
||||
|
||||
/* Now override with desired setting. */
|
||||
@ -334,7 +338,7 @@ struct alpha_machine_vector avanti_mv __initmv = {
|
||||
.pci_swizzle = common_swizzle,
|
||||
|
||||
.sys = { .sio = {
|
||||
.route_tab = 0x0b0a0e0f,
|
||||
.route_tab = 0x0b0a050f, /* leave 14 for IDE, 9 for SND */
|
||||
}}
|
||||
};
|
||||
ALIAS_MV(avanti)
|
||||
|
@ -132,7 +132,7 @@ sx164_init_arch(void)
|
||||
|
||||
if (amask(AMASK_MAX) != 0
|
||||
&& alpha_using_srm
|
||||
&& (cpu->pal_revision & 0xffff) == 0x117) {
|
||||
&& (cpu->pal_revision & 0xffff) <= 0x117) {
|
||||
__asm__ __volatile__(
|
||||
"lda $16,8($31)\n"
|
||||
"call_pal 9\n" /* Allow PALRES insns in kernel mode */
|
||||
|
@ -257,8 +257,7 @@ titan_dispatch_irqs(u64 mask)
|
||||
*/
|
||||
while (mask) {
|
||||
/* convert to SRM vector... priority is <63> -> <0> */
|
||||
__asm__("ctlz %1, %0" : "=r"(vector) : "r"(mask));
|
||||
vector = 63 - vector;
|
||||
vector = 63 - __kernel_ctlz(mask);
|
||||
mask &= ~(1UL << vector); /* clear it out */
|
||||
vector = 0x900 + (vector << 4); /* convert to SRM vector */
|
||||
|
||||
|
@ -36,7 +36,6 @@ lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \
|
||||
$(ev6-y)csum_ipv6_magic.o \
|
||||
$(ev6-y)clear_page.o \
|
||||
$(ev6-y)copy_page.o \
|
||||
strcasecmp.o \
|
||||
fpreg.o \
|
||||
callback_srm.o srm_puts.o srm_printk.o
|
||||
|
||||
|
@ -1,26 +0,0 @@
|
||||
/*
|
||||
* linux/arch/alpha/lib/strcasecmp.c
|
||||
*/
|
||||
|
||||
#include <linux/string.h>
|
||||
|
||||
|
||||
/* We handle nothing here except the C locale. Since this is used in
|
||||
only one place, on strings known to contain only 7 bit ASCII, this
|
||||
is ok. */
|
||||
|
||||
int strcasecmp(const char *a, const char *b)
|
||||
{
|
||||
int ca, cb;
|
||||
|
||||
do {
|
||||
ca = *a++ & 0xff;
|
||||
cb = *b++ & 0xff;
|
||||
if (ca >= 'A' && ca <= 'Z')
|
||||
ca += 'a' - 'A';
|
||||
if (cb >= 'A' && cb <= 'Z')
|
||||
cb += 'a' - 'A';
|
||||
} while (ca == cb && ca != '\0');
|
||||
|
||||
return ca - cb;
|
||||
}
|
@ -21,6 +21,10 @@ config ARM
|
||||
config SYS_SUPPORTS_APM_EMULATION
|
||||
bool
|
||||
|
||||
config GENERIC_GPIO
|
||||
bool
|
||||
default n
|
||||
|
||||
config GENERIC_TIME
|
||||
bool
|
||||
default n
|
||||
@ -163,6 +167,7 @@ config ARCH_VERSATILE
|
||||
|
||||
config ARCH_AT91
|
||||
bool "Atmel AT91"
|
||||
select GENERIC_GPIO
|
||||
help
|
||||
This enables support for systems based on the Atmel AT91RM9200
|
||||
and AT91SAM9xxx processors.
|
||||
@ -171,6 +176,7 @@ config ARCH_CLPS7500
|
||||
bool "Cirrus CL-PS7500FE"
|
||||
select TIMER_ACORN
|
||||
select ISA
|
||||
select NO_IOPORT
|
||||
help
|
||||
Support for the Cirrus Logic PS7500FE system-on-a-chip.
|
||||
|
||||
@ -189,6 +195,7 @@ config ARCH_CO285
|
||||
config ARCH_EBSA110
|
||||
bool "EBSA-110"
|
||||
select ISA
|
||||
select NO_IOPORT
|
||||
help
|
||||
This is an evaluation board for the StrongARM processor available
|
||||
from Digital. It has limited hardware on-board, including an
|
||||
@ -245,6 +252,8 @@ config ARCH_IOP33X
|
||||
|
||||
config ARCH_IOP13XX
|
||||
bool "IOP13xx-based"
|
||||
depends on MMU
|
||||
select PLAT_IOP
|
||||
select PCI
|
||||
help
|
||||
Support for Intel's IOP13XX (XScale) family of processors.
|
||||
@ -283,6 +292,14 @@ config ARCH_L7200
|
||||
If you have any questions or comments about the Linux kernel port
|
||||
to this board, send e-mail to <sjhill@cotw.com>.
|
||||
|
||||
config ARCH_NS9XXX
|
||||
bool "NetSilicon NS9xxx"
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a NetSilicon NS9xxx
|
||||
System.
|
||||
|
||||
<http://www.digi.com/products/microprocessors/index.jsp>
|
||||
|
||||
config ARCH_PNX4008
|
||||
bool "Philips Nexperia PNX4008 Mobile"
|
||||
help
|
||||
@ -292,6 +309,8 @@ config ARCH_PXA
|
||||
bool "PXA2xx-based"
|
||||
depends on MMU
|
||||
select ARCH_MTD_XIP
|
||||
select GENERIC_GPIO
|
||||
select GENERIC_TIME
|
||||
help
|
||||
Support for Intel's PXA2XX processor line.
|
||||
|
||||
@ -312,11 +331,13 @@ config ARCH_SA1100
|
||||
select ISA
|
||||
select ARCH_DISCONTIGMEM_ENABLE
|
||||
select ARCH_MTD_XIP
|
||||
select GENERIC_GPIO
|
||||
help
|
||||
Support for StrongARM 11x0 based boards.
|
||||
|
||||
config ARCH_S3C2410
|
||||
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442"
|
||||
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"
|
||||
select GENERIC_GPIO
|
||||
help
|
||||
Samsung S3C2410X CPU based systems, such as the Simtec Electronics
|
||||
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
|
||||
@ -341,6 +362,7 @@ config ARCH_LH7A40X
|
||||
|
||||
config ARCH_OMAP
|
||||
bool "TI OMAP"
|
||||
select GENERIC_GPIO
|
||||
help
|
||||
Support for TI's OMAP platform (OMAP1 and OMAP2).
|
||||
|
||||
@ -376,7 +398,16 @@ source "arch/arm/mach-omap1/Kconfig"
|
||||
|
||||
source "arch/arm/mach-omap2/Kconfig"
|
||||
|
||||
source "arch/arm/plat-s3c24xx/Kconfig"
|
||||
|
||||
if ARCH_S3C2410
|
||||
source "arch/arm/mach-s3c2400/Kconfig"
|
||||
source "arch/arm/mach-s3c2410/Kconfig"
|
||||
source "arch/arm/mach-s3c2412/Kconfig"
|
||||
source "arch/arm/mach-s3c2440/Kconfig"
|
||||
source "arch/arm/mach-s3c2442/Kconfig"
|
||||
source "arch/arm/mach-s3c2443/Kconfig"
|
||||
endif
|
||||
|
||||
source "arch/arm/mach-lh7a40x/Kconfig"
|
||||
|
||||
@ -390,10 +421,12 @@ source "arch/arm/mach-aaec2000/Kconfig"
|
||||
|
||||
source "arch/arm/mach-realview/Kconfig"
|
||||
|
||||
source "arch/arm/mach-at91rm9200/Kconfig"
|
||||
source "arch/arm/mach-at91/Kconfig"
|
||||
|
||||
source "arch/arm/mach-netx/Kconfig"
|
||||
|
||||
source "arch/arm/mach-ns9xxx/Kconfig"
|
||||
|
||||
# Definitions to make life easier
|
||||
config ARCH_ACORN
|
||||
bool
|
||||
@ -405,7 +438,7 @@ source arch/arm/mm/Kconfig
|
||||
|
||||
config IWMMXT
|
||||
bool "Enable iWMMXt support"
|
||||
depends CPU_XSCALE || CPU_XSC3
|
||||
depends on CPU_XSCALE || CPU_XSC3
|
||||
default y if PXA27x
|
||||
help
|
||||
Enable support for iWMMXt context switching at run time if
|
||||
@ -751,6 +784,20 @@ config XIP_PHYS_ADDR
|
||||
be linked for and stored to. This address is dependent on your
|
||||
own flash usage.
|
||||
|
||||
config KEXEC
|
||||
bool "Kexec system call (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
but it is indepedent of the system firmware. And like a reboot
|
||||
you can start any kernel with it, not just Linux.
|
||||
|
||||
It is an ongoing process to be certain the hardware in a machine
|
||||
is properly shutdown, so do not be surprised if this code does not
|
||||
initially work for you. It may help to enable device hotplugging
|
||||
support.
|
||||
|
||||
endmenu
|
||||
|
||||
if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX )
|
||||
|
@ -124,10 +124,12 @@ endif
|
||||
machine-$(CONFIG_ARCH_H720X) := h720x
|
||||
machine-$(CONFIG_ARCH_AAEC2000) := aaec2000
|
||||
machine-$(CONFIG_ARCH_REALVIEW) := realview
|
||||
machine-$(CONFIG_ARCH_AT91) := at91rm9200
|
||||
machine-$(CONFIG_ARCH_AT91) := at91
|
||||
machine-$(CONFIG_ARCH_EP93XX) := ep93xx
|
||||
machine-$(CONFIG_ARCH_PNX4008) := pnx4008
|
||||
machine-$(CONFIG_ARCH_NETX) := netx
|
||||
machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx
|
||||
textofs-$(CONFIG_ARCH_NS9XXX) := 0x00108000
|
||||
|
||||
ifeq ($(CONFIG_ARCH_EBSA110),y)
|
||||
# This is what happens if you forget the IOCS16 line.
|
||||
@ -161,6 +163,11 @@ endif
|
||||
# If we have a machine-specific directory, then include it in the build.
|
||||
core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
|
||||
core-y += $(MACHINE)
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2400/
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2412/
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2440/
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2442/
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2443/
|
||||
core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
|
||||
core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
|
||||
core-$(CONFIG_VFP) += arch/arm/vfp/
|
||||
@ -168,6 +175,7 @@ core-$(CONFIG_VFP) += arch/arm/vfp/
|
||||
# If we have a common platform directory, then include it in the build.
|
||||
core-$(CONFIG_PLAT_IOP) += arch/arm/plat-iop/
|
||||
core-$(CONFIG_ARCH_OMAP) += arch/arm/plat-omap/
|
||||
core-$(CONFIG_PLAT_S3C24XX) += arch/arm/plat-s3c24xx/
|
||||
|
||||
drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/
|
||||
drivers-$(CONFIG_ARCH_CLPS7500) += drivers/acorn/char/
|
||||
|
2
arch/arm/boot/.gitignore
vendored
Normal file
2
arch/arm/boot/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
Image
|
||||
zImage
|
1
arch/arm/boot/compressed/.gitignore
vendored
Normal file
1
arch/arm/boot/compressed/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
piggy.gz
|
@ -28,6 +28,7 @@ config SHARP_PARAM
|
||||
|
||||
config SHARPSL_PM
|
||||
bool
|
||||
select APM_EMULATION
|
||||
|
||||
config SHARP_SCOOP
|
||||
bool
|
||||
|
@ -32,7 +32,6 @@
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#undef DEBUG
|
||||
#undef STATS
|
||||
|
||||
#ifdef STATS
|
||||
@ -66,14 +65,13 @@ struct dmabounce_pool {
|
||||
};
|
||||
|
||||
struct dmabounce_device_info {
|
||||
struct list_head node;
|
||||
|
||||
struct device *dev;
|
||||
struct list_head safe_buffers;
|
||||
#ifdef STATS
|
||||
unsigned long total_allocs;
|
||||
unsigned long map_op_count;
|
||||
unsigned long bounce_count;
|
||||
int attr_res;
|
||||
#endif
|
||||
struct dmabounce_pool small;
|
||||
struct dmabounce_pool large;
|
||||
@ -81,34 +79,24 @@ struct dmabounce_device_info {
|
||||
rwlock_t lock;
|
||||
};
|
||||
|
||||
static LIST_HEAD(dmabounce_devs);
|
||||
|
||||
#ifdef STATS
|
||||
static void print_alloc_stats(struct dmabounce_device_info *device_info)
|
||||
static ssize_t dmabounce_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
printk(KERN_INFO
|
||||
"%s: dmabounce: sbp: %lu, lbp: %lu, other: %lu, total: %lu\n",
|
||||
device_info->dev->bus_id,
|
||||
device_info->small.allocs, device_info->large.allocs,
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
return sprintf(buf, "%lu %lu %lu %lu %lu %lu\n",
|
||||
device_info->small.allocs,
|
||||
device_info->large.allocs,
|
||||
device_info->total_allocs - device_info->small.allocs -
|
||||
device_info->large.allocs,
|
||||
device_info->total_allocs);
|
||||
device_info->total_allocs,
|
||||
device_info->map_op_count,
|
||||
device_info->bounce_count);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(dmabounce_stats, 0400, dmabounce_show, NULL);
|
||||
#endif
|
||||
|
||||
/* find the given device in the dmabounce device list */
|
||||
static inline struct dmabounce_device_info *
|
||||
find_dmabounce_dev(struct device *dev)
|
||||
{
|
||||
struct dmabounce_device_info *d;
|
||||
|
||||
list_for_each_entry(d, &dmabounce_devs, node)
|
||||
if (d->dev == dev)
|
||||
return d;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* allocate a 'safe' buffer and keep track of it */
|
||||
static inline struct safe_buffer *
|
||||
@ -162,8 +150,6 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr,
|
||||
if (pool)
|
||||
pool->allocs++;
|
||||
device_info->total_allocs++;
|
||||
if (device_info->total_allocs % 1000 == 0)
|
||||
print_alloc_stats(device_info);
|
||||
#endif
|
||||
|
||||
write_lock_irqsave(&device_info->lock, flags);
|
||||
@ -218,20 +204,11 @@ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer *
|
||||
|
||||
/* ************************************************** */
|
||||
|
||||
#ifdef STATS
|
||||
static void print_map_stats(struct dmabounce_device_info *device_info)
|
||||
{
|
||||
dev_info(device_info->dev,
|
||||
"dmabounce: map_op_count=%lu, bounce_count=%lu\n",
|
||||
device_info->map_op_count, device_info->bounce_count);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline dma_addr_t
|
||||
map_single(struct device *dev, void *ptr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
dma_addr_t dma_addr;
|
||||
int needs_bounce = 0;
|
||||
|
||||
@ -281,9 +258,13 @@ map_single(struct device *dev, void *ptr, size_t size,
|
||||
ptr = buf->safe;
|
||||
|
||||
dma_addr = buf->safe_dma_addr;
|
||||
}
|
||||
|
||||
} else {
|
||||
/*
|
||||
* We don't need to sync the DMA buffer since
|
||||
* it was allocated via the coherent allocators.
|
||||
*/
|
||||
consistent_sync(ptr, size, dir);
|
||||
}
|
||||
|
||||
return dma_addr;
|
||||
}
|
||||
@ -292,7 +273,7 @@ static inline void
|
||||
unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
struct safe_buffer *buf = NULL;
|
||||
|
||||
/*
|
||||
@ -317,12 +298,12 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
DO_STATS ( device_info->bounce_count++ );
|
||||
|
||||
if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {
|
||||
unsigned long ptr;
|
||||
void *ptr = buf->ptr;
|
||||
|
||||
dev_dbg(dev,
|
||||
"%s: copy back safe %p to unsafe %p size %d\n",
|
||||
__func__, buf->safe, buf->ptr, size);
|
||||
memcpy(buf->ptr, buf->safe, size);
|
||||
__func__, buf->safe, ptr, size);
|
||||
memcpy(ptr, buf->safe, size);
|
||||
|
||||
/*
|
||||
* DMA buffers must have the same cache properties
|
||||
@ -332,8 +313,8 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
* bidirectional case because we know the cache
|
||||
* lines will be coherent with the data written.
|
||||
*/
|
||||
ptr = (unsigned long)buf->ptr;
|
||||
dmac_clean_range(ptr, ptr + size);
|
||||
outer_clean_range(__pa(ptr), __pa(ptr) + size);
|
||||
}
|
||||
free_safe_buffer(device_info, buf);
|
||||
}
|
||||
@ -343,7 +324,7 @@ static inline void
|
||||
sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
struct safe_buffer *buf = NULL;
|
||||
|
||||
if (device_info)
|
||||
@ -397,7 +378,10 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
consistent_sync(buf->safe, size, dir);
|
||||
/*
|
||||
* No need to sync the safe buffer - it was allocated
|
||||
* via the coherent allocators.
|
||||
*/
|
||||
} else {
|
||||
consistent_sync(dma_to_virt(dev, dma_addr), size, dir);
|
||||
}
|
||||
@ -604,9 +588,10 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
||||
device_info->total_allocs = 0;
|
||||
device_info->map_op_count = 0;
|
||||
device_info->bounce_count = 0;
|
||||
device_info->attr_res = device_create_file(dev, &dev_attr_dmabounce_stats);
|
||||
#endif
|
||||
|
||||
list_add(&device_info->node, &dmabounce_devs);
|
||||
dev->archdata.dmabounce = device_info;
|
||||
|
||||
printk(KERN_INFO "dmabounce: registered device %s on %s bus\n",
|
||||
dev->bus_id, dev->bus->name);
|
||||
@ -623,7 +608,9 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
||||
void
|
||||
dmabounce_unregister_dev(struct device *dev)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
|
||||
dev->archdata.dmabounce = NULL;
|
||||
|
||||
if (!device_info) {
|
||||
printk(KERN_WARNING
|
||||
@ -645,12 +632,10 @@ dmabounce_unregister_dev(struct device *dev)
|
||||
dma_pool_destroy(device_info->large.pool);
|
||||
|
||||
#ifdef STATS
|
||||
print_alloc_stats(device_info);
|
||||
print_map_stats(device_info);
|
||||
if (device_info->attr_res == 0)
|
||||
device_remove_file(dev, &dev_attr_dmabounce_stats);
|
||||
#endif
|
||||
|
||||
list_del(&device_info->node);
|
||||
|
||||
kfree(device_info);
|
||||
|
||||
printk(KERN_INFO "dmabounce: device %s on %s bus unregistered\n",
|
||||
|
@ -14,7 +14,9 @@
|
||||
*
|
||||
* o There is one CPU Interface per CPU, which sends interrupts sent
|
||||
* by the Distributor, and interrupts generated locally, to the
|
||||
* associated CPU.
|
||||
* associated CPU. The base address of the CPU interface is usually
|
||||
* aliased so that the same address points to different chips depending
|
||||
* on the CPU it is accessed from.
|
||||
*
|
||||
* Note that IRQs 0-31 are special - they are local to each CPU.
|
||||
* As such, the enable set/clear, pending set/clear and active bit
|
||||
@ -31,10 +33,38 @@
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
|
||||
static void __iomem *gic_dist_base;
|
||||
static void __iomem *gic_cpu_base;
|
||||
static DEFINE_SPINLOCK(irq_controller_lock);
|
||||
|
||||
struct gic_chip_data {
|
||||
unsigned int irq_offset;
|
||||
void __iomem *dist_base;
|
||||
void __iomem *cpu_base;
|
||||
};
|
||||
|
||||
#ifndef MAX_GIC_NR
|
||||
#define MAX_GIC_NR 1
|
||||
#endif
|
||||
|
||||
static struct gic_chip_data gic_data[MAX_GIC_NR];
|
||||
|
||||
static inline void __iomem *gic_dist_base(unsigned int irq)
|
||||
{
|
||||
struct gic_chip_data *gic_data = get_irq_chip_data(irq);
|
||||
return gic_data->dist_base;
|
||||
}
|
||||
|
||||
static inline void __iomem *gic_cpu_base(unsigned int irq)
|
||||
{
|
||||
struct gic_chip_data *gic_data = get_irq_chip_data(irq);
|
||||
return gic_data->cpu_base;
|
||||
}
|
||||
|
||||
static inline unsigned int gic_irq(unsigned int irq)
|
||||
{
|
||||
struct gic_chip_data *gic_data = get_irq_chip_data(irq);
|
||||
return irq - gic_data->irq_offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Routines to acknowledge, disable and enable interrupts
|
||||
*
|
||||
@ -55,8 +85,8 @@ static void gic_ack_irq(unsigned int irq)
|
||||
u32 mask = 1 << (irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4);
|
||||
writel(irq, gic_cpu_base + GIC_CPU_EOI);
|
||||
writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_CLEAR + (gic_irq(irq) / 32) * 4);
|
||||
writel(gic_irq(irq), gic_cpu_base(irq) + GIC_CPU_EOI);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
@ -65,7 +95,7 @@ static void gic_mask_irq(unsigned int irq)
|
||||
u32 mask = 1 << (irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4);
|
||||
writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_CLEAR + (gic_irq(irq) / 32) * 4);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
@ -74,14 +104,14 @@ static void gic_unmask_irq(unsigned int irq)
|
||||
u32 mask = 1 << (irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_SET + (irq / 32) * 4);
|
||||
writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_SET + (gic_irq(irq) / 32) * 4);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
|
||||
{
|
||||
void __iomem *reg = gic_dist_base + GIC_DIST_TARGET + (irq & ~3);
|
||||
void __iomem *reg = gic_dist_base(irq) + GIC_DIST_TARGET + (gic_irq(irq) & ~3);
|
||||
unsigned int shift = (irq % 4) * 8;
|
||||
unsigned int cpu = first_cpu(mask_val);
|
||||
u32 val;
|
||||
@ -95,6 +125,37 @@ static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void fastcall gic_handle_cascade_irq(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
struct gic_chip_data *chip_data = get_irq_data(irq);
|
||||
struct irq_chip *chip = get_irq_chip(irq);
|
||||
unsigned int cascade_irq;
|
||||
unsigned long status;
|
||||
|
||||
/* primary controller ack'ing */
|
||||
chip->ack(irq);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
status = readl(chip_data->cpu_base + GIC_CPU_INTACK);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
|
||||
cascade_irq = (status & 0x3ff);
|
||||
if (cascade_irq > 1020)
|
||||
goto out;
|
||||
if (cascade_irq < 32 || cascade_irq >= NR_IRQS) {
|
||||
do_bad_IRQ(cascade_irq, desc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
cascade_irq += chip_data->irq_offset;
|
||||
generic_handle_irq(cascade_irq);
|
||||
|
||||
out:
|
||||
/* primary controller unmasking */
|
||||
chip->unmask(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip gic_chip = {
|
||||
.name = "GIC",
|
||||
.ack = gic_ack_irq,
|
||||
@ -105,15 +166,29 @@ static struct irq_chip gic_chip = {
|
||||
#endif
|
||||
};
|
||||
|
||||
void __init gic_dist_init(void __iomem *base)
|
||||
void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
|
||||
{
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
if (set_irq_data(irq, &gic_data[gic_nr]) != 0)
|
||||
BUG();
|
||||
set_irq_chained_handler(irq, gic_handle_cascade_irq);
|
||||
}
|
||||
|
||||
void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
|
||||
unsigned int irq_start)
|
||||
{
|
||||
unsigned int max_irq, i;
|
||||
u32 cpumask = 1 << smp_processor_id();
|
||||
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
|
||||
cpumask |= cpumask << 8;
|
||||
cpumask |= cpumask << 16;
|
||||
|
||||
gic_dist_base = base;
|
||||
gic_data[gic_nr].dist_base = base;
|
||||
gic_data[gic_nr].irq_offset = (irq_start - 1) & ~31;
|
||||
|
||||
writel(0, base + GIC_DIST_CTRL);
|
||||
|
||||
@ -158,8 +233,9 @@ void __init gic_dist_init(void __iomem *base)
|
||||
/*
|
||||
* Setup the Linux IRQ subsystem.
|
||||
*/
|
||||
for (i = 29; i < max_irq; i++) {
|
||||
for (i = irq_start; i < gic_data[gic_nr].irq_offset + max_irq; i++) {
|
||||
set_irq_chip(i, &gic_chip);
|
||||
set_irq_chip_data(i, &gic_data[gic_nr]);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
|
||||
}
|
||||
@ -167,9 +243,13 @@ void __init gic_dist_init(void __iomem *base)
|
||||
writel(1, base + GIC_DIST_CTRL);
|
||||
}
|
||||
|
||||
void __cpuinit gic_cpu_init(void __iomem *base)
|
||||
void __cpuinit gic_cpu_init(unsigned int gic_nr, void __iomem *base)
|
||||
{
|
||||
gic_cpu_base = base;
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
|
||||
gic_data[gic_nr].cpu_base = base;
|
||||
|
||||
writel(0xf0, base + GIC_CPU_PRIMASK);
|
||||
writel(1, base + GIC_CPU_CTRL);
|
||||
}
|
||||
@ -179,6 +259,7 @@ void gic_raise_softirq(cpumask_t cpumask, unsigned int irq)
|
||||
{
|
||||
unsigned long map = *cpus_addr(cpumask);
|
||||
|
||||
writel(map << 16 | irq, gic_dist_base + GIC_DIST_SOFTINT);
|
||||
/* this always happens on GIC0 */
|
||||
writel(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT);
|
||||
}
|
||||
#endif
|
||||
|
@ -23,11 +23,11 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/apm-emulation.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/apm-emulation.h>
|
||||
#include <asm/arch/pm.h>
|
||||
#include <asm/arch/pxa-regs.h>
|
||||
#include <asm/arch/sharpsl.h>
|
||||
@ -766,10 +766,10 @@ static void sharpsl_apm_get_power_status(struct apm_power_info *info)
|
||||
}
|
||||
|
||||
static struct pm_ops sharpsl_pm_ops = {
|
||||
.pm_disk_mode = PM_DISK_FIRMWARE,
|
||||
.prepare = pxa_pm_prepare,
|
||||
.enter = corgi_pxa_pm_enter,
|
||||
.finish = pxa_pm_finish,
|
||||
.valid = pm_valid_only_mem,
|
||||
};
|
||||
|
||||
static int __init sharpsl_pm_probe(struct platform_device *pdev)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user