From d716f5301ffadeaf814b7716066ccae830f01207 Mon Sep 17 00:00:00 2001 From: Marcus Cooper Date: Thu, 4 Feb 2010 13:46:52 +0100 Subject: Adding the IrRC IOCTL interface to the kernel. Signed-off-by: Marcus Cooper --- include/linux/irrc_ioctl.h | 250 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100755 include/linux/irrc_ioctl.h (limited to 'include/linux/irrc_ioctl.h') diff --git a/include/linux/irrc_ioctl.h b/include/linux/irrc_ioctl.h new file mode 100755 index 00000000000..5efb8003fd9 --- /dev/null +++ b/include/linux/irrc_ioctl.h @@ -0,0 +1,250 @@ + +// $Copyright $ +/***************************************************************************** +* DESCRIPTION: +*****************************************************************************/ +//name irrc_ioctl.h + + + +/*!\page irrc_ioctl.h + * This file defines the ioctl interface to irrc. + * + *\b Example - set modulation parameters: + * \code + fd = open("/dev/irrc",..); + struct irrc_pulse_data irrc_config = { + .carrier_data = { + .carrier_high = 105, + .carrier_low = 105 + } + + } + .logical_pulse_data = { + .modulation_method = HAL_IRRC_MODULATION_METHOD_HIGHLOW_HIGHLOW, + .data0high = 200, + .data0low = 300, + .data1high = 400, + .data1low = 450 + } + .start_stop_pulse_data = { + .start_high = 500, + .start_low = 500, + .stop_high = 600 + } + .repeat_data = { + .count = 1, // single transmission +// .interval = 0 // no need to set interval because no retransmission is asked for (Count = 1). + } + }; + + ioctl(fd,IRRC_IOC_CONFIGURE_PULSE_PARAM,&irrc_config); + close(fd); + * \endcode + * +*/ + +#ifndef INCLUSION_GUARD_IRRC_H +#define INCLUSION_GUARD_IRRC_H + +/***************************************************************************** +* REVISION HISTORY +*****************************************************************************/ + + + +/**************************************************************************** +* Include +*****************************************************************************/ +#include // _IOW(....) + + + +/**************************************************************************** +* Defines +*****************************************************************************/ + +/* MAX number of bytes in an IRRC frame */ +#define IRRC_COMMAND_DATA_BUFFER_MAX_SIZE 128 + +/**************************************************************************** +* Global Variables +*****************************************************************************/ + + + +/**************************************************************************** +* Types +*****************************************************************************/ + +/** + * This enumerated type defines the different modulation methods + * when sending data using the infrared remote control. + * + * @param HAL_IRRC_MODULATION_METHOD_HIGHLOW_HIGHLOW + * A logical 0 and a logical 1 is expressed by a high-to-low transition both + * expressed by a pulse burst followed by a gap (HighLow). The length of pulse + * and gap makes a distinguish between a logical 0 and 1. + * Usage Example 1: pulse-distance modulation + * Uses fixed length pulses while gap defines whether it is “1”(long gap) or + * “0”(short gap) logical value. Protocol example: Sharp + * Usage Example 2: pulse-duration modulation + * Uses fixed gap length while pulses length defines whether it is “1”(long + * pulse width) or “0”(short pulse width) logical value. Protocol example: SONY SIRC. + * + * @param HAL_IRRC_MODULATION_METHOD_LOWHIGH_HIGHLOW + * A logical 0 is expressed by a low-to-high transition. A logical 1 is expressed + * by a high-to-low transition. Each bit contains pulse bursts of the applied + * carrier frequency. A logical 0 is represented by a pulse burst in the second + * half of the bit time. A logical 1 is represented by a pulse burst in the first + * half of the bit time. + * Usage example: Bi-phase modulation or so-called Manchester modulation + * (according to G.E. Thomas' convention). + * Each bit is transmitted in a fixed time (the "pulse period" or "window"). + * These time windows have constant length and a change of signal's level inside + * of each time window is used for detection of each bit. If there is a positive + * change (from log. 0 to log. 1) the bit is evaluated as logical one. In opposite + * case, when there is negative change, the bit is evaluated as logical zero. + * Protocol example: RC-6 from Philips. + * + * @param HAL_IRRC_MODULATION_METHOD_HIGHLOW_LOWHIGH + * A logical 0 is expressed by a high-to-low transition and a logical 1 is expressed + * by a low-to-high transition. Each bit contains burst of pulses of the applied + * carrier frequency. A logical 0 is represented by a pulse burst in the first half + * of the bit time. A logical 1 is represented by a pulse burst in the second half + * of the bit time. + * Usage Example: Bi-phase modulation or so-called Manchester coding (according to + * IEEE 802.3 convention). + * This is the inverse convention of modulation LowHigh HighLow. Each bit is + * transmitted in a fixed time (the "period"). Protocol example: RC-5 from Philips. + * + * @param HAL_IRRC_MODULATION_METHOD_LOWHIGH_LOWHIGH + * A logical 0 and a logical 1 is expressed by a low-to-high transition both expressed + * by a gap followed by a pulse burst (LowHigh). The pulse length and gap length makes + * a distinguish between a logical 0 and 1. + * Usage Example: Inverse convention of modulation HighLow HighLow. + */ +enum irrc_modulation_method { + HAL_IRRC_MODULATION_METHOD_HIGHLOW_HIGHLOW, + HAL_IRRC_MODULATION_METHOD_LOWHIGH_HIGHLOW, + HAL_IRRC_MODULATION_METHOD_HIGHLOW_LOWHIGH, + HAL_IRRC_MODULATION_METHOD_LOWHIGH_LOWHIGH +}; + + +/** + * This type stores the carrier part of the infrared remote control pulse data. + * The period of the carrier frequency is sum CarrierHigh and CarrierLow. + * The duty cycle of the carrier frequency is calculated as CarrierHigh divided by + * sum parameter CarrierHigh and parameter CarrierLow. + * + * @param CarrierHigh The time interval (in nanoseconds) for the carrier high pulse. + * @param CarrierLow The time interval (in nanoseconds) for the carrier low pulse. + */ +struct irrc_carrier_data { + unsigned long int carrier_high; + unsigned long int carrier_low; +}; + + +/** + * This type stores the logical pulse part of the infrared remote control pulse data. + * + * @param ModulationMethod The modulation method. + * @param Data0High The time interval (in nanoseconds) for data 0 high pulse. + * @param Data0Low The time interval (in nanoseconds) for data 0 low pulse. + * @param Data1High The time interval (in nanoseconds) for data 1 high pulse. + * @param Data1Low The time interval (in nanoseconds) for data 1 low pulse. + */ +struct irrc_logical_pulse_data { + enum irrc_modulation_method modulation_method; + unsigned long int data0high; + unsigned long int data0low; + unsigned long int data1high; + unsigned long int data1low; +}; + + +/** + * This type stores the start and stop pulse part of the infrared remote control pulse data. + * + * @param StartHigh The time interval (in nanoseconds) for start bit high pulse. + * @param StartLow The time interval (in nanoseconds) for start bit low pulse. + * @param StopHigh The time interval (in nanoseconds) for stop bit high pulse. + * @param frame_duration The compleate frame duration (in nanoseconds) including start, stop and data pulses. + */ +struct irrc_start_stop_pulse_data { + unsigned long int start_high; + unsigned long int start_low; + unsigned long int stop_high; +// unsigned long int frame_duration; +}; + + +/** + * This type stores the repeat data part of the infrared remote control pulse data. + * + * @param Count The number of repeated transmissions. A value of 0 means a single transmission + * with no retransmissions. + * @param Interval The time interval (in milliseconds) between each start of retransmission + * if Count is greater than 0. + */ +struct irrc_repeat_data { + unsigned long int count; + unsigned long int interval; +}; + + +/** + * This type stores the PULSE data part of the infrared remote control data. + * + * @param CarrierData The carrier data. + * @param LogicalPulseData The logical pulse data. + * @param StartStopPulseData The start and stop pulse data. + * @param RepeatData The repeat data. + */ +struct irrc_pulse_data { + struct irrc_carrier_data carrier_data; + struct irrc_logical_pulse_data logical_pulse_data; + struct irrc_start_stop_pulse_data start_stop_pulse_data; + struct irrc_repeat_data repeat_data; +}; + + +/** + * This type stores the COMMAND data part of the infrared remote control data. + * The data bits are stored in a byte array, where the HIGHEST bit in a byte + * is the first bit to be transmitted. + * + * @param size The size of the command data in number of BITS. + * @param data The command data. + */ +struct irrc_cmd_data { + unsigned long size; + unsigned char data[IRRC_COMMAND_DATA_BUFFER_MAX_SIZE]; +}; + +struct irrc_ioctl { + struct irrc_cmd_data cmd_data; + struct irrc_pulse_data pulse_data; +}; + + +/**************************************************************************** +* Defines +*****************************************************************************/ + +/** Use '0xF5' as magic number. '0xF5' seems not to be occupied in Documentation/ioctl/ioctl-number.txt*/ +#define IRRC_IOC_MAGIC '0xF5' + +/** Set command to specifying the shape of the remote control pulses */ +#define IRRC_IOC_CONFIGURE_PULSE_PARAM _IOW(IRRC_IOC_MAGIC, 1, struct irrc_ioctl) + +/**************************************************************************** +* Function Prototypes +*****************************************************************************/ + + +#endif // INCLUSION_GUARD_IRRC_H + + -- cgit v1.2.3