Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
5430e197
Commit
5430e197
authored
Feb 09, 2011
by
Dean Camera
Browse files
Add missing svn:eol-style properties to the new KeyboardMouseMultiReport demo.
parent
088bfb10
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Demos/Device/ClassDriver/KeyboardMouseMultiReport/Descriptors.c
View file @
5430e197
This diff is collapsed.
Click to expand it.
Demos/Device/ClassDriver/KeyboardMouseMultiReport/Descriptors.h
View file @
5430e197
/*
/*
LUFA Library
LUFA Library
Copyright (C) Dean Camera, 2011.
Copyright (C) Dean Camera, 2011.
dean [at] fourwalledcubicle [dot] com
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
www.lufa-lib.org
*/
*/
/*
/*
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
software without specific, written prior permission.
The author disclaim all warranties with regard to this
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
arising out of or in connection with the use or performance of
this software.
this software.
*/
*/
/** \file
/** \file
*
*
* Header file for Descriptors.c.
* Header file for Descriptors.c.
*/
*/
#ifndef _DESCRIPTORS_H_
#ifndef _DESCRIPTORS_H_
#define _DESCRIPTORS_H_
#define _DESCRIPTORS_H_
/* Includes: */
/* Includes: */
#include <avr/pgmspace.h>
#include <avr/pgmspace.h>
#include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Drivers/USB/USB.h>
/* Type Defines: */
/* Type Defines: */
/** Type define for the device configuration descriptor structure. This must be defined in the
/** Type define for the device configuration descriptor structure. This must be defined in the
* application code, as the configuration descriptor contains several sub-descriptors which
* application code, as the configuration descriptor contains several sub-descriptors which
* vary between devices, and which describe the device's usage to the host.
* vary between devices, and which describe the device's usage to the host.
*/
*/
typedef
struct
typedef
struct
{
{
USB_Descriptor_Configuration_Header_t
Config
;
USB_Descriptor_Configuration_Header_t
Config
;
USB_Descriptor_Interface_t
HID_Interface
;
USB_Descriptor_Interface_t
HID_Interface
;
USB_HID_Descriptor_HID_t
HID_HIDData
;
USB_HID_Descriptor_HID_t
HID_HIDData
;
USB_Descriptor_Endpoint_t
HID_ReportINEndpoint
;
USB_Descriptor_Endpoint_t
HID_ReportINEndpoint
;
}
USB_Descriptor_Configuration_t
;
}
USB_Descriptor_Configuration_t
;
/* Macros: */
/* Macros: */
/** Endpoint number of the HID reporting IN endpoint. */
/** Endpoint number of the HID reporting IN endpoint. */
#define HID_IN_EPNUM 1
#define HID_IN_EPNUM 1
/** Size in bytes of each of the HID reporting IN. */
/** Size in bytes of each of the HID reporting IN. */
#define HID_EPSIZE 16
#define HID_EPSIZE 16
enum
enum
{
{
HID_REPORTID_MouseReport
=
0x01
,
HID_REPORTID_MouseReport
=
0x01
,
HID_REPORTID_KeyboardReport
=
0x02
,
HID_REPORTID_KeyboardReport
=
0x02
,
}
HID_Report_IDs
;
}
HID_Report_IDs
;
/* Function Prototypes: */
/* Function Prototypes: */
uint16_t
CALLBACK_USB_GetDescriptor
(
const
uint16_t
wValue
,
uint16_t
CALLBACK_USB_GetDescriptor
(
const
uint16_t
wValue
,
const
uint8_t
wIndex
,
const
uint8_t
wIndex
,
const
void
**
const
DescriptorAddress
)
const
void
**
const
DescriptorAddress
)
ATTR_WARN_UNUSED_RESULT
ATTR_NON_NULL_PTR_ARG
(
3
);
ATTR_WARN_UNUSED_RESULT
ATTR_NON_NULL_PTR_ARG
(
3
);
#endif
#endif
Demos/Device/ClassDriver/KeyboardMouseMultiReport/Doxygen.conf
View file @
5430e197
This diff is collapsed.
Click to expand it.
Demos/Device/ClassDriver/KeyboardMouseMultiReport/KeyboardMouseMultiReport.c
View file @
5430e197
/*
/*
LUFA Library
LUFA Library
Copyright (C) Dean Camera, 2011.
Copyright (C) Dean Camera, 2011.
dean [at] fourwalledcubicle [dot] com
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
www.lufa-lib.org
*/
*/
/*
/*
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
software without specific, written prior permission.
The author disclaim all warranties with regard to this
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
arising out of or in connection with the use or performance of
this software.
this software.
*/
*/
/** \file
/** \file
*
*
* Main source file for the KeyboardMouseMultiReport demo. This file contains the main tasks of
* Main source file for the KeyboardMouseMultiReport demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
* the demo and is responsible for the initial application hardware configuration.
*/
*/
#include "KeyboardMouseMultiReport.h"
#include "KeyboardMouseMultiReport.h"
/** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */
/** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */
uint8_t
PrevHIDReportBuffer
[
MAX
(
sizeof
(
USB_KeyboardReport_Data_t
),
sizeof
(
USB_MouseReport_Data_t
))];
uint8_t
PrevHIDReportBuffer
[
MAX
(
sizeof
(
USB_KeyboardReport_Data_t
),
sizeof
(
USB_MouseReport_Data_t
))];
/** LUFA HID Class driver interface configuration and state information. This structure is
/** LUFA HID Class driver interface configuration and state information. This structure is
* passed to all HID Class driver functions, so that multiple instances of the same class
* passed to all HID Class driver functions, so that multiple instances of the same class
* within a device can be differentiated from one another.
* within a device can be differentiated from one another.
*/
*/
USB_ClassInfo_HID_Device_t
Device_HID_Interface
=
USB_ClassInfo_HID_Device_t
Device_HID_Interface
=
{
{
.
Config
=
.
Config
=
{
{
.
InterfaceNumber
=
0
,
.
InterfaceNumber
=
0
,
.
ReportINEndpointNumber
=
HID_IN_EPNUM
,
.
ReportINEndpointNumber
=
HID_IN_EPNUM
,
.
ReportINEndpointSize
=
HID_EPSIZE
,
.
ReportINEndpointSize
=
HID_EPSIZE
,
.
ReportINEndpointDoubleBank
=
false
,
.
ReportINEndpointDoubleBank
=
false
,
.
PrevReportINBuffer
=
PrevHIDReportBuffer
,
.
PrevReportINBuffer
=
PrevHIDReportBuffer
,
.
PrevReportINBufferSize
=
sizeof
(
PrevHIDReportBuffer
),
.
PrevReportINBufferSize
=
sizeof
(
PrevHIDReportBuffer
),
},
},
};
};
/** Main program entry point. This routine contains the overall program flow, including initial
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
* setup of all components and the main program loop.
*/
*/
int
main
(
void
)
int
main
(
void
)
{
{
SetupHardware
();
SetupHardware
();
LEDs_SetAllLEDs
(
LEDMASK_USB_NOTREADY
);
LEDs_SetAllLEDs
(
LEDMASK_USB_NOTREADY
);
sei
();
sei
();
for
(;;)
for
(;;)
{
{
HID_Device_USBTask
(
&
Device_HID_Interface
);
HID_Device_USBTask
(
&
Device_HID_Interface
);
USB_USBTask
();
USB_USBTask
();
}
}
}
}
/** Configures the board hardware and chip peripherals for the demo's functionality. */
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void
SetupHardware
()
void
SetupHardware
()
{
{
/* Disable watchdog if enabled by bootloader/fuses */
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR
&=
~
(
1
<<
WDRF
);
MCUSR
&=
~
(
1
<<
WDRF
);
wdt_disable
();
wdt_disable
();
/* Disable clock division */
/* Disable clock division */
clock_prescale_set
(
clock_div_1
);
clock_prescale_set
(
clock_div_1
);
/* Hardware Initialization */
/* Hardware Initialization */
Joystick_Init
();
Joystick_Init
();
LEDs_Init
();
LEDs_Init
();
USB_Init
();
USB_Init
();
}
}
/** Event handler for the library USB Connection event. */
/** Event handler for the library USB Connection event. */
void
EVENT_USB_Device_Connect
(
void
)
void
EVENT_USB_Device_Connect
(
void
)
{
{
LEDs_SetAllLEDs
(
LEDMASK_USB_ENUMERATING
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ENUMERATING
);
}
}
/** Event handler for the library USB Disconnection event. */
/** Event handler for the library USB Disconnection event. */
void
EVENT_USB_Device_Disconnect
(
void
)
void
EVENT_USB_Device_Disconnect
(
void
)
{
{
LEDs_SetAllLEDs
(
LEDMASK_USB_NOTREADY
);
LEDs_SetAllLEDs
(
LEDMASK_USB_NOTREADY
);
}
}
/** Event handler for the library USB Configuration Changed event. */
/** Event handler for the library USB Configuration Changed event. */
void
EVENT_USB_Device_ConfigurationChanged
(
void
)
void
EVENT_USB_Device_ConfigurationChanged
(
void
)
{
{
bool
ConfigSuccess
=
true
;
bool
ConfigSuccess
=
true
;
ConfigSuccess
&=
HID_Device_ConfigureEndpoints
(
&
Device_HID_Interface
);
ConfigSuccess
&=
HID_Device_ConfigureEndpoints
(
&
Device_HID_Interface
);
USB_Device_EnableSOFEvents
();
USB_Device_EnableSOFEvents
();
LEDs_SetAllLEDs
(
ConfigSuccess
?
LEDMASK_USB_READY
:
LEDMASK_USB_ERROR
);
LEDs_SetAllLEDs
(
ConfigSuccess
?
LEDMASK_USB_READY
:
LEDMASK_USB_ERROR
);
}
}
/** Event handler for the library USB Control Request reception event. */
/** Event handler for the library USB Control Request reception event. */
void
EVENT_USB_Device_ControlRequest
(
void
)
void
EVENT_USB_Device_ControlRequest
(
void
)
{
{
HID_Device_ProcessControlRequest
(
&
Device_HID_Interface
);
HID_Device_ProcessControlRequest
(
&
Device_HID_Interface
);
}
}
/** Event handler for the USB device Start Of Frame event. */
/** Event handler for the USB device Start Of Frame event. */
void
EVENT_USB_Device_StartOfFrame
(
void
)
void
EVENT_USB_Device_StartOfFrame
(
void
)
{
{
HID_Device_MillisecondElapsed
(
&
Device_HID_Interface
);
HID_Device_MillisecondElapsed
(
&
Device_HID_Interface
);
}
}
/** HID class driver callback function for the creation of HID reports to the host.
/** HID class driver callback function for the creation of HID reports to the host.
*
*
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param[in,out] ReportID Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
* \param[in,out] ReportID Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID
* \param[in] ReportType Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature
* \param[in] ReportType Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature
* \param[out] ReportData Pointer to a buffer where the created report should be stored
* \param[out] ReportData Pointer to a buffer where the created report should be stored
* \param[out] ReportSize Number of bytes written in the report (or zero if no report is to be sent
* \param[out] ReportSize Number of bytes written in the report (or zero if no report is to be sent
*
*
* \return Boolean true to force the sending of the report, false to let the library determine if it needs to be sent
* \return Boolean true to force the sending of the report, false to let the library determine if it needs to be sent
*/
*/
bool
CALLBACK_HID_Device_CreateHIDReport
(
USB_ClassInfo_HID_Device_t
*
const
HIDInterfaceInfo
,
bool
CALLBACK_HID_Device_CreateHIDReport
(
USB_ClassInfo_HID_Device_t
*
const
HIDInterfaceInfo
,
uint8_t
*
const
ReportID
,
uint8_t
*
const
ReportID
,
const
uint8_t
ReportType
,
const
uint8_t
ReportType
,
void
*
ReportData
,
void
*
ReportData
,
uint16_t
*
const
ReportSize
)
uint16_t
*
const
ReportSize
)
{
{
uint8_t
JoyStatus_LCL
=
Joystick_GetStatus
();
uint8_t
JoyStatus_LCL
=
Joystick_GetStatus
();
uint8_t
ButtonStatus_LCL
=
Buttons_GetStatus
();
uint8_t
ButtonStatus_LCL
=
Buttons_GetStatus
();
if
(
!
(
ButtonStatus_LCL
&
BUTTONS_BUTTON1
))
if
(
!
(
ButtonStatus_LCL
&
BUTTONS_BUTTON1
))
{
{
USB_KeyboardReport_Data_t
*
KeyboardReport
=
(
USB_KeyboardReport_Data_t
*
)
ReportData
;
USB_KeyboardReport_Data_t
*
KeyboardReport
=
(
USB_KeyboardReport_Data_t
*
)
ReportData
;
KeyboardReport
->
Modifier
=
HID_KEYBOARD_MODIFER_LEFTSHIFT
;
KeyboardReport
->
Modifier
=
HID_KEYBOARD_MODIFER_LEFTSHIFT
;
if
(
JoyStatus_LCL
&
JOY_UP
)
if
(
JoyStatus_LCL
&
JOY_UP
)
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_A
;
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_A
;
else
if
(
JoyStatus_LCL
&
JOY_DOWN
)
else
if
(
JoyStatus_LCL
&
JOY_DOWN
)
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_B
;
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_B
;
if
(
JoyStatus_LCL
&
JOY_LEFT
)
if
(
JoyStatus_LCL
&
JOY_LEFT
)
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_C
;
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_C
;
else
if
(
JoyStatus_LCL
&
JOY_RIGHT
)
else
if
(
JoyStatus_LCL
&
JOY_RIGHT
)
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_D
;
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_D
;
if
(
JoyStatus_LCL
&
JOY_PRESS
)
if
(
JoyStatus_LCL
&
JOY_PRESS
)
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_E
;
KeyboardReport
->
KeyCode
[
0
]
=
HID_KEYBOARD_SC_E
;
*
ReportID
=
HID_REPORTID_KeyboardReport
;
*
ReportID
=
HID_REPORTID_KeyboardReport
;
*
ReportSize
=
sizeof
(
USB_KeyboardReport_Data_t
);
*
ReportSize
=
sizeof
(
USB_KeyboardReport_Data_t
);
return
false
;
return
false
;
}
}
else
else
{
{
USB_MouseReport_Data_t
*
MouseReport
=
(
USB_MouseReport_Data_t
*
)
ReportData
;
USB_MouseReport_Data_t
*
MouseReport
=
(
USB_MouseReport_Data_t
*
)
ReportData
;
if
(
JoyStatus_LCL
&
JOY_UP
)
if
(
JoyStatus_LCL
&
JOY_UP
)
MouseReport
->
Y
=
-
1
;
MouseReport
->
Y
=
-
1
;
else
if
(
JoyStatus_LCL
&
JOY_DOWN
)
else
if
(
JoyStatus_LCL
&
JOY_DOWN
)
MouseReport
->
Y
=
1
;
MouseReport
->
Y
=
1
;
if
(
JoyStatus_LCL
&
JOY_LEFT
)
if
(
JoyStatus_LCL
&
JOY_LEFT
)
MouseReport
->
X
=
-
1
;
MouseReport
->
X
=
-
1
;
else
if
(
JoyStatus_LCL
&
JOY_RIGHT
)
else
if
(
JoyStatus_LCL
&
JOY_RIGHT
)
MouseReport
->
X
=
1
;
MouseReport
->
X
=
1
;
if
(
JoyStatus_LCL
&
JOY_PRESS
)
if
(
JoyStatus_LCL
&
JOY_PRESS
)
MouseReport
->
Button
|=
(
1
<<
0
);
MouseReport
->
Button
|=
(
1
<<
0
);
*
ReportID
=
HID_REPORTID_MouseReport
;
*
ReportID
=
HID_REPORTID_MouseReport
;
*
ReportSize
=
sizeof
(
USB_MouseReport_Data_t
);
*
ReportSize
=
sizeof
(
USB_MouseReport_Data_t
);
return
true
;
return
true
;
}
}
}
}
/** HID class driver callback function for the processing of HID reports from the host.
/** HID class driver callback function for the processing of HID reports from the host.
*
*
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param[in] HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param[in] ReportID Report ID of the received report from the host
* \param[in] ReportID Report ID of the received report from the host
* \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature
* \param[in] ReportType The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature
* \param[in] ReportData Pointer to a buffer where the created report has been stored
* \param[in] ReportData Pointer to a buffer where the created report has been stored
* \param[in] ReportSize Size in bytes of the received HID report
* \param[in] ReportSize Size in bytes of the received HID report
*/
*/
void
CALLBACK_HID_Device_ProcessHIDReport
(
USB_ClassInfo_HID_Device_t
*
const
HIDInterfaceInfo
,
void
CALLBACK_HID_Device_ProcessHIDReport
(
USB_ClassInfo_HID_Device_t
*
const
HIDInterfaceInfo
,
const
uint8_t
ReportID
,
const
uint8_t
ReportID
,
const
uint8_t
ReportType
,
const
uint8_t
ReportType
,
const
void
*
ReportData
,
const
void
*
ReportData
,
const
uint16_t
ReportSize
)
const
uint16_t
ReportSize
)
{
{
uint8_t
LEDMask
=
LEDS_NO_LEDS
;
uint8_t
LEDMask
=
LEDS_NO_LEDS
;
uint8_t
*
LEDReport
=
(
uint8_t
*
)
ReportData
;
uint8_t
*
LEDReport
=
(
uint8_t
*
)
ReportData
;
if
(
*
LEDReport
&
HID_KEYBOARD_LED_NUMLOCK
)
if
(
*
LEDReport
&
HID_KEYBOARD_LED_NUMLOCK
)
LEDMask
|=
LEDS_LED1
;
LEDMask
|=
LEDS_LED1
;
if
(
*
LEDReport
&
HID_KEYBOARD_LED_CAPSLOCK
)
if
(
*
LEDReport
&
HID_KEYBOARD_LED_CAPSLOCK
)
LEDMask
|=
LEDS_LED3
;
LEDMask
|=
LEDS_LED3
;
if
(
*
LEDReport
&
HID_KEYBOARD_LED_SCROLLLOCK
)
if
(
*
LEDReport
&
HID_KEYBOARD_LED_SCROLLLOCK
)
LEDMask
|=
LEDS_LED4
;
LEDMask
|=
LEDS_LED4
;
LEDs_SetAllLEDs
(
LEDMask
);
LEDs_SetAllLEDs
(
LEDMask
);
}
}
Demos/Device/ClassDriver/KeyboardMouseMultiReport/KeyboardMouseMultiReport.h
View file @
5430e197
/*
/*
LUFA Library
LUFA Library
Copyright (C) Dean Camera, 2011.
Copyright (C) Dean Camera, 2011.
dean [at] fourwalledcubicle [dot] com
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
www.lufa-lib.org
*/
*/
/*
/*
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
software without specific, written prior permission.
The author disclaim all warranties with regard to this