/*
 * ANT Stack
 *
 * Copyright 2011 Dynastream Innovations
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*******************************************************************************\
*
*   FILE NAME:    ant_driver_defines.h
*
*   BRIEF:
*      This file defines ANT specific HCI values used by the ANT chip for a
*      sample TTY implementation.
*
*
\*******************************************************************************/

#ifndef __VFS_PRERELEASE_H
#define __VFS_PRERELEASE_H

// -----------------------------------------
// |         Header       | Data |  Footer  |
// |----------------------|-----------------|
// |Optional| Data | Opt. | ...  | Optional |
// | Opcode | Size | Sync |      | Checksum |

// Data may include any number of ANT packets, with no sync byte or checksum.
// A read from the driver may return any number of ANT HCI packets.


// ---------------------- REQUIRED

// Which chip is this library being built for:
#define ANT_CHIP_NAME                        "TTY"

// Set the file name the driver creates for the ANT device:
//   If chip uses separate command and data paths:
// #define ANT_COMMANDS_DEVICE_NAME             "/dev/smd5"
// #define ANT_DATA_DEVICE_NAME                 "/dev/smd6"
// OR
//   If chip uses one path:
#define ANT_DEVICE_NAME                      "/dev/ant"

// Set to the number of bytes of header is for Opcode:
#define ANT_HCI_OPCODE_SIZE                  0

// Set to the number of bytes of header for channel ID
#define ANT_HCI_CHANNEL_SIZE                 1

// Set to the number of bytes of header is for Data Size:
#define ANT_HCI_SIZE_SIZE                    1

// Set to the number of bytes of header is for Sync:
#define ANT_HCI_SYNC_SIZE                    0

// Set to the number of bytes of footer is for Checksum:
#define ANT_HCI_CHECKSUM_SIZE                0

// ---------------------- OPTIONAL

// If hard reset is supported, define ANT_IOCTL_RESET
// #define ANT_IOCTL_RESET                      _IOW('U', 210, int)
// #define ANT_IOCTL_RESET_PARAMETER            (0)

// If the chip sends flow control messages:
//  Define the Opcode for a Flow Control message:
#define ANT_MESG_FLOW_CONTROL                ((ANT_U8)0xC9)
// AND
//   define the message content:
//     That signals Flow Go:
#define ANT_FLOW_GO                          ((ANT_U8)0x00)

//     That signals Flow Stop:
#define ANT_FLOW_STOP                        ((ANT_U8)0x80)

// If using a channel ID byte, define the ids.
#define ANT_HCI_COMMAND_CHANNEL              ((ANT_U8)0x0C)
#define ANT_HCI_DATA_CHANNEL                 ((ANT_U8)0x0E)

#endif /* ifndef __VFS_PRERELEASE_H */
