static int test_write_block(const char *val, struct kernel_param *kp)
{
	int i;
	int err;
/* LGE_CHANGE_S [[email protected]] 2010-08-22, merge First Boot Complete Test from VS660 */
	unsigned char *test_string;
	unsigned long flag=0;
	// LGE_CHANGE [[email protected]] 2010-08-23, do something after cold boot
	struct diagcmd_dev *diagpdev;

	flag = simple_strtoul(val,NULL,10);
	if(5 == flag)
		test_string="FACT_RESET_5";
	else if(6 == flag)
		test_string="FACT_RESET_6";
	// LGE_CHANGE [[email protected]] 2010-09-04, for RTN and Factory reset
	else if (3 == flag)
		test_string="FACT_RESET_3";
	else
		return -1;
	
	test_init();
	test_erase_block();
	printk(KERN_INFO"%s: writing block: flag = %lu\n", __func__, flag);
/* LGE_CHANGE_E [[email protected]] 2010-08-22, merge First Boot Complete Test from VS660 */
	
	for (i = 0; i < ebcnt; i++) {
		if (bbt[i])
			continue;
		else
			break;
	}
#ifdef LGE_RETRY_MTD_DIRECT_ACCESS
	err = lge_retry_write_block(i, test_string, strlen(test_string));
#else
	err = lge_write_block(i, test_string, strlen(test_string));
#endif
	if (err) {
		printk(KERN_INFO"%s: write %u block fail\n", __func__, i);
		return err;
	}
	
	printk(KERN_INFO"%s: write %u block\n", __func__, i);
	
	// LGE_CHANGE [[email protected]] 2010-08-23, do something after cold boot
	if (flag == 5) {
		diagpdev = diagcmd_get_dev();	
		if (diagpdev != NULL) {
			update_diagcmd_state(diagpdev, "ADBSET", 0);
		}
	}
	
	return 0;
}
/* ==========================================================================
   ===========================================================================*/


PACK (void *)LGF_TestMode (
			PACK (void	*)req_pkt_ptr,	/* pointer to request packet  */
			uint16		pkt_len )		      /* length of request packet   */
{
	DIAG_TEST_MODE_F_req_type *req_ptr = (DIAG_TEST_MODE_F_req_type *) req_pkt_ptr;
	DIAG_TEST_MODE_F_rsp_type *rsp_ptr;
	unsigned int rsp_len;
	testmode_func_type func_ptr= NULL;
	int nIndex = 0;

	diagpdev = diagcmd_get_dev();

	if(req_ptr->sub_cmd_code == TEST_MODE_FACTORY_RESET_CHECK_TEST)
		rsp_len = sizeof(DIAG_TEST_MODE_F_rsp_type) - sizeof(test_mode_rsp_type);
	else
		rsp_len = sizeof(DIAG_TEST_MODE_F_rsp_type);

	rsp_ptr = (DIAG_TEST_MODE_F_rsp_type *)diagpkt_alloc(DIAG_TEST_MODE_F, rsp_len);

	if (!rsp_ptr)
		return 0;

	rsp_ptr->sub_cmd_code = req_ptr->sub_cmd_code;
	rsp_ptr->ret_stat_code = TEST_OK_S; // ÃʱⰪ

	for( nIndex = 0 ; nIndex < TESTMODE_MSTR_TBL_SIZE  ; nIndex++)
static int lge_diag_ioctl(struct inode *inode, struct file *filp,
		unsigned int cmd, unsigned long arg)
{
	struct diag_cmd_data ctrl_buf;
	int ret;

	diagpdev = diagcmd_get_dev();		
	switch (cmd) {
		
		case DIAG_IOCTL_UPDATE: 
			if(copy_from_user(&ctrl_buf , arg ,sizeof(struct diag_cmd_data))){
				printk(KERN_INFO "%s: copy_from_user error.\n", __func__);
				ret = -EFAULT;
			}
			printk(KERN_INFO "%d: ctrl_buf.sub_cmd_code\n", ctrl_buf.sub_cmd_code);
			printk(KERN_INFO "%d: ctrl_buf.state\n", ctrl_buf.state);
			switch(ctrl_buf.sub_cmd_code){
				/* Test Mode */	
				case TEST_MODE_MOTOR:
					update_diagcmd_state(diagpdev,"MOTOR", ctrl_buf.state); 
					break;
				
				case TEST_MODE_ACOUSTIC:
					update_diagcmd_state(diagpdev,"ACOUSTIC", ctrl_buf.state); 
					break;

				case TEST_MODE_CAM:
					update_diagcmd_state(diagpdev,"CAMERA", ctrl_buf.state); 
					break;

				case TEST_MODE_BLUETOOTH_TEST:
					update_diagcmd_state(diagpdev,"BT_TEST_MODE", ctrl_buf.state); 
					break;

				case TEST_MODE_MP3_TEST:
					update_diagcmd_state(diagpdev,"MP3", ctrl_buf.state); 
					break;

/* LGE_CHANGE_S [[email protected]] [2011.05.05] [B project] added for accelerometer testmode [START] */
				case TEST_MODE_ACCEL_SENSOR_TEST:
					update_diagcmd_state(diagpdev,"ACCEL", ctrl_buf.state); 
					break;
/* LGE_CHANGE_E [[email protected]] [2011.05.05] [B project] added for accelerometer testmode [END] */

				case TEST_MODE_FM_TRANCEIVER_TEST:
					update_diagcmd_state(diagpdev,"FM_TRANCEIVER", ctrl_buf.state); 
					break;

				case TEST_MODE_SLEEP_MODE_TEST:
					update_diagcmd_state(diagpdev,"SLEEP_MODE", ctrl_buf.state); 
					break;

				case TEST_MODE_SPEAKER_PHONE_TEST:
					update_diagcmd_state(diagpdev,"SPEAKERPHONE", ctrl_buf.state); 
					break;

				case TEST_MODE_VOLUME_TEST:
					update_diagcmd_state(diagpdev,"VOLUMELEVEL", ctrl_buf.state); 
					break;

				case TEST_MODE_HFA_TEST:
					update_diagcmd_state(diagpdev,"HFA", ctrl_buf.state); 
					break;
		
				case TEST_MODE_DB_INTEGRITY_TEST:
					update_diagcmd_state(diagpdev,"DBCHECK", ctrl_buf.state); 
					break;

//20110519 [email protected] [LS855] adding cod for gyro test [START]
				case TEST_MODE_GYRO_SENSOR_TEST:
					update_diagcmd_state(diagpdev,"GYRO", ctrl_buf.state); 
					break;
//20110519 [email protected] [LS855] adding cod for gyro test [END]

				case TEST_MODE_MANUAL_MODE_TEST://20110608
					update_diagcmd_state(diagpdev,"MANUALMODE", ctrl_buf.state); 
                    break;

// 20110611 [email protected] test script on -> go to Idle START
				case TEST_MODE_TEST_SCRIPT_MODE:
					update_diagcmd_state(diagpdev,"TESTSCRIPTMODE", ctrl_buf.state); 
					break;
// 20110611 [email protected] test script on -> go to Idle END
						
				/* for slate */	
				case ICD_EXTENDEDVERSIONINFO_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_GETEXTENDEDVERSION", ctrl_buf.state); 
					break;
				
				case ICD_GETAIRPLANEMODE_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_GETAIRPLANEMODE", ctrl_buf.state); 
					break;
				
				case ICD_SETAIRPLANEMODE_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_SETAIRPLANEMODE", ctrl_buf.state); 
					break;
				
				case ICD_GETBACKLIGHTSETTING_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_GETBACKLIGHTSETTING", ctrl_buf.state); 
					break;
				
				case ICD_SETBACKLIGHTSETTING_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_SETBACKLIGHTSETTING", ctrl_buf.state); 
					break;
				
				case ICD_GETBLUETOOTHSTATUS_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_GETBLUETOOTH", ctrl_buf.state); 
					break;
				
				case ICD_SETBLUETOOTHSTATUS_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_SETBLUETOOTH", ctrl_buf.state); 
					break;
				
				case ICD_GETUISCREENID_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_GETUISCREENID", ctrl_buf.state); 
					break;
					
				case ICD_GETWIFISTATUS_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_GETWIFISTATUS", ctrl_buf.state); 
					break;
					
				case ICD_SETWIFISTATUS_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_SETWIFISTATUS", ctrl_buf.state); 
					break;
					
				case ICD_SETSCREENORIENTATIONLOCK_REQ_IOCTL:
					update_diagcmd_state(diagpdev,"ICD_SETORIENTATIONLOCK", ctrl_buf.state); 
					break;

			}

		break;
		
		default: 
			break;
	}
	
	return 0;
}