cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

parport-lowlevel.rst (37998B)


      1===============================
      2PARPORT interface documentation
      3===============================
      4
      5:Time-stamp: <2000-02-24 13:30:20 twaugh>
      6
      7Described here are the following functions:
      8
      9Global functions::
     10  parport_register_driver
     11  parport_unregister_driver
     12  parport_enumerate
     13  parport_register_device
     14  parport_unregister_device
     15  parport_claim
     16  parport_claim_or_block
     17  parport_release
     18  parport_yield
     19  parport_yield_blocking
     20  parport_wait_peripheral
     21  parport_poll_peripheral
     22  parport_wait_event
     23  parport_negotiate
     24  parport_read
     25  parport_write
     26  parport_open
     27  parport_close
     28  parport_device_id
     29  parport_device_coords
     30  parport_find_class
     31  parport_find_device
     32  parport_set_timeout
     33
     34Port functions (can be overridden by low-level drivers):
     35
     36  SPP::
     37    port->ops->read_data
     38    port->ops->write_data
     39    port->ops->read_status
     40    port->ops->read_control
     41    port->ops->write_control
     42    port->ops->frob_control
     43    port->ops->enable_irq
     44    port->ops->disable_irq
     45    port->ops->data_forward
     46    port->ops->data_reverse
     47
     48  EPP::
     49    port->ops->epp_write_data
     50    port->ops->epp_read_data
     51    port->ops->epp_write_addr
     52    port->ops->epp_read_addr
     53
     54  ECP::
     55    port->ops->ecp_write_data
     56    port->ops->ecp_read_data
     57    port->ops->ecp_write_addr
     58
     59  Other::
     60    port->ops->nibble_read_data
     61    port->ops->byte_read_data
     62    port->ops->compat_write_data
     63
     64The parport subsystem comprises ``parport`` (the core port-sharing
     65code), and a variety of low-level drivers that actually do the port
     66accesses.  Each low-level driver handles a particular style of port
     67(PC, Amiga, and so on).
     68
     69The parport interface to the device driver author can be broken down
     70into global functions and port functions.
     71
     72The global functions are mostly for communicating between the device
     73driver and the parport subsystem: acquiring a list of available ports,
     74claiming a port for exclusive use, and so on.  They also include
     75``generic`` functions for doing standard things that will work on any
     76IEEE 1284-capable architecture.
     77
     78The port functions are provided by the low-level drivers, although the
     79core parport module provides generic ``defaults`` for some routines.
     80The port functions can be split into three groups: SPP, EPP, and ECP.
     81
     82SPP (Standard Parallel Port) functions modify so-called ``SPP``
     83registers: data, status, and control.  The hardware may not actually
     84have registers exactly like that, but the PC does and this interface is
     85modelled after common PC implementations.  Other low-level drivers may
     86be able to emulate most of the functionality.
     87
     88EPP (Enhanced Parallel Port) functions are provided for reading and
     89writing in IEEE 1284 EPP mode, and ECP (Extended Capabilities Port)
     90functions are used for IEEE 1284 ECP mode. (What about BECP? Does
     91anyone care?)
     92
     93Hardware assistance for EPP and/or ECP transfers may or may not be
     94available, and if it is available it may or may not be used.  If
     95hardware is not used, the transfer will be software-driven.  In order
     96to cope with peripherals that only tenuously support IEEE 1284, a
     97low-level driver specific function is provided, for altering 'fudge
     98factors'.
     99
    100Global functions
    101================
    102
    103parport_register_driver - register a device driver with parport
    104---------------------------------------------------------------
    105
    106SYNOPSIS
    107^^^^^^^^
    108
    109::
    110
    111	#include <linux/parport.h>
    112
    113	struct parport_driver {
    114		const char *name;
    115		void (*attach) (struct parport *);
    116		void (*detach) (struct parport *);
    117		struct parport_driver *next;
    118	};
    119	int parport_register_driver (struct parport_driver *driver);
    120
    121DESCRIPTION
    122^^^^^^^^^^^
    123
    124In order to be notified about parallel ports when they are detected,
    125parport_register_driver should be called.  Your driver will
    126immediately be notified of all ports that have already been detected,
    127and of each new port as low-level drivers are loaded.
    128
    129A ``struct parport_driver`` contains the textual name of your driver,
    130a pointer to a function to handle new ports, and a pointer to a
    131function to handle ports going away due to a low-level driver
    132unloading.  Ports will only be detached if they are not being used
    133(i.e. there are no devices registered on them).
    134
    135The visible parts of the ``struct parport *`` argument given to
    136attach/detach are::
    137
    138	struct parport
    139	{
    140		struct parport *next; /* next parport in list */
    141		const char *name;     /* port's name */
    142		unsigned int modes;   /* bitfield of hardware modes */
    143		struct parport_device_info probe_info;
    144				/* IEEE1284 info */
    145		int number;           /* parport index */
    146		struct parport_operations *ops;
    147		...
    148	};
    149
    150There are other members of the structure, but they should not be
    151touched.
    152
    153The ``modes`` member summarises the capabilities of the underlying
    154hardware.  It consists of flags which may be bitwise-ored together:
    155
    156  ============================= ===============================================
    157  PARPORT_MODE_PCSPP		IBM PC registers are available,
    158				i.e. functions that act on data,
    159				control and status registers are
    160				probably writing directly to the
    161				hardware.
    162  PARPORT_MODE_TRISTATE		The data drivers may be turned off.
    163				This allows the data lines to be used
    164				for reverse (peripheral to host)
    165				transfers.
    166  PARPORT_MODE_COMPAT		The hardware can assist with
    167				compatibility-mode (printer)
    168				transfers, i.e. compat_write_block.
    169  PARPORT_MODE_EPP		The hardware can assist with EPP
    170				transfers.
    171  PARPORT_MODE_ECP		The hardware can assist with ECP
    172				transfers.
    173  PARPORT_MODE_DMA		The hardware can use DMA, so you might
    174				want to pass ISA DMA-able memory
    175				(i.e. memory allocated using the
    176				GFP_DMA flag with kmalloc) to the
    177				low-level driver in order to take
    178				advantage of it.
    179  ============================= ===============================================
    180
    181There may be other flags in ``modes`` as well.
    182
    183The contents of ``modes`` is advisory only.  For example, if the
    184hardware is capable of DMA, and PARPORT_MODE_DMA is in ``modes``, it
    185doesn't necessarily mean that DMA will always be used when possible.
    186Similarly, hardware that is capable of assisting ECP transfers won't
    187necessarily be used.
    188
    189RETURN VALUE
    190^^^^^^^^^^^^
    191
    192Zero on success, otherwise an error code.
    193
    194ERRORS
    195^^^^^^
    196
    197None. (Can it fail? Why return int?)
    198
    199EXAMPLE
    200^^^^^^^
    201
    202::
    203
    204	static void lp_attach (struct parport *port)
    205	{
    206		...
    207		private = kmalloc (...);
    208		dev[count++] = parport_register_device (...);
    209		...
    210	}
    211
    212	static void lp_detach (struct parport *port)
    213	{
    214		...
    215	}
    216
    217	static struct parport_driver lp_driver = {
    218		"lp",
    219		lp_attach,
    220		lp_detach,
    221		NULL /* always put NULL here */
    222	};
    223
    224	int lp_init (void)
    225	{
    226		...
    227		if (parport_register_driver (&lp_driver)) {
    228			/* Failed; nothing we can do. */
    229			return -EIO;
    230		}
    231		...
    232	}
    233
    234
    235SEE ALSO
    236^^^^^^^^
    237
    238parport_unregister_driver, parport_register_device, parport_enumerate
    239
    240
    241
    242parport_unregister_driver - tell parport to forget about this driver
    243--------------------------------------------------------------------
    244
    245SYNOPSIS
    246^^^^^^^^
    247
    248::
    249
    250	#include <linux/parport.h>
    251
    252	struct parport_driver {
    253		const char *name;
    254		void (*attach) (struct parport *);
    255		void (*detach) (struct parport *);
    256		struct parport_driver *next;
    257	};
    258	void parport_unregister_driver (struct parport_driver *driver);
    259
    260DESCRIPTION
    261^^^^^^^^^^^
    262
    263This tells parport not to notify the device driver of new ports or of
    264ports going away.  Registered devices belonging to that driver are NOT
    265unregistered: parport_unregister_device must be used for each one.
    266
    267EXAMPLE
    268^^^^^^^
    269
    270::
    271
    272	void cleanup_module (void)
    273	{
    274		...
    275		/* Stop notifications. */
    276		parport_unregister_driver (&lp_driver);
    277
    278		/* Unregister devices. */
    279		for (i = 0; i < NUM_DEVS; i++)
    280			parport_unregister_device (dev[i]);
    281		...
    282	}
    283
    284SEE ALSO
    285^^^^^^^^
    286
    287parport_register_driver, parport_enumerate
    288
    289
    290
    291parport_enumerate - retrieve a list of parallel ports (DEPRECATED)
    292------------------------------------------------------------------
    293
    294SYNOPSIS
    295^^^^^^^^
    296
    297::
    298
    299	#include <linux/parport.h>
    300
    301	struct parport *parport_enumerate (void);
    302
    303DESCRIPTION
    304^^^^^^^^^^^
    305
    306Retrieve the first of a list of valid parallel ports for this machine.
    307Successive parallel ports can be found using the ``struct parport
    308*next`` element of the ``struct parport *`` that is returned.  If ``next``
    309is NULL, there are no more parallel ports in the list.  The number of
    310ports in the list will not exceed PARPORT_MAX.
    311
    312RETURN VALUE
    313^^^^^^^^^^^^
    314
    315A ``struct parport *`` describing a valid parallel port for the machine,
    316or NULL if there are none.
    317
    318ERRORS
    319^^^^^^
    320
    321This function can return NULL to indicate that there are no parallel
    322ports to use.
    323
    324EXAMPLE
    325^^^^^^^
    326
    327::
    328
    329	int detect_device (void)
    330	{
    331		struct parport *port;
    332
    333		for (port = parport_enumerate ();
    334		port != NULL;
    335		port = port->next) {
    336			/* Try to detect a device on the port... */
    337			...
    338		}
    339		}
    340
    341		...
    342	}
    343
    344NOTES
    345^^^^^
    346
    347parport_enumerate is deprecated; parport_register_driver should be
    348used instead.
    349
    350SEE ALSO
    351^^^^^^^^
    352
    353parport_register_driver, parport_unregister_driver
    354
    355
    356
    357parport_register_device - register to use a port
    358------------------------------------------------
    359
    360SYNOPSIS
    361^^^^^^^^
    362
    363::
    364
    365	#include <linux/parport.h>
    366
    367	typedef int (*preempt_func) (void *handle);
    368	typedef void (*wakeup_func) (void *handle);
    369	typedef int (*irq_func) (int irq, void *handle, struct pt_regs *);
    370
    371	struct pardevice *parport_register_device(struct parport *port,
    372						  const char *name,
    373						  preempt_func preempt,
    374						  wakeup_func wakeup,
    375						  irq_func irq,
    376						  int flags,
    377						  void *handle);
    378
    379DESCRIPTION
    380^^^^^^^^^^^
    381
    382Use this function to register your device driver on a parallel port
    383(``port``).  Once you have done that, you will be able to use
    384parport_claim and parport_release in order to use the port.
    385
    386The (``name``) argument is the name of the device that appears in /proc
    387filesystem. The string must be valid for the whole lifetime of the
    388device (until parport_unregister_device is called).
    389
    390This function will register three callbacks into your driver:
    391``preempt``, ``wakeup`` and ``irq``.  Each of these may be NULL in order to
    392indicate that you do not want a callback.
    393
    394When the ``preempt`` function is called, it is because another driver
    395wishes to use the parallel port.  The ``preempt`` function should return
    396non-zero if the parallel port cannot be released yet -- if zero is
    397returned, the port is lost to another driver and the port must be
    398re-claimed before use.
    399
    400The ``wakeup`` function is called once another driver has released the
    401port and no other driver has yet claimed it.  You can claim the
    402parallel port from within the ``wakeup`` function (in which case the
    403claim is guaranteed to succeed), or choose not to if you don't need it
    404now.
    405
    406If an interrupt occurs on the parallel port your driver has claimed,
    407the ``irq`` function will be called. (Write something about shared
    408interrupts here.)
    409
    410The ``handle`` is a pointer to driver-specific data, and is passed to
    411the callback functions.
    412
    413``flags`` may be a bitwise combination of the following flags:
    414
    415  ===================== =================================================
    416        Flag            Meaning
    417  ===================== =================================================
    418  PARPORT_DEV_EXCL	The device cannot share the parallel port at all.
    419			Use this only when absolutely necessary.
    420  ===================== =================================================
    421
    422The typedefs are not actually defined -- they are only shown in order
    423to make the function prototype more readable.
    424
    425The visible parts of the returned ``struct pardevice`` are::
    426
    427	struct pardevice {
    428		struct parport *port;	/* Associated port */
    429		void *private;		/* Device driver's 'handle' */
    430		...
    431	};
    432
    433RETURN VALUE
    434^^^^^^^^^^^^
    435
    436A ``struct pardevice *``: a handle to the registered parallel port
    437device that can be used for parport_claim, parport_release, etc.
    438
    439ERRORS
    440^^^^^^
    441
    442A return value of NULL indicates that there was a problem registering
    443a device on that port.
    444
    445EXAMPLE
    446^^^^^^^
    447
    448::
    449
    450	static int preempt (void *handle)
    451	{
    452		if (busy_right_now)
    453			return 1;
    454
    455		must_reclaim_port = 1;
    456		return 0;
    457	}
    458
    459	static void wakeup (void *handle)
    460	{
    461		struct toaster *private = handle;
    462		struct pardevice *dev = private->dev;
    463		if (!dev) return; /* avoid races */
    464
    465		if (want_port)
    466			parport_claim (dev);
    467	}
    468
    469	static int toaster_detect (struct toaster *private, struct parport *port)
    470	{
    471		private->dev = parport_register_device (port, "toaster", preempt,
    472							wakeup, NULL, 0,
    473							private);
    474		if (!private->dev)
    475			/* Couldn't register with parport. */
    476			return -EIO;
    477
    478		must_reclaim_port = 0;
    479		busy_right_now = 1;
    480		parport_claim_or_block (private->dev);
    481		...
    482		/* Don't need the port while the toaster warms up. */
    483		busy_right_now = 0;
    484		...
    485		busy_right_now = 1;
    486		if (must_reclaim_port) {
    487			parport_claim_or_block (private->dev);
    488			must_reclaim_port = 0;
    489		}
    490		...
    491	}
    492
    493SEE ALSO
    494^^^^^^^^
    495
    496parport_unregister_device, parport_claim
    497
    498
    499
    500parport_unregister_device - finish using a port
    501-----------------------------------------------
    502
    503SYNPOPSIS
    504
    505::
    506
    507	#include <linux/parport.h>
    508
    509	void parport_unregister_device (struct pardevice *dev);
    510
    511DESCRIPTION
    512^^^^^^^^^^^
    513
    514This function is the opposite of parport_register_device.  After using
    515parport_unregister_device, ``dev`` is no longer a valid device handle.
    516
    517You should not unregister a device that is currently claimed, although
    518if you do it will be released automatically.
    519
    520EXAMPLE
    521^^^^^^^
    522
    523::
    524
    525	...
    526	kfree (dev->private); /* before we lose the pointer */
    527	parport_unregister_device (dev);
    528	...
    529
    530SEE ALSO
    531^^^^^^^^
    532
    533
    534parport_unregister_driver
    535
    536parport_claim, parport_claim_or_block - claim the parallel port for a device
    537----------------------------------------------------------------------------
    538
    539SYNOPSIS
    540^^^^^^^^
    541
    542::
    543
    544	#include <linux/parport.h>
    545
    546	int parport_claim (struct pardevice *dev);
    547	int parport_claim_or_block (struct pardevice *dev);
    548
    549DESCRIPTION
    550^^^^^^^^^^^
    551
    552These functions attempt to gain control of the parallel port on which
    553``dev`` is registered.  ``parport_claim`` does not block, but
    554``parport_claim_or_block`` may do. (Put something here about blocking
    555interruptibly or non-interruptibly.)
    556
    557You should not try to claim a port that you have already claimed.
    558
    559RETURN VALUE
    560^^^^^^^^^^^^
    561
    562A return value of zero indicates that the port was successfully
    563claimed, and the caller now has possession of the parallel port.
    564
    565If ``parport_claim_or_block`` blocks before returning successfully, the
    566return value is positive.
    567
    568ERRORS
    569^^^^^^
    570
    571========== ==========================================================
    572  -EAGAIN  The port is unavailable at the moment, but another attempt
    573           to claim it may succeed.
    574========== ==========================================================
    575
    576SEE ALSO
    577^^^^^^^^
    578
    579
    580parport_release
    581
    582parport_release - release the parallel port
    583-------------------------------------------
    584
    585SYNOPSIS
    586^^^^^^^^
    587
    588::
    589
    590	#include <linux/parport.h>
    591
    592	void parport_release (struct pardevice *dev);
    593
    594DESCRIPTION
    595^^^^^^^^^^^
    596
    597Once a parallel port device has been claimed, it can be released using
    598``parport_release``.  It cannot fail, but you should not release a
    599device that you do not have possession of.
    600
    601EXAMPLE
    602^^^^^^^
    603
    604::
    605
    606	static size_t write (struct pardevice *dev, const void *buf,
    607			size_t len)
    608	{
    609		...
    610		written = dev->port->ops->write_ecp_data (dev->port, buf,
    611							len);
    612		parport_release (dev);
    613		...
    614	}
    615
    616
    617SEE ALSO
    618^^^^^^^^
    619
    620change_mode, parport_claim, parport_claim_or_block, parport_yield
    621
    622
    623
    624parport_yield, parport_yield_blocking - temporarily release a parallel port
    625---------------------------------------------------------------------------
    626
    627SYNOPSIS
    628^^^^^^^^
    629
    630::
    631
    632	#include <linux/parport.h>
    633
    634	int parport_yield (struct pardevice *dev)
    635	int parport_yield_blocking (struct pardevice *dev);
    636
    637DESCRIPTION
    638^^^^^^^^^^^
    639
    640When a driver has control of a parallel port, it may allow another
    641driver to temporarily ``borrow`` it.  ``parport_yield`` does not block;
    642``parport_yield_blocking`` may do.
    643
    644RETURN VALUE
    645^^^^^^^^^^^^
    646
    647A return value of zero indicates that the caller still owns the port
    648and the call did not block.
    649
    650A positive return value from ``parport_yield_blocking`` indicates that
    651the caller still owns the port and the call blocked.
    652
    653A return value of -EAGAIN indicates that the caller no longer owns the
    654port, and it must be re-claimed before use.
    655
    656ERRORS
    657^^^^^^
    658
    659========= ==========================================================
    660  -EAGAIN  Ownership of the parallel port was given away.
    661========= ==========================================================
    662
    663SEE ALSO
    664^^^^^^^^
    665
    666parport_release
    667
    668
    669
    670parport_wait_peripheral - wait for status lines, up to 35ms
    671-----------------------------------------------------------
    672
    673SYNOPSIS
    674^^^^^^^^
    675
    676::
    677
    678	#include <linux/parport.h>
    679
    680	int parport_wait_peripheral (struct parport *port,
    681				     unsigned char mask,
    682				     unsigned char val);
    683
    684DESCRIPTION
    685^^^^^^^^^^^
    686
    687Wait for the status lines in mask to match the values in val.
    688
    689RETURN VALUE
    690^^^^^^^^^^^^
    691
    692======== ==========================================================
    693 -EINTR  a signal is pending
    694      0  the status lines in mask have values in val
    695      1  timed out while waiting (35ms elapsed)
    696======== ==========================================================
    697
    698SEE ALSO
    699^^^^^^^^
    700
    701parport_poll_peripheral
    702
    703
    704
    705parport_poll_peripheral - wait for status lines, in usec
    706--------------------------------------------------------
    707
    708SYNOPSIS
    709^^^^^^^^
    710
    711::
    712
    713	#include <linux/parport.h>
    714
    715	int parport_poll_peripheral (struct parport *port,
    716				     unsigned char mask,
    717				     unsigned char val,
    718				     int usec);
    719
    720DESCRIPTION
    721^^^^^^^^^^^
    722
    723Wait for the status lines in mask to match the values in val.
    724
    725RETURN VALUE
    726^^^^^^^^^^^^
    727
    728======== ==========================================================
    729 -EINTR  a signal is pending
    730      0  the status lines in mask have values in val
    731      1  timed out while waiting (usec microseconds have elapsed)
    732======== ==========================================================
    733
    734SEE ALSO
    735^^^^^^^^
    736
    737parport_wait_peripheral
    738
    739
    740
    741parport_wait_event - wait for an event on a port
    742------------------------------------------------
    743
    744SYNOPSIS
    745^^^^^^^^
    746
    747::
    748
    749	#include <linux/parport.h>
    750
    751	int parport_wait_event (struct parport *port, signed long timeout)
    752
    753DESCRIPTION
    754^^^^^^^^^^^
    755
    756Wait for an event (e.g. interrupt) on a port.  The timeout is in
    757jiffies.
    758
    759RETURN VALUE
    760^^^^^^^^^^^^
    761
    762======= ==========================================================
    763      0  success
    764     <0  error (exit as soon as possible)
    765     >0  timed out
    766======= ==========================================================
    767
    768parport_negotiate - perform IEEE 1284 negotiation
    769-------------------------------------------------
    770
    771SYNOPSIS
    772^^^^^^^^
    773
    774::
    775
    776	#include <linux/parport.h>
    777
    778	int parport_negotiate (struct parport *, int mode);
    779
    780DESCRIPTION
    781^^^^^^^^^^^
    782
    783Perform IEEE 1284 negotiation.
    784
    785RETURN VALUE
    786^^^^^^^^^^^^
    787
    788======= ==========================================================
    789     0  handshake OK; IEEE 1284 peripheral and mode available
    790    -1  handshake failed; peripheral not compliant (or none present)
    791     1  handshake OK; IEEE 1284 peripheral present but mode not
    792        available
    793======= ==========================================================
    794
    795SEE ALSO
    796^^^^^^^^
    797
    798parport_read, parport_write
    799
    800
    801
    802parport_read - read data from device
    803------------------------------------
    804
    805SYNOPSIS
    806^^^^^^^^
    807
    808::
    809
    810	#include <linux/parport.h>
    811
    812	ssize_t parport_read (struct parport *, void *buf, size_t len);
    813
    814DESCRIPTION
    815^^^^^^^^^^^
    816
    817Read data from device in current IEEE 1284 transfer mode.  This only
    818works for modes that support reverse data transfer.
    819
    820RETURN VALUE
    821^^^^^^^^^^^^
    822
    823If negative, an error code; otherwise the number of bytes transferred.
    824
    825SEE ALSO
    826^^^^^^^^
    827
    828parport_write, parport_negotiate
    829
    830
    831
    832parport_write - write data to device
    833------------------------------------
    834
    835SYNOPSIS
    836^^^^^^^^
    837
    838::
    839
    840	#include <linux/parport.h>
    841
    842	ssize_t parport_write (struct parport *, const void *buf, size_t len);
    843
    844DESCRIPTION
    845^^^^^^^^^^^
    846
    847Write data to device in current IEEE 1284 transfer mode.  This only
    848works for modes that support forward data transfer.
    849
    850RETURN VALUE
    851^^^^^^^^^^^^
    852
    853If negative, an error code; otherwise the number of bytes transferred.
    854
    855SEE ALSO
    856^^^^^^^^
    857
    858parport_read, parport_negotiate
    859
    860
    861
    862parport_open - register device for particular device number
    863-----------------------------------------------------------
    864
    865SYNOPSIS
    866^^^^^^^^
    867
    868::
    869
    870	#include <linux/parport.h>
    871
    872	struct pardevice *parport_open (int devnum, const char *name,
    873				        int (*pf) (void *),
    874					void (*kf) (void *),
    875					void (*irqf) (int, void *,
    876						      struct pt_regs *),
    877					int flags, void *handle);
    878
    879DESCRIPTION
    880^^^^^^^^^^^
    881
    882This is like parport_register_device but takes a device number instead
    883of a pointer to a struct parport.
    884
    885RETURN VALUE
    886^^^^^^^^^^^^
    887
    888See parport_register_device.  If no device is associated with devnum,
    889NULL is returned.
    890
    891SEE ALSO
    892^^^^^^^^
    893
    894parport_register_device
    895
    896
    897
    898parport_close - unregister device for particular device number
    899--------------------------------------------------------------
    900
    901SYNOPSIS
    902^^^^^^^^
    903
    904::
    905
    906	#include <linux/parport.h>
    907
    908	void parport_close (struct pardevice *dev);
    909
    910DESCRIPTION
    911^^^^^^^^^^^
    912
    913This is the equivalent of parport_unregister_device for parport_open.
    914
    915SEE ALSO
    916^^^^^^^^
    917
    918parport_unregister_device, parport_open
    919
    920
    921
    922parport_device_id - obtain IEEE 1284 Device ID
    923----------------------------------------------
    924
    925SYNOPSIS
    926^^^^^^^^
    927
    928::
    929
    930	#include <linux/parport.h>
    931
    932	ssize_t parport_device_id (int devnum, char *buffer, size_t len);
    933
    934DESCRIPTION
    935^^^^^^^^^^^
    936
    937Obtains the IEEE 1284 Device ID associated with a given device.
    938
    939RETURN VALUE
    940^^^^^^^^^^^^
    941
    942If negative, an error code; otherwise, the number of bytes of buffer
    943that contain the device ID.  The format of the device ID is as
    944follows::
    945
    946	[length][ID]
    947
    948The first two bytes indicate the inclusive length of the entire Device
    949ID, and are in big-endian order.  The ID is a sequence of pairs of the
    950form::
    951
    952	key:value;
    953
    954NOTES
    955^^^^^
    956
    957Many devices have ill-formed IEEE 1284 Device IDs.
    958
    959SEE ALSO
    960^^^^^^^^
    961
    962parport_find_class, parport_find_device
    963
    964
    965
    966parport_device_coords - convert device number to device coordinates
    967-------------------------------------------------------------------
    968
    969SYNOPSIS
    970^^^^^^^^
    971
    972::
    973
    974	#include <linux/parport.h>
    975
    976	int parport_device_coords (int devnum, int *parport, int *mux,
    977				   int *daisy);
    978
    979DESCRIPTION
    980^^^^^^^^^^^
    981
    982Convert between device number (zero-based) and device coordinates
    983(port, multiplexor, daisy chain address).
    984
    985RETURN VALUE
    986^^^^^^^^^^^^
    987
    988Zero on success, in which case the coordinates are (``*parport``, ``*mux``,
    989``*daisy``).
    990
    991SEE ALSO
    992^^^^^^^^
    993
    994parport_open, parport_device_id
    995
    996
    997
    998parport_find_class - find a device by its class
    999-----------------------------------------------
   1000
   1001SYNOPSIS
   1002^^^^^^^^
   1003
   1004::
   1005
   1006	#include <linux/parport.h>
   1007
   1008	typedef enum {
   1009		PARPORT_CLASS_LEGACY = 0,       /* Non-IEEE1284 device */
   1010		PARPORT_CLASS_PRINTER,
   1011		PARPORT_CLASS_MODEM,
   1012		PARPORT_CLASS_NET,
   1013		PARPORT_CLASS_HDC,              /* Hard disk controller */
   1014		PARPORT_CLASS_PCMCIA,
   1015		PARPORT_CLASS_MEDIA,            /* Multimedia device */
   1016		PARPORT_CLASS_FDC,              /* Floppy disk controller */
   1017		PARPORT_CLASS_PORTS,
   1018		PARPORT_CLASS_SCANNER,
   1019		PARPORT_CLASS_DIGCAM,
   1020		PARPORT_CLASS_OTHER,            /* Anything else */
   1021		PARPORT_CLASS_UNSPEC,           /* No CLS field in ID */
   1022		PARPORT_CLASS_SCSIADAPTER
   1023	} parport_device_class;
   1024
   1025	int parport_find_class (parport_device_class cls, int from);
   1026
   1027DESCRIPTION
   1028^^^^^^^^^^^
   1029
   1030Find a device by class.  The search starts from device number from+1.
   1031
   1032RETURN VALUE
   1033^^^^^^^^^^^^
   1034
   1035The device number of the next device in that class, or -1 if no such
   1036device exists.
   1037
   1038NOTES
   1039^^^^^
   1040
   1041Example usage::
   1042
   1043	int devnum = -1;
   1044	while ((devnum = parport_find_class (PARPORT_CLASS_DIGCAM, devnum)) != -1) {
   1045		struct pardevice *dev = parport_open (devnum, ...);
   1046		...
   1047	}
   1048
   1049SEE ALSO
   1050^^^^^^^^
   1051
   1052parport_find_device, parport_open, parport_device_id
   1053
   1054
   1055
   1056parport_find_device - find a device by its class
   1057------------------------------------------------
   1058
   1059SYNOPSIS
   1060^^^^^^^^
   1061
   1062::
   1063
   1064	#include <linux/parport.h>
   1065
   1066	int parport_find_device (const char *mfg, const char *mdl, int from);
   1067
   1068DESCRIPTION
   1069^^^^^^^^^^^
   1070
   1071Find a device by vendor and model.  The search starts from device
   1072number from+1.
   1073
   1074RETURN VALUE
   1075^^^^^^^^^^^^
   1076
   1077The device number of the next device matching the specifications, or
   1078-1 if no such device exists.
   1079
   1080NOTES
   1081^^^^^
   1082
   1083Example usage::
   1084
   1085	int devnum = -1;
   1086	while ((devnum = parport_find_device ("IOMEGA", "ZIP+", devnum)) != -1) {
   1087		struct pardevice *dev = parport_open (devnum, ...);
   1088		...
   1089	}
   1090
   1091SEE ALSO
   1092^^^^^^^^
   1093
   1094parport_find_class, parport_open, parport_device_id
   1095
   1096
   1097
   1098parport_set_timeout - set the inactivity timeout
   1099------------------------------------------------
   1100
   1101SYNOPSIS
   1102^^^^^^^^
   1103
   1104::
   1105
   1106	#include <linux/parport.h>
   1107
   1108	long parport_set_timeout (struct pardevice *dev, long inactivity);
   1109
   1110DESCRIPTION
   1111^^^^^^^^^^^
   1112
   1113Set the inactivity timeout, in jiffies, for a registered device.  The
   1114previous timeout is returned.
   1115
   1116RETURN VALUE
   1117^^^^^^^^^^^^
   1118
   1119The previous timeout, in jiffies.
   1120
   1121NOTES
   1122^^^^^
   1123
   1124Some of the port->ops functions for a parport may take time, owing to
   1125delays at the peripheral.  After the peripheral has not responded for
   1126``inactivity`` jiffies, a timeout will occur and the blocking function
   1127will return.
   1128
   1129A timeout of 0 jiffies is a special case: the function must do as much
   1130as it can without blocking or leaving the hardware in an unknown
   1131state.  If port operations are performed from within an interrupt
   1132handler, for instance, a timeout of 0 jiffies should be used.
   1133
   1134Once set for a registered device, the timeout will remain at the set
   1135value until set again.
   1136
   1137SEE ALSO
   1138^^^^^^^^
   1139
   1140port->ops->xxx_read/write_yyy
   1141
   1142
   1143
   1144
   1145PORT FUNCTIONS
   1146==============
   1147
   1148The functions in the port->ops structure (struct parport_operations)
   1149are provided by the low-level driver responsible for that port.
   1150
   1151port->ops->read_data - read the data register
   1152---------------------------------------------
   1153
   1154SYNOPSIS
   1155^^^^^^^^
   1156
   1157::
   1158
   1159	#include <linux/parport.h>
   1160
   1161	struct parport_operations {
   1162		...
   1163		unsigned char (*read_data) (struct parport *port);
   1164		...
   1165	};
   1166
   1167DESCRIPTION
   1168^^^^^^^^^^^
   1169
   1170If port->modes contains the PARPORT_MODE_TRISTATE flag and the
   1171PARPORT_CONTROL_DIRECTION bit in the control register is set, this
   1172returns the value on the data pins.  If port->modes contains the
   1173PARPORT_MODE_TRISTATE flag and the PARPORT_CONTROL_DIRECTION bit is
   1174not set, the return value _may_ be the last value written to the data
   1175register.  Otherwise the return value is undefined.
   1176
   1177SEE ALSO
   1178^^^^^^^^
   1179
   1180write_data, read_status, write_control
   1181
   1182
   1183
   1184port->ops->write_data - write the data register
   1185-----------------------------------------------
   1186
   1187SYNOPSIS
   1188^^^^^^^^
   1189
   1190::
   1191
   1192	#include <linux/parport.h>
   1193
   1194	struct parport_operations {
   1195		...
   1196		void (*write_data) (struct parport *port, unsigned char d);
   1197		...
   1198	};
   1199
   1200DESCRIPTION
   1201^^^^^^^^^^^
   1202
   1203Writes to the data register.  May have side-effects (a STROBE pulse,
   1204for instance).
   1205
   1206SEE ALSO
   1207^^^^^^^^
   1208
   1209read_data, read_status, write_control
   1210
   1211
   1212
   1213port->ops->read_status - read the status register
   1214-------------------------------------------------
   1215
   1216SYNOPSIS
   1217^^^^^^^^
   1218
   1219::
   1220
   1221	#include <linux/parport.h>
   1222
   1223	struct parport_operations {
   1224		...
   1225		unsigned char (*read_status) (struct parport *port);
   1226		...
   1227	};
   1228
   1229DESCRIPTION
   1230^^^^^^^^^^^
   1231
   1232Reads from the status register.  This is a bitmask:
   1233
   1234- PARPORT_STATUS_ERROR (printer fault, "nFault")
   1235- PARPORT_STATUS_SELECT (on-line, "Select")
   1236- PARPORT_STATUS_PAPEROUT (no paper, "PError")
   1237- PARPORT_STATUS_ACK (handshake, "nAck")
   1238- PARPORT_STATUS_BUSY (busy, "Busy")
   1239
   1240There may be other bits set.
   1241
   1242SEE ALSO
   1243^^^^^^^^
   1244
   1245read_data, write_data, write_control
   1246
   1247
   1248
   1249port->ops->read_control - read the control register
   1250---------------------------------------------------
   1251
   1252SYNOPSIS
   1253^^^^^^^^
   1254
   1255::
   1256
   1257	#include <linux/parport.h>
   1258
   1259	struct parport_operations {
   1260		...
   1261		unsigned char (*read_control) (struct parport *port);
   1262		...
   1263	};
   1264
   1265DESCRIPTION
   1266^^^^^^^^^^^
   1267
   1268Returns the last value written to the control register (either from
   1269write_control or frob_control).  No port access is performed.
   1270
   1271SEE ALSO
   1272^^^^^^^^
   1273
   1274read_data, write_data, read_status, write_control
   1275
   1276
   1277
   1278port->ops->write_control - write the control register
   1279-----------------------------------------------------
   1280
   1281SYNOPSIS
   1282^^^^^^^^
   1283
   1284::
   1285
   1286	#include <linux/parport.h>
   1287
   1288	struct parport_operations {
   1289		...
   1290		void (*write_control) (struct parport *port, unsigned char s);
   1291		...
   1292	};
   1293
   1294DESCRIPTION
   1295^^^^^^^^^^^
   1296
   1297Writes to the control register. This is a bitmask::
   1298
   1299				  _______
   1300	- PARPORT_CONTROL_STROBE (nStrobe)
   1301				  _______
   1302	- PARPORT_CONTROL_AUTOFD (nAutoFd)
   1303				_____
   1304	- PARPORT_CONTROL_INIT (nInit)
   1305				  _________
   1306	- PARPORT_CONTROL_SELECT (nSelectIn)
   1307
   1308SEE ALSO
   1309^^^^^^^^
   1310
   1311read_data, write_data, read_status, frob_control
   1312
   1313
   1314
   1315port->ops->frob_control - write control register bits
   1316-----------------------------------------------------
   1317
   1318SYNOPSIS
   1319^^^^^^^^
   1320
   1321::
   1322
   1323	#include <linux/parport.h>
   1324
   1325	struct parport_operations {
   1326		...
   1327		unsigned char (*frob_control) (struct parport *port,
   1328					unsigned char mask,
   1329					unsigned char val);
   1330		...
   1331	};
   1332
   1333DESCRIPTION
   1334^^^^^^^^^^^
   1335
   1336This is equivalent to reading from the control register, masking out
   1337the bits in mask, exclusive-or'ing with the bits in val, and writing
   1338the result to the control register.
   1339
   1340As some ports don't allow reads from the control port, a software copy
   1341of its contents is maintained, so frob_control is in fact only one
   1342port access.
   1343
   1344SEE ALSO
   1345^^^^^^^^
   1346
   1347read_data, write_data, read_status, write_control
   1348
   1349
   1350
   1351port->ops->enable_irq - enable interrupt generation
   1352---------------------------------------------------
   1353
   1354SYNOPSIS
   1355^^^^^^^^
   1356
   1357::
   1358
   1359	#include <linux/parport.h>
   1360
   1361	struct parport_operations {
   1362		...
   1363		void (*enable_irq) (struct parport *port);
   1364		...
   1365	};
   1366
   1367DESCRIPTION
   1368^^^^^^^^^^^
   1369
   1370The parallel port hardware is instructed to generate interrupts at
   1371appropriate moments, although those moments are
   1372architecture-specific.  For the PC architecture, interrupts are
   1373commonly generated on the rising edge of nAck.
   1374
   1375SEE ALSO
   1376^^^^^^^^
   1377
   1378disable_irq
   1379
   1380
   1381
   1382port->ops->disable_irq - disable interrupt generation
   1383-----------------------------------------------------
   1384
   1385SYNOPSIS
   1386^^^^^^^^
   1387
   1388::
   1389
   1390	#include <linux/parport.h>
   1391
   1392	struct parport_operations {
   1393		...
   1394		void (*disable_irq) (struct parport *port);
   1395		...
   1396	};
   1397
   1398DESCRIPTION
   1399^^^^^^^^^^^
   1400
   1401The parallel port hardware is instructed not to generate interrupts.
   1402The interrupt itself is not masked.
   1403
   1404SEE ALSO
   1405^^^^^^^^
   1406
   1407enable_irq
   1408
   1409
   1410
   1411port->ops->data_forward - enable data drivers
   1412---------------------------------------------
   1413
   1414SYNOPSIS
   1415^^^^^^^^
   1416
   1417::
   1418
   1419	#include <linux/parport.h>
   1420
   1421	struct parport_operations {
   1422		...
   1423		void (*data_forward) (struct parport *port);
   1424		...
   1425	};
   1426
   1427DESCRIPTION
   1428^^^^^^^^^^^
   1429
   1430Enables the data line drivers, for 8-bit host-to-peripheral
   1431communications.
   1432
   1433SEE ALSO
   1434^^^^^^^^
   1435
   1436data_reverse
   1437
   1438
   1439
   1440port->ops->data_reverse - tristate the buffer
   1441---------------------------------------------
   1442
   1443SYNOPSIS
   1444^^^^^^^^
   1445
   1446::
   1447
   1448	#include <linux/parport.h>
   1449
   1450	struct parport_operations {
   1451		...
   1452		void (*data_reverse) (struct parport *port);
   1453		...
   1454	};
   1455
   1456DESCRIPTION
   1457^^^^^^^^^^^
   1458
   1459Places the data bus in a high impedance state, if port->modes has the
   1460PARPORT_MODE_TRISTATE bit set.
   1461
   1462SEE ALSO
   1463^^^^^^^^
   1464
   1465data_forward
   1466
   1467
   1468
   1469port->ops->epp_write_data - write EPP data
   1470------------------------------------------
   1471
   1472SYNOPSIS
   1473^^^^^^^^
   1474
   1475::
   1476
   1477	#include <linux/parport.h>
   1478
   1479	struct parport_operations {
   1480		...
   1481		size_t (*epp_write_data) (struct parport *port, const void *buf,
   1482					size_t len, int flags);
   1483		...
   1484	};
   1485
   1486DESCRIPTION
   1487^^^^^^^^^^^
   1488
   1489Writes data in EPP mode, and returns the number of bytes written.
   1490
   1491The ``flags`` parameter may be one or more of the following,
   1492bitwise-or'ed together:
   1493
   1494======================= =================================================
   1495PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
   1496			32-bit registers.  However, if a transfer
   1497			times out, the return value may be unreliable.
   1498======================= =================================================
   1499
   1500SEE ALSO
   1501^^^^^^^^
   1502
   1503epp_read_data, epp_write_addr, epp_read_addr
   1504
   1505
   1506
   1507port->ops->epp_read_data - read EPP data
   1508----------------------------------------
   1509
   1510SYNOPSIS
   1511^^^^^^^^
   1512
   1513::
   1514
   1515	#include <linux/parport.h>
   1516
   1517	struct parport_operations {
   1518		...
   1519		size_t (*epp_read_data) (struct parport *port, void *buf,
   1520					size_t len, int flags);
   1521		...
   1522	};
   1523
   1524DESCRIPTION
   1525^^^^^^^^^^^
   1526
   1527Reads data in EPP mode, and returns the number of bytes read.
   1528
   1529The ``flags`` parameter may be one or more of the following,
   1530bitwise-or'ed together:
   1531
   1532======================= =================================================
   1533PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
   1534			32-bit registers.  However, if a transfer
   1535			times out, the return value may be unreliable.
   1536======================= =================================================
   1537
   1538SEE ALSO
   1539^^^^^^^^
   1540
   1541epp_write_data, epp_write_addr, epp_read_addr
   1542
   1543
   1544
   1545port->ops->epp_write_addr - write EPP address
   1546---------------------------------------------
   1547
   1548SYNOPSIS
   1549^^^^^^^^
   1550
   1551::
   1552
   1553	#include <linux/parport.h>
   1554
   1555	struct parport_operations {
   1556		...
   1557		size_t (*epp_write_addr) (struct parport *port,
   1558					const void *buf, size_t len, int flags);
   1559		...
   1560	};
   1561
   1562DESCRIPTION
   1563^^^^^^^^^^^
   1564
   1565Writes EPP addresses (8 bits each), and returns the number written.
   1566
   1567The ``flags`` parameter may be one or more of the following,
   1568bitwise-or'ed together:
   1569
   1570======================= =================================================
   1571PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
   1572			32-bit registers.  However, if a transfer
   1573			times out, the return value may be unreliable.
   1574======================= =================================================
   1575
   1576(Does PARPORT_EPP_FAST make sense for this function?)
   1577
   1578SEE ALSO
   1579^^^^^^^^
   1580
   1581epp_write_data, epp_read_data, epp_read_addr
   1582
   1583
   1584
   1585port->ops->epp_read_addr - read EPP address
   1586-------------------------------------------
   1587
   1588SYNOPSIS
   1589^^^^^^^^
   1590
   1591::
   1592
   1593	#include <linux/parport.h>
   1594
   1595	struct parport_operations {
   1596		...
   1597		size_t (*epp_read_addr) (struct parport *port, void *buf,
   1598					size_t len, int flags);
   1599		...
   1600	};
   1601
   1602DESCRIPTION
   1603^^^^^^^^^^^
   1604
   1605Reads EPP addresses (8 bits each), and returns the number read.
   1606
   1607The ``flags`` parameter may be one or more of the following,
   1608bitwise-or'ed together:
   1609
   1610======================= =================================================
   1611PARPORT_EPP_FAST	Use fast transfers. Some chips provide 16-bit and
   1612			32-bit registers.  However, if a transfer
   1613			times out, the return value may be unreliable.
   1614======================= =================================================
   1615
   1616(Does PARPORT_EPP_FAST make sense for this function?)
   1617
   1618SEE ALSO
   1619^^^^^^^^
   1620
   1621epp_write_data, epp_read_data, epp_write_addr
   1622
   1623
   1624
   1625port->ops->ecp_write_data - write a block of ECP data
   1626-----------------------------------------------------
   1627
   1628SYNOPSIS
   1629^^^^^^^^
   1630
   1631::
   1632
   1633	#include <linux/parport.h>
   1634
   1635	struct parport_operations {
   1636		...
   1637		size_t (*ecp_write_data) (struct parport *port,
   1638					const void *buf, size_t len, int flags);
   1639		...
   1640	};
   1641
   1642DESCRIPTION
   1643^^^^^^^^^^^
   1644
   1645Writes a block of ECP data.  The ``flags`` parameter is ignored.
   1646
   1647RETURN VALUE
   1648^^^^^^^^^^^^
   1649
   1650The number of bytes written.
   1651
   1652SEE ALSO
   1653^^^^^^^^
   1654
   1655ecp_read_data, ecp_write_addr
   1656
   1657
   1658
   1659port->ops->ecp_read_data - read a block of ECP data
   1660---------------------------------------------------
   1661
   1662SYNOPSIS
   1663^^^^^^^^
   1664
   1665::
   1666
   1667	#include <linux/parport.h>
   1668
   1669	struct parport_operations {
   1670		...
   1671		size_t (*ecp_read_data) (struct parport *port,
   1672					void *buf, size_t len, int flags);
   1673		...
   1674	};
   1675
   1676DESCRIPTION
   1677^^^^^^^^^^^
   1678
   1679Reads a block of ECP data.  The ``flags`` parameter is ignored.
   1680
   1681RETURN VALUE
   1682^^^^^^^^^^^^
   1683
   1684The number of bytes read.  NB. There may be more unread data in a
   1685FIFO.  Is there a way of stunning the FIFO to prevent this?
   1686
   1687SEE ALSO
   1688^^^^^^^^
   1689
   1690ecp_write_block, ecp_write_addr
   1691
   1692
   1693
   1694port->ops->ecp_write_addr - write a block of ECP addresses
   1695----------------------------------------------------------
   1696
   1697SYNOPSIS
   1698^^^^^^^^
   1699
   1700::
   1701
   1702	#include <linux/parport.h>
   1703
   1704	struct parport_operations {
   1705		...
   1706		size_t (*ecp_write_addr) (struct parport *port,
   1707					const void *buf, size_t len, int flags);
   1708		...
   1709	};
   1710
   1711DESCRIPTION
   1712^^^^^^^^^^^
   1713
   1714Writes a block of ECP addresses.  The ``flags`` parameter is ignored.
   1715
   1716RETURN VALUE
   1717^^^^^^^^^^^^
   1718
   1719The number of bytes written.
   1720
   1721NOTES
   1722^^^^^
   1723
   1724This may use a FIFO, and if so shall not return until the FIFO is empty.
   1725
   1726SEE ALSO
   1727^^^^^^^^
   1728
   1729ecp_read_data, ecp_write_data
   1730
   1731
   1732
   1733port->ops->nibble_read_data - read a block of data in nibble mode
   1734-----------------------------------------------------------------
   1735
   1736SYNOPSIS
   1737^^^^^^^^
   1738
   1739::
   1740
   1741	#include <linux/parport.h>
   1742
   1743	struct parport_operations {
   1744		...
   1745		size_t (*nibble_read_data) (struct parport *port,
   1746					void *buf, size_t len, int flags);
   1747		...
   1748	};
   1749
   1750DESCRIPTION
   1751^^^^^^^^^^^
   1752
   1753Reads a block of data in nibble mode.  The ``flags`` parameter is ignored.
   1754
   1755RETURN VALUE
   1756^^^^^^^^^^^^
   1757
   1758The number of whole bytes read.
   1759
   1760SEE ALSO
   1761^^^^^^^^
   1762
   1763byte_read_data, compat_write_data
   1764
   1765
   1766
   1767port->ops->byte_read_data - read a block of data in byte mode
   1768-------------------------------------------------------------
   1769
   1770SYNOPSIS
   1771^^^^^^^^
   1772
   1773::
   1774
   1775	#include <linux/parport.h>
   1776
   1777	struct parport_operations {
   1778		...
   1779		size_t (*byte_read_data) (struct parport *port,
   1780					void *buf, size_t len, int flags);
   1781		...
   1782	};
   1783
   1784DESCRIPTION
   1785^^^^^^^^^^^
   1786
   1787Reads a block of data in byte mode.  The ``flags`` parameter is ignored.
   1788
   1789RETURN VALUE
   1790^^^^^^^^^^^^
   1791
   1792The number of bytes read.
   1793
   1794SEE ALSO
   1795^^^^^^^^
   1796
   1797nibble_read_data, compat_write_data
   1798
   1799
   1800
   1801port->ops->compat_write_data - write a block of data in compatibility mode
   1802--------------------------------------------------------------------------
   1803
   1804SYNOPSIS
   1805^^^^^^^^
   1806
   1807::
   1808
   1809	#include <linux/parport.h>
   1810
   1811	struct parport_operations {
   1812		...
   1813		size_t (*compat_write_data) (struct parport *port,
   1814					const void *buf, size_t len, int flags);
   1815		...
   1816	};
   1817
   1818DESCRIPTION
   1819^^^^^^^^^^^
   1820
   1821Writes a block of data in compatibility mode.  The ``flags`` parameter
   1822is ignored.
   1823
   1824RETURN VALUE
   1825^^^^^^^^^^^^
   1826
   1827The number of bytes written.
   1828
   1829SEE ALSO
   1830^^^^^^^^
   1831
   1832nibble_read_data, byte_read_data