/* Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ /***** For fans of kprintf, IOLog and debugging infrastructure of the *****/ /***** string ilk, please modify the ELG and PAUSE macros or their *****/ /***** associated EvLog and Pause functions to suit your taste. These *****/ /***** macros currently are set up to log events to a wraparound *****/ /***** buffer with minimal performance impact. They take 2 UInt32 *****/ /***** parameters so that when the buffer is dumped 16 bytes per line, *****/ /***** time stamps (~1 microsecond) run down the left side while *****/ /***** unique 4-byte ASCII codes can be read down the right side. *****/ /***** Preserving this convention facilitates different maintainers *****/ /***** using different debugging styles with minimal code clutter. *****/ #ifndef _APPLEIRDA_ #define _APPLEIRDA_ #include #include "IrDAStats.h" #define DEBUG 0 // for debugging #define USE_ELG 0 // to event log - DEBUG must also be set (see below) #define kEvLogSize (4096*16) // 16 pages = 64K = 4096 events #define LOG_DATA 1 // logs data to the IOLog - DEBUG must also be set #define Sleep_Time 20 #if DEBUG #define IOLogIt(A,B,ASCI,STRING) IOLog( "AppleIrDA: %8x %8x " STRING "\n", (unsigned int)(A), (unsigned int)(B) ) #if USE_ELG #define ELG(A,B,ASCI,STRING) EvLog( (UInt32)(A), (UInt32)(B), (UInt32)(ASCI), STRING ) #else /* not USE_ELG */ #define ELG(A,B,ASCI,STRING) {IOLog( "AppleIrDA: %8x %8x " STRING "\n", (unsigned int)(A), (unsigned int)(B) );IOSleep(Sleep_Time);} #endif /* USE_ELG */ #if LOG_DATA #define LogData(D, C, b) DEVLogData((UInt8)D, (UInt32)C, (char *)b) #else /* not LOG_DATA */ #define LogData(D, C, b) #endif /* LOG_DATA */ #else /* not DEBUG */ #define IOLogIt(A,B,ASCI,STRING) #define ELG(A,B,ASCI,S) #define LogData(D, C, b) #undef USE_ELG #undef LOG_DATA #endif /* DEBUG */ #define initIrDAState true // False = off, true = on #define baseName "IrDA-IrCOMM" /* Globals */ typedef struct IrDAglobals /* Globals for USB module (not per instance) */ { UInt32 evLogFlag; // debugging only UInt8 *evLogBuf; UInt8 *evLogBufe; UInt8 *evLogBufp; UInt8 intLevel; class AppleIrDA *AppleIrDAInstance; } IrDAglobals; enum ParityType { NoParity = 0, OddParity, EvenParity }; #define MAX_BLOCK_SIZE PAGE_SIZE #define kDefaultBaudRate 9600 #define kMaxBaudRate 4000000 // 4Mbs for IrDA #define kMinBaudRate 300 #define kMaxCirBufferSize 4096 /* IrDA stuff */ struct USBIrDAQoS // encoded qos values as read from the irda pod (except for driver swabs of shorts) { UInt8 bFunctionLength; // descriptor header (length = 12) UInt8 bDescriptorType; // descriptor type (0x21) UInt16 version; // two bytes of version number, should be 0x01, 0x00 for 1.0 UInt8 datasize; // bytes per frame supported UInt8 windowsize; // 1 thru 7 frames per ack UInt8 minturn; // min turnaround time UInt8 baud1; // 16 bits of baud UInt8 baud2; UInt8 bofs; // number of bofs the pod wants UInt8 sniff; // 1 if can receive at any speed UInt8 unicast; // max number of entries in the unicast list }; typedef struct USBIrDAQoS USBIrDAQoS; // Todo - rename since we use this for SCC as well /* SccQueuePrimatives.h */ typedef struct CirQueue { UInt8 *Start; UInt8 *End; UInt8 *NextChar; UInt8 *LastChar; size_t Size; size_t InQueue; } CirQueue; typedef enum QueueStatus { queueNoError = 0, queueFull, queueEmpty, queueMaxStatus } QueueStatus; /* Inline time conversions */ static inline unsigned long tval2long( mach_timespec val ) { return (val.tv_sec * NSEC_PER_SEC) + val.tv_nsec; } static inline mach_timespec long2tval( unsigned long val ) { mach_timespec tval; tval.tv_sec = val / NSEC_PER_SEC; tval.tv_nsec = val % NSEC_PER_SEC; return tval; } class IrDAComm; class AppleIrDASerial; class AppleIrDA : public IOService // nub with nice name for user-client connections { OSDeclareDefaultStructors(AppleIrDA) public: static AppleIrDA *withNub(AppleIrDASerial *nub); // constructor IOReturn newUserClient( task_t,void*,UInt32, IOUserClient** ); private: AppleIrDASerial *fNub; }; class AppleIrDASerial : public IORS232SerialStreamSync { //OSDeclareAbstractStructors(AppleIrDASerial); OSDeclareDefaultStructors(AppleIrDASerial) public: virtual void Add_RXBytes( UInt8 *Buffer, size_t Size ) = 0; virtual SInt16 SetBofCount( SInt16 bof_count ) = 0; virtual UInt16 SetSpeed( UInt32 brate ) = 0; virtual bool SetUpTransmit( void ) = 0; virtual IOReturn StartTransmit( UInt32 control_length, UInt8 *control_buffer, UInt32 data_length, UInt8 *data_buffer ) = 0; virtual USBIrDAQoS* GetIrDAQoS( void ) = 0; virtual IrDAComm* GetIrDAComm( void ) = 0; virtual void GetIrDAStatus( IrDAStatus *status ) = 0; virtual IOReturn SetIrDAUserClientState( bool IrDAOn ) = 0; }; #endif