📄 motion_sensor_custom.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* motion_sensor_custom.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This Module is for motion sensor driver.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#if defined(MOTION_SENSOR_SUPPORT)
#include "kal_release.h"
#include "custom_config.h"
#include "gpio_sw.h"
#include "drv_comm.h"
#include "motion_sensor.h"
#include "motion_sensor_hw_define.h"
#include "motion_sensor_custom.h"
kal_uint8 acce_test_flag=0;
#ifdef MCU_104M
#define delay_short 35
#define delay_long 35
#else /*MCU_104M*/
#define delay_short 0
#define delay_long 0
#endif /*MCU_104M*/
/*customizaton function pointer*/
MotionSensor_customize_function_struct ms_custom_func=
{
ms_get_data,
acc_sensor_get_5bytes,
acc_sensor_init,
acc_sensor_pwr_up,
acc_sensor_pwr_down
};
/*customizaton data*/
MotionSensor_custom_data_struct ms_custom_data_def =
{
/*X axis*/
ACC_0G_X,
ACC_1G_X,
ACC_MINUS1G_X,
/*Y axis*/
ACC_0G_Y,
ACC_1G_Y,
ACC_MINUS1G_Y,
/*Z axis*/
ACC_0G_Z,
ACC_1G_Z,
ACC_MINUS1G_Z
};
/*Customization functin*/
/*
* FUNCTION
* acc_sensor_get_5bytes
*
* DESCRIPTION
* This function is to get ADC value in every axis
*
* CALLS
*
* PARAMETERS
* x_adc: ADC value in X-axis
* y_adc: ADC value in Y-axis
* z_adc: ADC value in Z-axis
*
* RETURNS
* None
*/
//kal_uint16 acc_start, acc_end;
void acc_sensor_get_5bytes(kal_uint16 *x_adc, kal_uint16 *y_adc, kal_uint16 *z_adc)
{
//signed char i,j;
kal_int32 i,j;
kal_uint16 x_out, y_out;
//kal_uint32 savedMask;
kal_uint16 get_byte[5]={0};
//savedMask = SaveAndSetIRQMask();
//acc_start=DRV_Reg(0x80200000);
/*----- START -----*/
SET_I2C_DATA_OUTPUT;
SET_I2C_CLK_OUTPUT;
SET_I2C_DATA_HIGH;
SET_I2C_CLK_HIGH;
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_LOW;
/*----- SEND -----*/
//----- 1ST --------
for(j=0;j<delay_long;j++);
for (i=7;i>=0;i--)
{ /* data bit 7~0 */
if (MXC6202_I2C_SLAVE_ADDR & (1<<i)) /* 0x20 -> slave address & write */
{
SET_I2C_DATA_HIGH;
}
else
{
SET_I2C_DATA_LOW;
}
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
}
/* don't care bit, 9th bit */
SET_I2C_DATA_LOW;
SET_I2C_DATA_INPUT;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
SET_I2C_DATA_OUTPUT;
//----- 2ND --------
for (i=7;i>=0;i--)
{ /* data bit 7~0 */
if (0x00 & (1<<i)) /* starting address to read */
{
SET_I2C_DATA_HIGH;
}
else
{
SET_I2C_DATA_LOW;
}
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
}
/* don't care bit, 9th bit */
SET_I2C_DATA_LOW;
SET_I2C_DATA_INPUT;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
SET_I2C_DATA_OUTPUT;
/*----- RESTART -----*/
SET_I2C_DATA_HIGH;
SET_I2C_CLK_HIGH;
for(j=0;j<delay_short;j++);
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_LOW;
//----- 3RD --------
for (i=7;i>=0;i--)
{ /* data bit 7~0 */
if ((MXC6202_I2C_SLAVE_ADDR+1) & (1<<i)) /* 0x21 -> slave address & read */
{
SET_I2C_DATA_HIGH;
}
else
{
SET_I2C_DATA_LOW;
}
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
}
/* don't care bit, 9th bit */
SET_I2C_DATA_LOW;
SET_I2C_DATA_INPUT;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
SET_I2C_DATA_OUTPUT;
//----- 4TH --------
// Get 1st data
SET_I2C_DATA_INPUT;
for (i=7;i>=0;i--)
{ // data bit 7~0
SET_I2C_CLK_HIGH;
for(j=0;j<delay_short;j++);
if (GET_I2C_DATA_BIT)
get_byte[0] |= (1<<i);
SET_I2C_CLK_LOW;
for(j=0;j<delay_long;j++);
}
// don't care bit, 9th bit
SET_I2C_DATA_OUTPUT;
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
//----- 5TH --------
// Get 2nd data
SET_I2C_DATA_INPUT;
for (i=7;i>=0;i--)
{ // data bit 7~0
SET_I2C_CLK_HIGH;
for(j=0;j<delay_short;j++);
if (GET_I2C_DATA_BIT)
get_byte[1] |= (1<<i);
SET_I2C_CLK_LOW;
for(j=0;j<delay_long;j++);
}
// don't care bit, 9th bit
SET_I2C_DATA_OUTPUT;
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
//----- 6TH --------
// Get 3rd data
SET_I2C_DATA_INPUT;
for (i=7;i>=0;i--)
{ // data bit 7~0
SET_I2C_CLK_HIGH;
for(j=0;j<delay_short;j++);
if (GET_I2C_DATA_BIT)
get_byte[2] |= (1<<i);
SET_I2C_CLK_LOW;
for(j=0;j<delay_long;j++);
}
// don't care bit, 9th bit
SET_I2C_DATA_OUTPUT;
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
//----- 7TH --------
// Get 4th data
SET_I2C_DATA_INPUT;
for (i=7;i>=0;i--)
{ // data bit 7~0
SET_I2C_CLK_HIGH;
for(j=0;j<delay_short;j++);
if (GET_I2C_DATA_BIT)
get_byte[3] |= (1<<i);
SET_I2C_CLK_LOW;
for(j=0;j<delay_long;j++);
}
// don't care bit, 9th bit
SET_I2C_DATA_OUTPUT;
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
//----- 8TH --------
// Get 5th data
SET_I2C_DATA_INPUT;
for (i=7;i>=0;i--)
{ // data bit 7~0
SET_I2C_CLK_HIGH;
for(j=0;j<delay_short;j++);
if (GET_I2C_DATA_BIT)
get_byte[4] |= (1<<i);
SET_I2C_CLK_LOW;
for(j=0;j<delay_long;j++);
}
/*
// don't care bit, 9th bit
SET_I2C_DATA_OUTPUT;
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_long;j++);
SET_I2C_CLK_LOW;
*/
/*----- STOP -----*/
SET_I2C_CLK_OUTPUT;
SET_I2C_DATA_OUTPUT;
SET_I2C_CLK_LOW;
SET_I2C_DATA_LOW;
for(j=0;j<delay_short;j++);
SET_I2C_CLK_HIGH;
for(j=0;j<delay_short;j++);
SET_I2C_DATA_HIGH;
//acc_end=DRV_Reg(0x80200000);
//RestoreIRQMask(savedMask);
*x_adc=(get_byte[1]<<8)|get_byte[2];
*y_adc=(get_byte[3]<<8)|get_byte[4];
*z_adc=0;
/*test*/
x_out=(get_byte[1]<<8)|get_byte[2];
y_out=(get_byte[3]<<8)|get_byte[4];
for( j=0; j<5; j++) get_byte[j] = 0;
} /* I2C_send_byte() */
/*
* FUNCTION
* acc_sensor_pwr_up
*
* DESCRIPTION
* This function is to power up acceleration module
*
* CALLS
*
* PARAMETERS
* None
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -