// $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