usb host 驱动 - device 拔插

1. usbhid 设备拔插

1.1 usb device disconnect

1.1.1 上层卸载usb 设备驱动

生成应用通过ioctl 卸载usb 设备。

[ 709.471619] [T29796] Kernel panic - not syncing: Object already free
[ 709.478060] [T29796] CPU: 4 PID: 29796 Comm: GConnection0 Tainted: G S B O 5.4.134-qgki-debug-g8c50b8eb5d9c #1
[ 709.489217] [T29796] Hardware name: xxxx. 
[ 709.497527] [T29796] Call trace:
[ 709.500761] [T29796] dump_backtrace.cfi_jt+0x0/0x4
[ 709.505687] [T29796] show_stack+0x18/0x24
[ 709.509815] [T29796] dump_stack+0xd8/0x158
[ 709.514027] [T29796] panic+0x18c/0x400
[ 709.517880] [T29796] kmem_cache_flags+0x0/0xc4
[ 709.522451] [T29796] slab_bug+0x0/0xe0
[ 709.526304] [T29796] free_debug_processing+0x3fc/0x448
[ 709.531588] [T29796] __slab_free+0x64/0x368
[ 709.535895] [T29796] kfree+0x2c4/0x370
[ 709.539748] [T29796] usbhid_stop+0x178/0x1fc
[ 709.544138] [T29796] hid_hw_stop+0x9c/0xf8
[ 709.548350] [T29796] hid_device_remove+0x70/0xd0			// struct bus_type hid_bus_type             .remove = hid_device_remove,
[ 709.553098] [T29796] device_release_driver_internal+0x190/0x2ec		// dev->bus->remove(dev);
[ 709.559180] [T29796] device_release_driver+0x18/0x24		// *dev = &hdev->dev
[ 709.564284] [T29796] bus_remove_device+0x134/0x160
[ 709.569210] [T29796] device_del+0x2e8/0x55c				// device_del(&hdev->dev);    删除 hid_dev
[ 709.573517] [T29796] hid_destroy_device+0x2c/0x6c
[ 709.578360] [T29796] usbhid_disconnect+0x68/0xa4			// driver->disconnect(intf);           intf 驱动
[ 709.583108] [T29796] usb_unbind_interface+0xd0/0x270		// new_driver->drvwrap.driver.remove = usb_unbind_interface;
[ 709.588213] [T29796] device_release_driver_internal+0x1cc/0x2ec	// drv->remove(dev);
[ 709.594295] [T29796] device_release_driver+0x18/0x24		// *dev = &iface->dev;
[ 709.599400] [T29796] usb_driver_release_interface+0x78/0x8c
[ 709.605123] [T29796] proc_ioctl+0x224/0x258
[ 709.609430] [T29796] usbdev_do_ioctl+0xc7c/0x132c
[ 709.614273] [T29796] usbdev_ioctl+0x10/0x20
[ 709.618580] [T29796] do_vfs_ioctl+0x39c/0x700
[ 709.623064] [T29796] __arm64_sys_ioctl+0x78/0xa4
[ 709.627812] [T29796] el0_svc_common+0xbc/0x1c8
[ 709.632383] [T29796] el0_svc_handler+0x74/0x98
[ 709.636952] [T29796] el0_svc+0x8/0xc

(1)用户空间:

ioctl(fd, IOCTL_USBFS_IOCTL, &command); 	//系统调用,操作设备节点/dev

(2)内核空间:

const struct file_operations usbdev_file_operations = {
	.read =		  usbdev_read,
	.poll =		  usbdev_poll,
	.unlocked_ioctl = usbdev_ioctl,
	.open =		  usbdev_open,
	.release =	  usbdev_release,
};
// 卸载usb 接口设备intf
== usbdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
	== usbdev_do_ioctl(file, cmd, (void __user *)arg);
		== proc_ioctl(struct usb_dev_state *ps, struct usbdevfs_ioctl *ctl);
			//== device_attach(&intf->dev);					// USBDEVFS_CONNECT
			== usb_driver_release_interface(driver, intf);	// USBDEVFS_DISCONNECT
				== device_release_driver(struct device *dev);
					== device_release_driver_internal(dev, NULL, NULL);
						== __device_release_driver(dev, parent);
							== dev->bus->remove(dev);	// usb_bus_type的remove 没有定义
							== drv->remove(dev);		// 故走驱动的remove
								== usb_unbind_interface(struct device *dev);	//如果为接口设备
									== driver->disconnect(intf);
									== usbhid_disconnect(struct usb_interface *intf);
										== hid_destroy_device(struct hid_device *hdev);
											== device_del(&hdev->dev);	
								== usb_unbind_device(struct device *dev);	//如果为device设备	//new_udriver->drvwrap.driver.remove = usb_unbind_device;
									== udriver->disconnect(udev);		//if (udriver->disconnect)
									== usb_generic_driver_disconnect(udev);	//if (udriver->generic_subclass)			
// 	卸载 hid_device (即device_add 相关的device 都需要卸载)
== device_del(&hdev->dev);
	== bus_remove_device(struct device *dev);
		== device_release_driver(struct device *dev);
		== device_release_driver_internal(dev, NULL, NULL);
			== __device_release_driver(dev, parent);
				== dev->bus->remove(dev);		// 在hid_allocate_device()中 hdev->dev.bus = &hid_bus_type;
				== hid_device_remove(struct device *dev);
					== hid_hw_stop(struct hid_device *hdev);
						== hid_disconnect(struct hid_device *hdev);	

1.1.2 热拔插usb 设备

通过手动拔掉 usb 设备。

[ 232.893206] Kernel panic - not syncing: Object already free
[ 232.900455] CPU: 0 PID: 7 Comm: kworker/0:1 Tainted: G S B W 4.19.81+ #13
[ 232.908417] Hardware name: xxx. 
[ 232.914960] Workqueue: usb_hub_wq hub_event
[ 232.919271] Call trace:
[ 232.921804] dump_backtrace+0x0/0x260
[ 232.925578] show_stack+0x20/0x30
[ 232.929002] dump_stack+0xd8/0x12c
[ 232.932515] panic+0x158/0x2e0
[ 232.935669] slab_panic+0x24/0x28
[ 232.939092] slab_bug+0x0/0xe8
[ 232.942246] free_debug_processing+0x660/0x698
[ 232.946827] kfree+0x3dc/0x930
[ 232.949980] hid_free_buffers+0x94/0xd8
[ 232.953939] usbhid_stop+0x17c/0x1b0
[ 232.957629] hid_device_remove+0xa0/0xd0
[ 232.961673] device_release_driver_internal+0x1ac/0x260
[ 232.967057] device_release_driver+0x24/0x30
[ 232.971452] bus_remove_device+0xf0/0x140
[ 232.975581] device_del+0x294/0x4a0 			//device_del(&hdev->dev);    删除 hid_dev
[ 232.979174] hid_destroy_device+0x2c/0x68
[ 232.983303] usbhid_disconnect+0x60/0x90     	// driver->disconnect(intf);           intf 驱动
[ 232.987347] usb_unbind_interface+0xc8/0x278 	// new_driver->drvwrap.driver.remove = usb_unbind_interface;
[ 232.991743] device_release_driver_internal+0x1ac/0x260      // drv->remove(dev);
[ 232.997126] device_release_driver+0x24/0x30
[ 233.001521] bus_remove_device+0xf0/0x140
[ 233.005648] device_del+0x294/0x4a0  			//device_del(&udev->dev);     删除设备: usb 1-1: USB disconnect, device number 3
[ 233.009252] usb_disable_device+0x120/0x398   	// unregister 该device 含有的所有interface           for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++)
[ 233.013562] usb_disconnect+0xf8/0x2f0
[ 233.017433] hub_event+0xd84/0x1810
[ 233.021037] process_one_work+0x33c/0x6c8
[ 233.025166] worker_thread+0x330/0x4d0
[ 233.029036] kthread+0x128/0x138
[ 233.032362] ret_from_fork+0x10/0x1c

hub 检测到usb 设备拔插event 后,就会卸载操作。

== usb_disconnect(struct usb_device **pdev);
	== usb_disable_device(udev, 0);		//卸载device 的接口设备
		== device_del(&interface->dev);
			== bus_remove_device(struct device *dev);
				== device_release_driver(struct device *dev);
					== __device_release_driver(dev, parent);
						== dev->bus->remove(dev);	//if (dev->bus && dev->bus->remove)
						== drv->remove(dev);		//else if (drv->remove)
	== device_del(&udev->dev);

1.2 usb device connect

插入动作同样是 hub 检测,然后加载操作。

== device_add(struct device *dev);
	== kobject_add(&dev->kobj, dev->kobj.parent, NULL);
	== device_create_file(dev, &dev_attr_uevent);
	== device_create_file(dev, &dev_attr_dev);
	== bus_probe_device(dev);
		== device_initial_probe(struct device *dev);
			== __device_attach(dev, true);
				== __device_attach_driver(struct device_driver *drv, void *_data);
					== driver_match_device(struct device_driver *drv, struct device *dev)
						== return drv->bus->match ? drv->bus->match(dev, drv) : 1;	//new_udriver->drvwrap.driver.bus = &usb_bus_type;
							== usb_device_match(struct device *dev, struct device_driver *drv);
					== driver_probe_device(drv, dev);
						== really_probe(dev, drv);
							== if (dev->bus->probe) { ret = dev->bus->probe(dev);} 	//dev->dev.bus = &usb_bus_type;
								== usb_bus_type 没有定义probe
							== else if (drv->probe) {ret = drv->probe(dev);}	//new_udriver->drvwrap.driver.probe = usb_probe_device;
								== usb_probe_device(struct device *dev);
									== usb_generic_driver_probe(struct usb_device *udev);	//if (udriver->generic_subclass) 通用usb_device_driver 的probe
									== udriver->probe(udev);	//私有udriver 的probe

2. U -disk 设备拔插

2.1 plug in

hub 状态变化:

3-0:1.0: state 7 ports 1 chg 0002 evt 0000		//hub_event打印log

2.1.1 hub_resume

== usb_resume(struct device *dev, pm_message_t msg);
	== usb_resume_both(struct usb_device *udev, pm_message_t msg);
		== usb_resume_device(struct usb_device *udev, pm_message_t msg);
			== usb_generic_driver_resume(udev, msg);	//if (udriver->generic_subclass)
				== hcd_bus_resume(udev, msg);	//root hub: if (!udev->parent)
				== usb_port_resume(udev, msg);	//非root hub
		== usb_resume_interface(struct usb_device *udev, struct usb_interface *intf, pm_message_t msg, int reset_resume);
			== driver->resume(intf);
			== hub_resume(struct usb_interface *intf);
				== hub_activate(hub, HUB_RESUME);
					== set_bit(port1, hub->change_bits);
					== kick_hub_wq(hub);
						== queue_work(hub_wq, &hub->events);
						== hub_event(struct work_struct *work);
							== port_event(struct usb_hub *hub, int port1);

2.2 pull out

2.2.1 usb2.0 设备和otg

先断开U 盘设备:

== hub_event(struct work_struct *work);
	== port_event(struct usb_hub *hub, int port1);
		== hub_port_connect_change(hub, port1, portstatus, portchange);
			== hub_port_connect(hub, port1, portstatus, portchange);
				== usb_disconnect(struct usb_device **pdev);		

后响应otg 断开:

//mdwc 接收到事件,执行 dwc3_otg_sm_work,并调用dwc3 
== __dwc3_set_mode(struct work_struct *work);
	== dwc3_host_exit(struct dwc3 *dwc);
		== platform_device_unregister(dwc->xhci);
			== xhci_plat_remove(struct platform_device *dev);
				== usb_remove_hcd(struct usb_hcd *hcd);
					== usb_disconnect(&rhdev);		/* Sets rhdev to NULL */
						== hub_disconnect_children(struct usb_device *udev);
						== usb_disable_device(udev, 0);
							== device_del(&interface->dev);
								== hub_disconnect(struct usb_interface *intf);
									== hub_quiesce(hub, HUB_DISCONNECT);
										== usb_disconnect(&hub->ports[i]->child);	//不执行,前面已disconnect
						== device_del(&udev->dev);

2.2.2 usb3.0 设备和otg

(1)reset U 盘设备:

== hub_event(struct work_struct *work);
	== usb_lock_device(hdev);		//struct usb_device *hdev; 该设备被hub_event 占用
	== port_event(struct usb_hub *hub, int port1);
		== usb_lock_device(udev);	//struct usb_device *udev = port_dev->child;
		== usb_reset_device(udev);		//3.0 设备需要reset	Warns all drivers bound to registered interfaces (using their pre_reset method), performs the port reset, 
										//and then lets the drivers know that the reset is over (using their post_reset method).
			== usb_reset_and_verify_device(udev);
				== hub_port_init(parent_hub, udev, port1, i);
					== hub_port_reset(hub, port1, udev, delay, false);
				== hub_port_logical_disconnect(parent_hub, port1);
					== set_bit(port1, hub->change_bits);
					== kick_hub_wq(hub);
						== queue_work(hub_wq, &hub->events);
							== hub_event();		//再次进入hub_event
		== usb_unlock_device(udev);
	== usb_unlock_device(hdev);		

(2)由于usb_reset_device 会消耗部分时间,故期间会响应otg 断开:

//mdwc 接收到事件,执行 dwc3_otg_sm_work,并调用dwc3 
== __dwc3_set_mode(struct work_struct *work);
	== dwc3_host_exit(struct dwc3 *dwc);
		== platform_device_unregister(dwc->xhci);
			== xhci_plat_remove(struct platform_device *dev);
				== usb_remove_hcd(struct usb_hcd *hcd);
					== usb_disconnect(&rhdev);		/* Sets rhdev to NULL */
						== usb_set_device_state(udev, USB_STATE_NOTATTACHED);
						== usb_lock_device(udev);	//需要获取hdev 的锁,但是被hub_event 占用,故等待

(3)reset U盘之后再次hub_event:

== hub_event();		
	== 	hub_quiesce(hub, HUB_DISCONNECT);  	//usb_remove_hcd进程中设置了hdev->state == USB_STATE_NOTATTACHED
											/* If the hub has died, clean up after it */
		== usb_disconnect(&hub->ports[i]->child);		//Disconnect all the children
		== usb_kill_urb(hub->urb);	

(4)上面hub_event 完成后,会释放锁,usb_remove_hcd 得以继续执行。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
解话机锁:*2767*2878#/*2767*7377# - V6 f9 M# H, X1 N, r+ j  三星码片复位:*2767*3855# 也可用于解机锁或卡锁 " r% p. z9 b0 \" e. X( q   三星显温度、电池容量:*#0228# 2 x ]) ~$ A2 H Y/ J$ @5 e% g9 N   三星调显示屏对比度:*#0523# / O2 w3 X) c/ y) m! ^  三星软件版本:*#9999# 8 _2 n3 j; |: V0 j1 S' ?  三星A100-A188看版本:*#0837# $ [9 I* e2 `' Q9 T) j2 s6 F7 s# H; J  摩托罗拉T2688解所有锁:19980722 1 J& {! V1 N6 T- Y% J  T2688/2988/988d没有中文:*#0000# OK(卡) , {2 h% c3 Q3 A A  摩托罗拉所有机锁:按MENU+5+1/2 / g" M4 `3 ? x- a7 @   西门子恢复出厂设置:*#9999# ) m5 J. H* [/ G2 ~/ G t0 Z  西门子乱文回中文:*#0000#/*#0086# . Q) N- L+ V4 g/ X4 c   西门子软件版本:*#06# 左键 . i" ~, T' v9 ]8 s K# T   爱立信老机回英语:*#0000# : k& J( h$ U% ?" P/ ?: r+ Y1 S3 b4 m   爱立信新机回英语:按CLR-左键-0000-右键 6 H! t6 ~- V. W$ Z3 h   爱立信显出厂日期:右、*、左、左、*、左、*键 + [/ ~2 J! J! b  诺基亚显出厂日期:*#0000#(卡) / U6 |/ F2 F4 _) N2 ]$ x+ [6 g   诺基亚省30%电:*#746025625# . M; x: Q7 h, X  飞利浦强迫重连网:*#2562*# 0 O2 l+ N) H+ f6 t  飞利浦显示和更改手机密码:*#7489*# # H8 q% o. r- w) n$ U   博世(BOSCH)909S回中文:*#0852# 9 x! ?$ m: r+ J% G/ T9 q   博世(BOSCH)909s回英文:*#0851# 2 O& E2 E0 _7 o+ @$ i8 U& u% p1 e0 b  NEC显软件版本:*#2820# + i D6 C; l' B" ^* b. P c# N  NEC恢复原厂设置:*#73738# 4 h3 l) M* _8 u- d- M   波导s1000隐藏功能:*#*#1705# * e0 d8 W4 F1 F" T   波导s1000解锁:*#*#1705#46(也用于999D,720) / w% n2 h8 i) c( H, T  如死机再用---24681357(或直接就用它解) ) W8 P$ t" B/ A: l& \1 D   波导8xx/9xx系列:*#+串号7-14位# 9 R+ @/ c( x; g, m, f; K0 [9 Y   SIM卡 波导串号最后9位去掉最后一位 1 i! [2 g' ?, p* z: v' h  阿尔卡特OT221/220解锁:25228352/ALCATEL+D ~$ G# y0 e V, M; K1 \  阿尔卡特OT301/302解锁:83227423 9 g* X. ~8 l4 P+ b- U   阿尔卡特OT500/700解锁:25228352 4 A" Y6 T, p# g# G' k* V: s5 U1 ]' y   康佳:*#0001# *#1001# ##1001# 4 ~- ]' ^& p- g" t9 {  康佳小雪5219:#8879576# 原始:1234 3 T4 Z: p u9 P+ }8 I   GVC:*#1001* (海尔) w( f( B* ?2 ]; W   南方高科320开机键入##1001#,然后装上卡输入0000 OK r% y9 P" m* t' S) B4 t% V  三菱NET LOCK:*787090或*787292 6 j* u/ Y2 j5 d0 Y" @& s- J* |; ?  三菱IMSI LOCK:*362628或*360608 , S2 E) ^0 S/ \* [- F6 C  三菱NETSUB LOCK:*476989 0 _1 J# X5 x1 q4 B T. l. _1 _   三菱CP LOCK:*482896或*480896 ; `2 L! e" h0 I- U- c- k' m   三菱SP LOCK:*967678 % q9 @1 f& i Z6 ~   三菱EXT LOCK:*574243 - Q9 p* [7 V# k- h% w) `   # ^4 E Q8 ^- W; e5 w  飞利浦手机通用秘技 q* Q0 }% J2 R6 _   手机在待机状态下时,请输入以下按键组合: ! X9 x: P' O* w* ~6 L' _' t: B! S, V   *#06# 查看IME串码 : y9 W0 u8 d" c% {+ V- V   *#2254*#显示状况行 8 s! K3 U _9 F% ~( a _  *#2255*#开启或关闭(DEBUG CALL)模式 - g3 p' }5 c8 b# V' y) C/ t   *#2558*#显示通话时间 ' o' Y: m9 H2 O5 |8 U& [3 X  *#2562*#强迫重新连接网络系统 , h/ U6 d- u$ _& u: Z  *#7489*#显示和更改手机密码 / x `& ~* H) f% }   *#7378*#显示一些SIM卡信息,例如相位(phaselevel) $ `3 w" _6 o5 m# _$ o   *#3377*#读取SIM卡信息,初始化和标示 4 B! k. f" C3 f/ u+ V' p3 f& F   *#7693*#开启或关闭睡眠模式 3 z5 W: t! f. y! E* Q6 W2 B$ M, z   *#8463*#读取睡眠模式信息 ! C3 h, }5 r$ e+ }   *#337*# EFR模式开/关 ) T V% T# Y J1 g" g   *#4764*#单频/双频设置(切换单频GSM900) # z3 }3 K1 s; i \   *#4765*#单频/双频设置(切换单频GSM1800) & q$ M8 f' T! m" M) ?5 b  *#4762*#单频/双频设置(切换成双频模式) 1 ~& {! i$ l* N$ i" l! Q9 N    0 v# ?4 i+ F, Z: o9 |$ X  阿尔卡特(ALCATEL)测试键 , w( \+ ?2 x9 j* \8 q; [   在待机状态下,输入"000000*"可监测网络状况,包括信号强度和使用中的频道等。 ; B" C' M' \- ?; b/ t   ; N" f! g: q' G. X1 r# {   NEC DB2000手机秘技 在待机时输入以下按键: 5 N9 V$ w, E2 S( U# @; v  "*#2820#",再按通话键,可显示手机的软件版本。 8 Y/ G' V- J0 K# N5 `5 \6 h  "*73738#",再按通话键,可将回到手机出厂状态。 # R% D! t; T5 {5 n   3 z, O8 X; d: z4 K- r% x* R) Q J   三星早期版本的手机,可以输入以下的指令各种进入测试状态: / V6 S8 U [# I, U J7 P    按键代码   测试功能/名称 9 [8 W- r2 E; m2 r- K* x8 Y3 l     *#9999# 显示手机软件版本号 : t o2 m0 |+ [! l     *2767*2878# 话机当前设定复位(手机解锁) 7 v2 T- X0 D, Q6 d     *2767*3855# 话机EEPROM总复位(修复软件故障) 0 }7 W {) A9 j' B4 t* Y! r+ h    *#9998*228# 电池参数读取 ) r. K# a0 n0 R8 z& b     *#9998*289# 振铃信号频率测试 5 {4 L: u# j+ j c6 ?7 s5 O2 J- z    *#9998*246# 程序参数显示 ( b! k9 B# ]0 p+ v5 p- b# d6 c     *#9998*364# WATCHDOG信号测试 0 |% d1 {4 [/ \+ [    *#9998*377# EEPROM错误显示 " q$ G$ w7 t2 m. _     *#9998*427# WATCHDOG信号路径设置 8 ^/ ^/ Z) t5 \. }$ h    *9998*523# 液晶显示对比度调整 ( _2 [) u* {: r& E3 _4 h; B; s' H    *9998*636# 存贮状态显示 : v2 G7 t# C. a% A    *9998*786# 当前日期、时间读取 6 t( e+ ]2 B( Q: S( ~. Z    *9998*842# 振子振动测试 : W. R/ T5 |7 Z: `0 K L' w G4 r0 H    *9998*947# 在重大错误下复位设置 8 x! d3 N/ ^- k' d8 |/ F( }4 M- Q     *9998*9266# 显示收信通道号及收信强度 & x/ F- A Z. p j5 z- C7 h   三星新版手机(从三星600新版开始)所支持的测试指令减少了很多,基本上就只余下以下几个可以成功的: 1 E! Y5 k+ C, `. m    *2767*2878#(EEPROM复位) / W, g' u- K( N% t     *2767*3855#(EEPROM总复位,IMEI有可能会变成初始码) 4 j( y8 ?& Z8 q     *#9999#(查版本) 4 N* Z0 |' p; F: {     *#0523#(调LCD对比度) : ], C8 y9 `# F0 \! K. t ?! O1 N     *2767*7377# (解手机密码的复位指令) 5 Y% Y$ `- E" e1 P     尤其是*#0523#的输入,有些型号的手机要卡,有些不用。另外,如出现一次输入成功,而再输入失败的情况,是由于手机软件上的记忆效应,你可以将手机的电池卸下重装上再试输入(例如:*2767*3855# 指令输入后,有时不重装电池,手机是不能开机的)。 : D/ r; H" J/ c6 Y( D- k/ [   三星SGH-N288手机测试指令 ) P! L Q3 A: o9 L7 t   *#0001# 显示RS232串行通信参数 % B, z9 i1 v2 |' X. ]9 d3 f; }  *#0228# 显示电池容量、电压和温度 * _2 J! L5 j& z+ E+ d4 B9 U   *#0246# 程序参数显示 2 K: N; T5 E' ~9 X! V. `% C& v   *#0324# 网络检测(工程模式) 4 e: Q# j- ~/ Y4 ~* z& d   *#0364# 显示Watchdog状态,可以修改 0 u7 [# E9 P# i: i2 y  *#0377# EEPROM错误显示 % p" P$ S* O9 O5 j5 j% A  *#0427# WATCHDOG信号路径设置 . [' D: f) g' R; x, }* q  *#0523# 调节对比度,谨慎修改; ) o- ~* L2 O6 B+ ]) S$ y# i  *#0636# 存储器容量显示 ! f2 {# N/ o4 g" h  *#0746# SIM卡文件规格测试 % l- y5 O8 q* ?: t) c+ [  *#0778# SIM卡信息 1 Y% A! Y7 G) t V8 k2 I   *#0786# 显示内容为本次开机的时间及本次开机后到当前的时间长。按->后显示最新的本次开机后到当前的时间长;再按->后显示上一次的开机时间;再按->后显示上一次的关机时间以及上次开关机的时长。 6 y0 K0 }5 q$ b0 Y+ o; e9 L/ k  *#0837# 显示详细的软件版本 8 S$ b) e2 I2 N6 h- x$ u   *#0842# 振动测试 - J" ?3 `- ]# {% y   *#0947# 在重大错误情况下复位设置指令 ( W( T7 n2 S3 Y% B4 C/ {) @7 a, I   *#9999# 显示软件版本 $ C. j4 h9 T9 m  *2767*2878# EEPROM复位,手机设定总清除,可用于解锁 # ^7 U: P4 k7 O6 s' J  *2767*3855# 从字库中取出程序重置EEPROM为出厂值。对修改过IMEI码的手机,用此指令可恢复原出厂机身号码。此指令还用于因EEPROM(码片)内程序紊乱造成的各种故障。 ! `! |/ ?( ^0 a3 R    5 |5 r( ]( \7 T- ~- N   西门子中文机秘籍大公开 / }5 k3 E- S1 N+ s  输入[*#06#],可看IMEI(International Mobile Equipment Identity)码。 0 ], o: M& N6 Y: \) b4 A  输入[*#06#]+[左软键],可看软件版本号。 以上不需入SIM卡也可操作。 8 a, ^$ d' @& E: {   输入[*#0000#]+[发射键],改成预设语言显示(英语?)。 ) {- u2 M8 z; a- C8 L9 B  输入[*#0001#]+[发射键],改成英文显示。 % X8 ^ _( f4 p  输入[*#0086#]+[发射键],改成简体中文显示。 : X' @$ M3 J! r( W: a9 @  输入[*#0886#]+[发射键],改成繁体中文显示。 3 z; W: a/ k, {2 p: `1 M9 W   快速键 : p! z5 O1 s: B4 `  长按[*],开启或关闭铃声。 ( I6 f f- l" C0 Z7 |+ e' b  长按[#],开启或关闭键盘锁。 ( E2 M2 n% A% ^: u/ _   长按[左侧上键],开启情景模式设置。 , p6 i2 R! J) N9 x  长按[左侧下键],开启语拨号。 4 A, `0 ~4 v! l. ~/ s/ B   短按[右侧录音键],播放已录下的音,可在任何时候播放,包括通话期间,通话双方都听到。 - l) P; @( |) `0 O: v, C8 h1 X- S2 V  长按[右侧录音键],开始录音,直到放开,或20秒已到。 & @' k4 ^5 Q0 D5 w0 _   当使用键盘锁時,可长按[挂断键]來暂时开启夜光照明。 1 l/ @8 K* X k# w% R% O4 a  连按两下[电话簿]可进入VIP电话簿。 6 M0 O) `2 T0 x7 ]2 E   [1]+[发射键]可进入语音信箱(需在[菜单→短消息→语音信箱]设置语音信箱服务号码)。 - C# g+ M9 i7 t( Q& x   [0]+[左软键]可切換1号2号线路(好象大部分地区不支持,包括珠海)。 6 ~( c3 c3 l5 z4 o   [数字键]+[#]可显示出儲存在SIM卡该位置的电话簿名称(前提是至少在SIM卡储存一个电话)。 " M0 A( B/ `8 w+ L* V   长按[0]会出现+字,并可用左软键来选择国家长话代码(位置依英文名称排列)。 ) w* g( Y1 k7 W+ z7 K5 }  快捷键设定 :[数字键]→[左软键]→[右软键](变更)此時会出現选项,选择即可(若是选择电话号码,则进入电话簿可选择要快速发射的电话名称) ; G6 N9 T' G9 s+ p# H2 K8 X8 o   使用 [数字键]→[发射键]即可。 ' R. p! X) Z H" H$ O, r* u# d   西门子手机锁机解锁方法 5 d7 y5 M3 w2 x5 x( m   请需要解锁的网友,将解锁码在开机状态下<SIM卡无所谓>直接输入手机,然后等候自动解锁,时间约1秒至60分钟不等 * z# v- Z( s. D( v% f    / p. h$ b( r( {$ K0 m  ★ 如何解除摩托罗拉手机的PIN密码 / K/ m. ], l' J     当你的设置的PIN不小心遗忘了,或别人在你的手机上设置了PIN等,这时PUK就帮了大忙了。在输错三次的PIN后则手机上会显示SIM卡已锁,这时你必须要通过PUK来解锁了。PUK为8位数字的码一般在大卡的背面,如果找不到的话要尽快到当地的客服中心查询,切不可乱输,因为PUK只有10次输错的机会,输错10次则SIM卡报销。摩托罗拉手机一般在输入PUK之前都必须先输入**05*再输PUK,格式如下:**05*PUK即可。 0 X% G) ~# z/ A& d* S7 N: }  ★ 摩托罗拉手机的主清除与主复位 6 V( a0 }7 l' x9 a     无论你的摩托罗拉手机上做了任何的设置,造成了如:不能正常拔出,来电显示乱码,或无法删除电话本,等等,您都可以用以下方法复原。 ! B. \5 J' Z0 ^9 U; s     MENU键+5+1(2)屏幕则会显示"主清除或主复位"如选择主清除将会执行以下操作: - m) d, l5 _4 C" W# @1 p1 U     1、从话机记忆中清除电话本项目。 " N) j; r. S4 U; R8 N2 r    2、清除最后呼出号码及最后呼入号码。 ( }' A% v3 C' c* T$ R1 C/ t     3、可清零计时表。 " L( A4 n8 S3 e& I: [. W! ]   3 I: ~* g' u+ p    但不能清除的功能有:固定号码表、本机号码表、计费表、收到和传出的短消息。 " Q. m' Y1 v3 U- ?( L- p) S" N     选择主复位,将执行以下: 5 z( z* u; O' W! E. s- y! d. \& ?     1、返回最初的语言选择。 ( S) Z* j7 M0 X. \    2、铃音恢复标准音量复为中,网络查找频度恢复为中,取消自动应答,声音提示计,时通话中显示计费,节电,自动免提,自动加锁,小区广播及通话传真方式。 ! B+ i/ F/ C" s! @! a- O   ★ 摩托罗拉 T2688 键盘解锁 / Z$ U1 Z6 } `% b    T2688有通过键盘解锁的功能,只要输入:19980722 即可,不过它只支持当前的卡解琐,无法实现手机的全复位。 5 R& B- m8 c6 z; S2 A  ★ MOTOROLA GSM手机的测试指令 2 X: Z" Y7 q' @: D1 r     测试状态的进入: , w0 e/ Q/ J2 v' K8 i& ]    入测试SIM卡后打开手机电源,当内部自动"叫醒"功能顺利完成后,按"#"键三秒钟。 # G$ I% J/ k& I( q; Z8 H     三秒钟后手机显示"TEST",表明手机已进入测试状态, 3 s; X# V' N# v6 |/ v1 C    测试指令如下: : f# M# t' t! u* C4 b5 J/ r/ X   01#:退出测试状态 # E+ R! z u/ h3 h6 I& i  02xxyy:显示/改变Tx功率电平DAC与装入PA校准表,类似于ETACS 72#指令 + ?$ m# H0 l) U   07#:关闭Rx Audio通道 ; g5 U8 Z: F- q! ]2 X! O  08#:打开Rx Audio通道 $ b' t( t0 A( N* e" ^& Y- T0 s  09#:关闭Tx Audio通道 : H; X+ F& S$ U, H   10#:打开Tx Audio通道 # v1 p( T" ]" z* }; ]* ?  11ABC#:设置信道 ABC=000~124 0 X% \- O& X" ?& D  12AB#:设置功率级电平 AB=00~15 * e' J6 ?* H6 n7 H  19#:显示呼叫处理器软件版本 2 f" ^. [4 P" c( ]  20#:显示调制解调器软件版本 : a1 l' P5 u) I k   22#:显示语音编解码器软件版本 % I6 t2 Z, Q# G% `( B, k: B8 X! X  82#:看U801的版本号 5 M8 a9 ?5 B+ E4 T   24A#:设置AGC步进 A=0 or 1 0 t+ j+ q. n& R2 q& z   25ABC#:将连续的AGC置为ABC,ABC=0~255 9 F' ~5 x# O l) O# e3 i. D   26ABCD#:将连续的AFC置为ABCD,ABCD=0~4095 1 b& |( F9 w5 L   31A#:设定时隙为A,A=0~7 2 ~0 l: n, x' f3 l. K+ i# a   33ABC#:单步捕捉ABC信道 9 a2 F9 ]( L' ?   36#:打开音频环路 # k% G% f! i, f' e. s  37#:中止测试 ( A# O9 y' y& y$ {' v/ {4 G  38#:激活SIM卡 6 x) q% d2 t0 b- s9 u   39#:使SIM卡失效 . q- g4 X# ?1 s; Z  40#:发射全"1"信息 - s3 c) [% ~7 ?6 Z   41#:发射全"0"信息 + m" @1 v, S, l J2 L   43A#:改变Audio通道至A ' h. K; e: w) Z: t [0 e( w   45ABC#:读取信道ABC上的信号强度,ABC=0~124 : V4 h' Z- ?! N0 J% Z" ]5 w  46#:显示当前AFC DAC的值 ' u" C; |' b: Z( c/ R   47A#:设置音量A=0~7 : d% f t+ ^% o1 r  490#:读锂电池信息 $ o; B7 q- l2 {8 W* {+ z; U; u% @  57#:清除保留内存,相当于ETACS的32#指令 8 _1 N' o( I" _, c( \  58ABCDEF#:设置保密码为ABCDEF X1 ]0 w9 \7 S" L4 F   59ABCD#:显示/改变解锁码 1 K- H3 K% a8 O- `' p  60#:显示IMEI(国际移动设备识别码) 4 F7 E% A- ~5 h- ^: {0 y   65#:显示IMSI 9 o: w& l4 X# }9 u  [hide]隐藏内容 Abc2 O" E& i9 c* y& n: H' d* K' y 8 ~! W. L E& s- A 7100#:手机自检,03、04为Modem IC错误,05、06为SpeechCode IC错误,07为软件错误必需转移卡,08为手机正常,00、01为CPU错误。 ' _* x4 F7 Y2 q2 [5 M) Y( |   9 c/ A- v1 a- G$ j3 o   飞利浦手机秘籍 . 8 x1 K8 i9 r5 V, |  ◆显示IMEI号:*#06# : M, t4 I' j; T) g  ◆显示状态行 *#2254*#: C, BS, RR, MMI, CREAT. 5 V5 x) @4 U9 _0 a   ◆激活或关闭调试呼叫(DEBUG CALL)模式 *#2255*# ) z7 X0 i# {9 w) U   ◆显示总通话时间 *#2558*# 7 y) \5 C( l Q  ◆强迫重新接入网络 *#2562*# 7 n0 Z3 S$ t i* }; E   ◆显示和更改手机的保密码 *#7489*# 4 T( I' b0 R) s3 a8 n, F  ◆显示一些SIM卡信息,例如相位等级(phase level)*#7378*# ; U" F% \- K7 J$ I q7 q1 I  ◆获取SIM卡锁信息,初始化和标志 *#3377*# $ s+ Y# L4 T' ]- E  ◆激活和关闭睡眠模式 *#7693*#   ◆获取睡眠模式信息 *#8463*#

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值