aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard/cypressbln/issp_driver_routines.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/keyboard/cypressbln/issp_driver_routines.c')
-rw-r--r--drivers/input/keyboard/cypressbln/issp_driver_routines.c498
1 files changed, 498 insertions, 0 deletions
diff --git a/drivers/input/keyboard/cypressbln/issp_driver_routines.c b/drivers/input/keyboard/cypressbln/issp_driver_routines.c
new file mode 100644
index 0000000..a3b4fcf
--- /dev/null
+++ b/drivers/input/keyboard/cypressbln/issp_driver_routines.c
@@ -0,0 +1,498 @@
+// filename: ISSP_Driver_Routines.c
+#include "issp_revision.h"
+#ifdef PROJECT_REV_304
+/* Copyright 2006-2007, Cypress Semiconductor Corporation.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONRTACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND,EXPRESS OR IMPLIED,
+ WITH REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ Cypress reserves the right to make changes without further notice to the
+ materials described herein. Cypress does not assume any liability arising
+ out of the application or use of any product or circuit described herein.
+ Cypress does not authorize its products for use as critical components in
+ life-support systems where a malfunction or failure may reasonably be
+ expected to result in significant injury to the user. The inclusion of
+ Cypress� product in a life-support systems application implies that the
+ manufacturer assumes all risk of such use and in doing so indemnifies
+ Cypress against all charges.
+
+ Use may be limited by and subject to the applicable Cypress software
+ license agreement.
+
+--------------------------------------------------------------------------*/
+
+#include <linux/module.h>
+
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/sched.h>
+#include <linux/pm.h>
+#include <linux/sysctl.h>
+#include <linux/proc_fs.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/input.h>
+#include <mach/regs-gpio.h>
+#include <plat/gpio-cfg.h>
+#include <asm/gpio.h>
+#include <linux/miscdevice.h>
+#include <asm/uaccess.h>
+#include <linux/earlysuspend.h>
+#include <asm/io.h>
+#include <linux/hrtimer.h>
+
+//mhsong #include <m8c.h> // part specific constants and macros
+//mhsong #include "PSoCAPI.h" // PSoC API definitions for all User Modules
+#include "issp_defs.h"
+#include "issp_errors.h"
+#include "issp_directives.h"
+#include "u1-cypress-gpio.h"
+
+extern unsigned char bTargetDataPtr;
+extern unsigned char abTargetDataOUT[TARGET_DATABUFF_LEN];
+
+/* enable ldo11 */
+extern int touchkey_ldo_on(bool on);
+
+// ****************************** PORT BIT MASKS ******************************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+#define SDATA_PIN 0x80 // P1.0 -> P1.4
+#define SCLK_PIN 0x40 // P1.1 -> P1.3
+#define XRES_PIN 0x40 // P2.0 -> P1.6
+#define TARGET_VDD 0x08 // P2.1
+
+unsigned int nBlockCount = 1; // test, KIMC
+
+extern unsigned char firmware_data[];
+
+// ((((((((((((((((((((((( DEMO ISSP SUBROUTINE SECTION )))))))))))))))))))))))
+// ((((( Demo Routines can be deleted in final ISSP project if not used )))))
+// ((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
+
+// ============================================================================
+// InitTargetTestData()
+// !!!!!!!!!!!!!!!!!!FOR TEST!!!!!!!!!!!!!!!!!!!!!!!!!!
+// PROCESSOR_SPECIFIC
+// Loads a 64-Byte array to use as test data to program target. Ultimately,
+// this data should be fed to the Host by some other means, ie: I2C, RS232,
+// etc. Data should be derived from hex file.
+// Global variables affected:
+// bTargetDataPtr
+// abTargetDataOUT
+// ============================================================================
+void InitTargetTestData(unsigned char bBlockNum, unsigned char bBankNum)
+{
+ // create unique data for each block
+ for (bTargetDataPtr = 0; bTargetDataPtr < TARGET_DATABUFF_LEN;
+ bTargetDataPtr++) {
+ abTargetDataOUT[bTargetDataPtr] = nBlockCount;
+ // abTargetDataOUT[bTargetDataPtr] = bTargetDataPtr + bBlockNum + bBankNum;
+ }
+ nBlockCount++;
+}
+
+// ============================================================================
+// LoadArrayWithSecurityData()
+// !!!!!!!!!!!!!!!!!!FOR TEST!!!!!!!!!!!!!!!!!!!!!!!!!!
+// PROCESSOR_SPECIFIC
+// Most likely this data will be fed to the Host by some other means, ie: I2C,
+// RS232, etc., or will be fixed in the host. The security data should come
+// from the hex file.
+// bStart - the starting byte in the array for loading data
+// bLength - the number of byte to write into the array
+// bType - the security data to write over the range defined by bStart and
+// bLength
+// ============================================================================
+void LoadArrayWithSecurityData(unsigned char bStart, unsigned char bLength,
+ unsigned char bType)
+{
+ // Now, write the desired security-bytes for the range specified
+ for (bTargetDataPtr = bStart; bTargetDataPtr < bLength;
+ bTargetDataPtr++) {
+ abTargetDataOUT[bTargetDataPtr] = bType;
+ }
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// Delay()
+// This delay uses a simple "nop" loop. With the CPU running at 24MHz, each
+// pass of the loop is about 1 usec plus an overhead of about 3 usec.
+// total delay = (n + 3) * 1 usec
+// To adjust delays and to adapt delays when porting this application, see the
+// ISSP_Delays.h file.
+// ****************************************************************************
+void Delay(unsigned char n) // by KIMC
+{
+ udelay(n);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// LoadProgramData()
+// The final application should load program data from HEX file generated by
+// PSoC Designer into a 64 byte host ram buffer.
+// 1. Read data from next line in hex file into ram buffer. One record
+// (line) is 64 bytes of data.
+// 2. Check host ram buffer + record data (Address, # of bytes) against hex
+// record checksum at end of record line
+// 3. If error reread data from file or abort
+// 4. Exit this Function and Program block or verify the block.
+// This demo program will, instead, load predetermined data into each block.
+// The demo does it this way because there is no comm link to get data.
+// ****************************************************************************
+void LoadProgramData(unsigned char bBlockNum, unsigned char bBankNum)
+{
+ // >>> The following call is for demo use only. <<<
+ // Function InitTargetTestData fills buffer for demo
+ // InitTargetTestData(bBlockNum, bBankNum);
+ // create unique data for each block
+ int dataNum = 0;
+ for (dataNum = 0; dataNum < TARGET_DATABUFF_LEN; dataNum++) {
+ abTargetDataOUT[dataNum] =
+ firmware_data[bBlockNum * TARGET_DATABUFF_LEN + dataNum];
+ // abTargetDataOUT[bTargetDataPtr] = bTargetDataPtr + bBlockNum + bBankNum;
+ }
+
+ // Note:
+ // Error checking should be added for the final version as noted above.
+ // For demo use this function just returns VOID.
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// fLoadSecurityData()
+// Load security data from hex file into 64 byte host ram buffer. In a fully
+// functional program (not a demo) this routine should do the following:
+// 1. Read data from security record in hex file into ram buffer.
+// 2. Check host ram buffer + record data (Address, # of bytes) against hex
+// record checksum at end of record line
+// 3. If error reread security data from file or abort
+// 4. Exit this Function and Program block
+// In this demo routine, all of the security data is set to unprotected (0x00)
+// and it returns.
+// This function always returns PASS. The flag return is reserving
+// functionality for non-demo versions.
+// ****************************************************************************
+signed char fLoadSecurityData(unsigned char bBankNum)
+{
+ // >>> The following call is for demo use only. <<<
+ // Function LoadArrayWithSecurityData fills buffer for demo
+// LoadArrayWithSecurityData(0,SECURITY_BYTES_PER_BANK, 0x00);
+ LoadArrayWithSecurityData(0, SECURITY_BYTES_PER_BANK, 0xFF); //PTJ: 0x1B (00 01 10 11) is more interesting security data than 0x00 for testing purposes
+
+ // Note:
+ // Error checking should be added for the final version as noted above.
+ // For demo use this function just returns PASS.
+ return (PASS);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// fSDATACheck()
+// Check SDATA pin for high or low logic level and return value to calling
+// routine.
+// Returns:
+// 0 if the pin was low.
+// 1 if the pin was high.
+// ****************************************************************************
+unsigned char fSDATACheck(void)
+{
+ gpio_direction_input(_3_TOUCH_SDA_28V);
+ if (gpio_get_value(_3_TOUCH_SDA_28V))
+ return (1);
+ else
+ return (0);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SCLKHigh()
+// Set the SCLK pin High
+// ****************************************************************************
+void SCLKHigh(void)
+{
+ gpio_direction_output(_3_TOUCH_SCL_28V, 1);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SCLKLow()
+// Make Clock pin Low
+// ****************************************************************************
+void SCLKLow(void)
+{
+ gpio_direction_output(_3_TOUCH_SCL_28V, 0);
+}
+
+#ifndef RESET_MODE // Only needed for power cycle mode
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetSCLKHiZ()
+// Set SCLK pin to HighZ drive mode.
+// ****************************************************************************
+void SetSCLKHiZ(void)
+{
+ gpio_direction_input(_3_TOUCH_SCL_28V);
+}
+#endif
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetSCLKStrong()
+// Set SCLK to an output (Strong drive mode)
+// ****************************************************************************
+void SetSCLKStrong(void)
+{
+ //gpio_direction_output(_3_TOUCH_SCL_28V, 1);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetSDATAHigh()
+// Make SDATA pin High
+// ****************************************************************************
+void SetSDATAHigh(void)
+{
+ gpio_direction_output(_3_TOUCH_SDA_28V, 1);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetSDATALow()
+// Make SDATA pin Low
+// ****************************************************************************
+void SetSDATALow(void)
+{
+ gpio_direction_output(_3_TOUCH_SDA_28V, 0);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetSDATAHiZ()
+// Set SDATA pin to an input (HighZ drive mode).
+// ****************************************************************************
+void SetSDATAHiZ(void)
+{
+ gpio_direction_input(_3_TOUCH_SDA_28V); // ENA-> DIS
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetSDATAStrong()
+// Set SDATA for transmission (Strong drive mode) -- as opposed to being set to
+// High Z for receiving data.
+// ****************************************************************************
+void SetSDATAStrong(void)
+{
+ //gpio_direction_output(_3_TOUCH_SDA_28V, 1);
+}
+
+#ifdef RESET_MODE
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetXRESStrong()
+// Set external reset (XRES) to an output (Strong drive mode).
+// ****************************************************************************
+void SetXRESStrong(void)
+{
+ //gpio_tlmm_config(EXT_TSP_RST);
+ //gpio_out(EXT_TSP_RST, GPIO_HIGH_VALUE);
+ //clk_busy_wait(1000);
+ //clk_busy_wait(1000);
+ //clk_busy_wait(1000);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// AssertXRES()
+// Set XRES pin High
+// ****************************************************************************
+void AssertXRES(void)
+{
+#if 0
+ gpio_tlmm_config(EXT_TSP_RST);
+ gpio_out(EXT_TSP_RST, GPIO_HIGH_VALUE);
+ clk_busy_wait(1000);
+ clk_busy_wait(1000);
+ clk_busy_wait(1000);
+#endif
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// DeassertXRES()
+// Set XRES pin low.
+// ****************************************************************************
+void DeassertXRES(void)
+{
+ //gpio_out(EXT_TSP_RST, GPIO_LOW_VALUE);
+}
+#else
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// SetTargetVDDStrong()
+// Set VDD pin (PWR) to an output (Strong drive mode).
+// ****************************************************************************
+void SetTargetVDDStrong(void)
+{
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// ApplyTargetVDD()
+// Provide power to the target PSoC's Vdd pin through a GPIO.
+// ****************************************************************************
+void ApplyTargetVDD(void)
+{
+ int ret;
+
+ gpio_direction_input(_3_TOUCH_SDA_28V);
+ gpio_direction_input(_3_TOUCH_SCL_28V);
+ gpio_direction_output(_3_GPIO_TOUCH_EN, 1);
+
+ /* enable ldo */
+ ret = touchkey_ldo_on(1);
+ if (ret == 0)
+ printk(KERN_ERR "[Touchkey]regulator get fail!!!\n");
+
+ mdelay(1);
+}
+
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// RemoveTargetVDD()
+// Remove power from the target PSoC's Vdd pin.
+// ****************************************************************************
+void RemoveTargetVDD(void)
+{
+ gpio_direction_output(_3_GPIO_TOUCH_EN, 0);
+
+ touchkey_ldo_on(0);
+}
+#endif
+
+#ifdef USE_TP
+// ********************* LOW-LEVEL ISSP SUBROUTINE SECTION ********************
+// ****************************************************************************
+// **** PROCESSOR SPECIFIC ****
+// ****************************************************************************
+// **** USER ATTENTION REQUIRED ****
+// ****************************************************************************
+// A "Test Point" sets a GPIO pin of the host processor high or low.
+// This GPIO pin can be observed with an oscilloscope to verify the timing of
+// key programming steps. TPs have been added in main() that set Port 0, pin 1
+// high during bulk erase, during each block write and during security write.
+// The timing of these programming steps should be verified as correct as part
+// of the validation process of the final program.
+// ****************************************************************************
+void InitTP(void)
+{
+}
+
+void SetTPHigh(void)
+{
+}
+
+void SetTPLow(void)
+{
+}
+
+void ToggleTP(void)
+{
+}
+#endif
+#endif //(PROJECT_REV_)
+//end of file ISSP_Drive_Routines.c