Отсылка hello повторный hello возвратил ошибку

Recommend Projects

  • React photo

    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo

    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo

    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo

    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo

    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo

    Laravel

    A PHP framework for web artisans

  • D3 photo

    D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Visualization

    Some thing interesting about visualization, use data art

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo

    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo

    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo

    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo

    Alibaba

    Alibaba Open Source for everyone

  • D3 photo

    D3

    Data-Driven Documents codes.

  • Tencent photo

    Tencent

    China tencent open source team.

  1. msi_g ~ # zcat /proc/config.gz | grep USB_SERIAL

  2. CONFIG_USB_SERIAL=y

  3. # CONFIG_USB_SERIAL_CONSOLE is not set

  4. CONFIG_USB_SERIAL_GENERIC=y

  5. # CONFIG_USB_SERIAL_SIMPLE is not set

  6. # CONFIG_USB_SERIAL_AIRCABLE is not set

  7. # CONFIG_USB_SERIAL_ARK3116 is not set

  8. # CONFIG_USB_SERIAL_BELKIN is not set

  9. # CONFIG_USB_SERIAL_CH341 is not set

  10. # CONFIG_USB_SERIAL_WHITEHEAT is not set

  11. # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set

  12. # CONFIG_USB_SERIAL_CP210X is not set

  13. # CONFIG_USB_SERIAL_CYPRESS_M8 is not set

  14. # CONFIG_USB_SERIAL_EMPEG is not set

  15. # CONFIG_USB_SERIAL_FTDI_SIO is not set

  16. # CONFIG_USB_SERIAL_VISOR is not set

  17. # CONFIG_USB_SERIAL_IPAQ is not set

  18. # CONFIG_USB_SERIAL_IR is not set

  19. # CONFIG_USB_SERIAL_EDGEPORT is not set

  20. # CONFIG_USB_SERIAL_EDGEPORT_TI is not set

  21. # CONFIG_USB_SERIAL_F81232 is not set

  22. # CONFIG_USB_SERIAL_GARMIN is not set

  23. # CONFIG_USB_SERIAL_IPW is not set

  24. # CONFIG_USB_SERIAL_IUU is not set

  25. # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set

  26. # CONFIG_USB_SERIAL_KEYSPAN is not set

  27. # CONFIG_USB_SERIAL_KLSI is not set

  28. # CONFIG_USB_SERIAL_KOBIL_SCT is not set

  29. # CONFIG_USB_SERIAL_MCT_U232 is not set

  30. # CONFIG_USB_SERIAL_METRO is not set

  31. # CONFIG_USB_SERIAL_MOS7720 is not set

  32. # CONFIG_USB_SERIAL_MOS7840 is not set

  33. # CONFIG_USB_SERIAL_MXUPORT is not set

  34. # CONFIG_USB_SERIAL_NAVMAN is not set

  35. # CONFIG_USB_SERIAL_PL2303 is not set

  36. # CONFIG_USB_SERIAL_OTI6858 is not set

  37. # CONFIG_USB_SERIAL_QCAUX is not set

  38. CONFIG_USB_SERIAL_QUALCOMM=y

  39. # CONFIG_USB_SERIAL_SPCP8X5 is not set

  40. # CONFIG_USB_SERIAL_SAFE is not set

  41. # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set

  42. # CONFIG_USB_SERIAL_SYMBOL is not set

  43. # CONFIG_USB_SERIAL_TI is not set

  44. # CONFIG_USB_SERIAL_CYBERJACK is not set

  45. # CONFIG_USB_SERIAL_XIRCOM is not set

  46. CONFIG_USB_SERIAL_WWAN=y

  47. # CONFIG_USB_SERIAL_OPTION is not set

  48. # CONFIG_USB_SERIAL_OMNINET is not set

  49. # CONFIG_USB_SERIAL_OPTICON is not set

  50. # CONFIG_USB_SERIAL_XSENS_MT is not set

  51. # CONFIG_USB_SERIAL_WISHBONE is not set

  52. # CONFIG_USB_SERIAL_SSU100 is not set

  53. # CONFIG_USB_SERIAL_QT2 is not set

  54. # CONFIG_USB_SERIAL_DEBUG is not set

  55. msi_g ~ # dmesg | tail

  56. [  361.094768] scsi host6: usbstorage 11.2:1.0

  57. [  366.883196] usb 11.2: USB disconnect, device number 4

  58. [  367.120551] usb 11.2: new highspeed USB device number 5 using ehcipci

  59. [  367.247851] usb 11.2: New USB device found, idVendor=19d2, idProduct=1403

  60. [  367.247854] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  61. [  367.247856] usb 11.2: Product: ZTE Technologies MSM

  62. [  367.247857] usb 11.2: Manufacturer: ZTE,Incorporated

  63. [  367.247858] usb 11.2: SerialNumber: P680A1ZTED000000

  64. [  367.251897] usbstorage 11.2:1.2: USB Mass Storage device detected

  65. [  367.252130] scsi host7: usbstorage 11.2:1.2

  66. msi_g ~ # dmesg | tail

  67. [  367.252130] scsi host7: usbstorage 11.2:1.2

  68. [  367.802176] usbcore: registered new interface driver cdc_ether

  69. [  367.819104] rndis_host 11.2:1.0 usb0: register ‘rndis_host’ at usb0000:00:1a.01.2, RNDIS device, 36:4b:50:b7:ef:da

  70. [  367.819134] usbcore: registered new interface driver rndis_host

  71. [  367.822048] usbcore: registered new interface driver rndis_wlan

  72. [  367.823031] rndis_host 11.2:1.0 enp0s26u1u2: renamed from usb0

  73. [  368.254097] scsi 7:0:0:0: CDROM            CWID     USB SCSI CDROM  2.31 PQ: 0 ANSI: 2

  74. [  368.257145] sr 7:0:0:0: [sr1] scsi1 drive

  75. [  368.257289] sr 7:0:0:0: Attached scsi CDROM sr1

  76. [  368.257364] sr 7:0:0:0: Attached scsi generic sg3 type 5

  77. msi_g ~ # dmesg | tail

  78. [  367.252130] scsi host7: usbstorage 11.2:1.2

  79. [  367.802176] usbcore: registered new interface driver cdc_ether

  80. [  367.819104] rndis_host 11.2:1.0 usb0: register ‘rndis_host’ at usb0000:00:1a.01.2, RNDIS device, 36:4b:50:b7:ef:da

  81. [  367.819134] usbcore: registered new interface driver rndis_host

  82. [  367.822048] usbcore: registered new interface driver rndis_wlan

  83. [  367.823031] rndis_host 11.2:1.0 enp0s26u1u2: renamed from usb0

  84. [  368.254097] scsi 7:0:0:0: CDROM            CWID     USB SCSI CDROM  2.31 PQ: 0 ANSI: 2

  85. [  368.257145] sr 7:0:0:0: [sr1] scsi1 drive

  86. [  368.257289] sr 7:0:0:0: Attached scsi CDROM sr1

  87. [  368.257364] sr 7:0:0:0: Attached scsi generic sg3 type 5

  88. msi_g ~ # dmesg | tail

  89. [  367.252130] scsi host7: usbstorage 11.2:1.2

  90. [  367.802176] usbcore: registered new interface driver cdc_ether

  91. [  367.819104] rndis_host 11.2:1.0 usb0: register ‘rndis_host’ at usb0000:00:1a.01.2, RNDIS device, 36:4b:50:b7:ef:da

  92. [  367.819134] usbcore: registered new interface driver rndis_host

  93. [  367.822048] usbcore: registered new interface driver rndis_wlan

  94. [  367.823031] rndis_host 11.2:1.0 enp0s26u1u2: renamed from usb0

  95. [  368.254097] scsi 7:0:0:0: CDROM            CWID     USB SCSI CDROM  2.31 PQ: 0 ANSI: 2

  96. [  368.257145] sr 7:0:0:0: [sr1] scsi1 drive

  97. [  368.257289] sr 7:0:0:0: Attached scsi CDROM sr1

  98. [  368.257364] sr 7:0:0:0: Attached scsi generic sg3 type 5

  99. msi_g ~ # dmesg | tail

  100. [  368.257145] sr 7:0:0:0: [sr1] scsi1 drive

  101. [  368.257289] sr 7:0:0:0: Attached scsi CDROM sr1

  102. [  368.257364] sr 7:0:0:0: Attached scsi generic sg3 type 5

  103. [  440.179577] usb 11.2: USB disconnect, device number 5

  104. [  440.181577] rndis_host 11.2:1.0 enp0s26u1u2: unregister ‘rndis_host’ usb0000:00:1a.01.2, RNDIS device

  105. [  440.491680] usb 11.2: new highspeed USB device number 6 using ehcipci

  106. [  440.619892] usb 11.2: New USB device found, idVendor=19d2, idProduct=0016

  107. [  440.619895] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  108. [  440.619897] usb 11.2: Product: ZTE Technologies MSM

  109. [  440.619898] usb 11.2: Manufacturer: ZTE,Incorporated

  110. msi_g ~ # ls /dev/tty*

  111. /dev/tty    /dev/tty12  /dev/tty17  /dev/tty21  /dev/tty26  /dev/tty30  /dev/tty35  /dev/tty4   /dev/tty44  /dev/tty49  /dev/tty53  /dev/tty58  /dev/tty62  /dev/ttyS0

  112. /dev/tty0   /dev/tty13  /dev/tty18  /dev/tty22  /dev/tty27  /dev/tty31  /dev/tty36  /dev/tty40  /dev/tty45  /dev/tty5   /dev/tty54  /dev/tty59  /dev/tty63  /dev/ttyS1

  113. /dev/tty1   /dev/tty14  /dev/tty19  /dev/tty23  /dev/tty28  /dev/tty32  /dev/tty37  /dev/tty41  /dev/tty46  /dev/tty50  /dev/tty55  /dev/tty6   /dev/tty7   /dev/ttyS2

  114. /dev/tty10  /dev/tty15  /dev/tty2   /dev/tty24  /dev/tty29  /dev/tty33  /dev/tty38  /dev/tty42  /dev/tty47  /dev/tty51  /dev/tty56  /dev/tty60  /dev/tty8   /dev/ttyS3

  115. /dev/tty11  /dev/tty16  /dev/tty20  /dev/tty25  /dev/tty3   /dev/tty34  /dev/tty39  /dev/tty43  /dev/tty48  /dev/tty52  /dev/tty57  /dev/tty61  /dev/tty9

  116. msi_g ~ # lsusb

  117. Bus 002 Device 002: ID 8087:8000 Intel Corp.

  118. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  119. Bus 001 Device 003: ID 13d3:3410 IMC Networks

  120. Bus 001 Device 006: ID 19d2:0016 ZTE WCDMA Technologies MSM

  121. Bus 001 Device 002: ID 8087:8008 Intel Corp.

  122. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  123. Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

  124. Bus 003 Device 002: ID 045e:07b2 Microsoft Corp.

  125. Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  126. msi_g ~ # echo 19d2 0016 >/sys/bus/usbserial/drivers/generic/new_id

  127. msi_g ~ # dmesg | tail

  128. [  586.370531] usbserial_generic 11.2:1.0: generic converter detected

  129. [  586.370631] usb 11.2: generic converter now attached to ttyUSB0

  130. [  586.370715] usbserial_generic 11.2:1.1: The «generic» usbserial driver is only for testing and oneoff prototypes.

  131. [  586.370718] usbserial_generic 11.2:1.1: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  132. [  586.370720] usbserial_generic 11.2:1.1: generic converter detected

  133. [  586.370807] usb 11.2: generic converter now attached to ttyUSB1

  134. [  586.370885] usbserial_generic 11.2:1.2: The «generic» usbserial driver is only for testing and oneoff prototypes.

  135. [  586.370887] usbserial_generic 11.2:1.2: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  136. [  586.370889] usbserial_generic 11.2:1.2: generic converter detected

  137. [  586.370949] usb 11.2: generic converter now attached to ttyUSB2

  138. msi_g ~ # cd /home/john/Documents/3g_megafon/qtools/

  139. msi_g qtools # ls

  140. ZTEDrvSetup.zip  ZTE_MF_drv  ZTE_MF_drv.zip  qtools  qtools_win

  141. msi_g qtools # cd qtools

  142. msi_g qtools # ls

  143. LICENSE       chipset.cfg  getopt.c      include.h   memio.c       nv         qblinfo.o  qcommand.c  qefs      qident.o  qrflash.c  qterminal    qwdirect.o  sahara.c

  144. Makefile      dl8200.sh    getopt.h      ioasm.sh    memio.o       printf.h   qcio.c     qcommand.o  qefs.c    qnvram    qrflash.o  qterminal.c  qwflash     sahara.o

  145. README.md     dload.sh     hdlc.c        iormem.asm  mibibsplit    ptable     qcio.h     qdload      qefs.o    qnvram.c  qrmem      qterminal.o  qwflash.c   winbuild

  146. chipconfig.c  doc          hdlc.o        iowmem.asm  mibibsplit.c  qblinfo    qcio.o     qdload.c    qident    qnvram.o  qrmem.c    qwdirect     qwflash.o

  147. chipconfig.o  dummy.asm    identify.asm  loaders     mibibsplit.o  qblinfo.c  qcommand   qdload.o    qident.c  qrflash   qrmem.o    qwdirect.c   restart.sh

  148. msi_g qtools # ./qcommand e c «c 3a»

  149. —- ответ

  150. 00000000: 3a a1 6e 7e                                      *:.n~            *

  151. msi_g qtools # dmesg | tail

  152. [  705.028459] usbserial_generic 11.2:1.0: generic converter detected

  153. [  705.028562] usb 11.2: generic converter now attached to ttyUSB0

  154. [  705.028618] usbserial_generic 11.2:1.1: The «generic» usbserial driver is only for testing and oneoff prototypes.

  155. [  705.028619] usbserial_generic 11.2:1.1: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  156. [  705.028620] usbserial_generic 11.2:1.1: generic converter detected

  157. [  705.028706] usb 11.2: generic converter now attached to ttyUSB1

  158. [  705.028776] usbserial_generic 11.2:1.2: The «generic» usbserial driver is only for testing and oneoff prototypes.

  159. [  705.028777] usbserial_generic 11.2:1.2: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  160. [  705.028778] usbserial_generic 11.2:1.2: generic converter detected

  161. [  705.028857] usb 11.2: generic converter now attached to ttyUSB2

  162. msi_g qtools # dmesg | tail

  163. [  705.028459] usbserial_generic 11.2:1.0: generic converter detected

  164. [  705.028562] usb 11.2: generic converter now attached to ttyUSB0

  165. [  705.028618] usbserial_generic 11.2:1.1: The «generic» usbserial driver is only for testing and oneoff prototypes.

  166. [  705.028619] usbserial_generic 11.2:1.1: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  167. [  705.028620] usbserial_generic 11.2:1.1: generic converter detected

  168. [  705.028706] usb 11.2: generic converter now attached to ttyUSB1

  169. [  705.028776] usbserial_generic 11.2:1.2: The «generic» usbserial driver is only for testing and oneoff prototypes.

  170. [  705.028777] usbserial_generic 11.2:1.2: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  171. [  705.028778] usbserial_generic 11.2:1.2: generic converter detected

  172. [  705.028857] usb 11.2: generic converter now attached to ttyUSB2

  173. msi_g qtools # ./qdload s

  174.  Ожидаем пакет Hello от устройства…

  175.  Пакет Hello от устройства не получен

  176. msi_g qtools # dmesg | tail

  177. [  705.028459] usbserial_generic 11.2:1.0: generic converter detected

  178. [  705.028562] usb 11.2: generic converter now attached to ttyUSB0

  179. [  705.028618] usbserial_generic 11.2:1.1: The «generic» usbserial driver is only for testing and oneoff prototypes.

  180. [  705.028619] usbserial_generic 11.2:1.1: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  181. [  705.028620] usbserial_generic 11.2:1.1: generic converter detected

  182. [  705.028706] usb 11.2: generic converter now attached to ttyUSB1

  183. [  705.028776] usbserial_generic 11.2:1.2: The «generic» usbserial driver is only for testing and oneoff prototypes.

  184. [  705.028777] usbserial_generic 11.2:1.2: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  185. [  705.028778] usbserial_generic 11.2:1.2: generic converter detected

  186. [  705.028857] usb 11.2: generic converter now attached to ttyUSB2

  187. msi_g qtools # ./qcommand e c «c 3a»

  188. —- ответ

  189. 00000000: 3a a1 6e 7e                                      *:.n~            *

  190. msi_g qtools # dmesg | tail          

  191. [  793.848809] usbserial_generic 11.2:1.0: device disconnected

  192. [  793.848933] generic ttyUSB1: generic converter now disconnected from ttyUSB1

  193. [  793.848944] usbserial_generic 11.2:1.1: device disconnected

  194. [  793.849065] generic ttyUSB2: generic converter now disconnected from ttyUSB2

  195. [  793.849077] usbserial_generic 11.2:1.2: device disconnected

  196. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  197. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  198. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  199. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  200. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  201. msi_g qtools # lsusb

  202. Bus 002 Device 002: ID 8087:8000 Intel Corp.

  203. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  204. Bus 001 Device 003: ID 13d3:3410 IMC Networks

  205. Bus 001 Device 009: ID 19d2:0076 ZTE WCDMA Technologies MSM

  206. Bus 001 Device 002: ID 8087:8008 Intel Corp.

  207. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  208. Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

  209. Bus 003 Device 002: ID 045e:07b2 Microsoft Corp.

  210. Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  211. msi_g qtools # echo 19d2 0076 >/sys/bus/usbserial/drivers/generic/new_id

  212. msi_g qtools # lsusb

  213. Bus 002 Device 002: ID 8087:8000 Intel Corp.

  214. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  215. Bus 001 Device 003: ID 13d3:3410 IMC Networks

  216. Bus 001 Device 009: ID 19d2:0076 ZTE WCDMA Technologies MSM

  217. Bus 001 Device 002: ID 8087:8008 Intel Corp.

  218. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  219. Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

  220. Bus 003 Device 002: ID 045e:07b2 Microsoft Corp.

  221. Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

  222. msi_g qtools # dmesg | tail          

  223. [  793.849077] usbserial_generic 11.2:1.2: device disconnected

  224. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  225. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  226. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  227. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  228. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  229. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  230. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  231. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  232. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  233. msi_g qtools # dmesg | tail

  234. [  793.849077] usbserial_generic 11.2:1.2: device disconnected

  235. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  236. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  237. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  238. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  239. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  240. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  241. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  242. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  243. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  244. msi_g qtools # ./qdload s            

  245.  Ожидаем пакет Hello от устройства…

  246.  Идентификатор образа для загрузки: 00000007

  247.  Загружаем loaders/

  248.  Передаём загрузчик в устройство…

  249.  Ошибка передачи загрузчика

  250. msi_g qtools # ./qcommand e c «c 3a»

  251. —- ответ

  252. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  253. msi_g qtools # ./qdload s            

  254.  Ожидаем пакет Hello от устройства…

  255.  Пакет Hello от устройства не получен

  256. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  257. msi_g qtools # dmesg | tail          

  258. [  793.849077] usbserial_generic 11.2:1.2: device disconnected

  259. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  260. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  261. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  262. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  263. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  264. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  265. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  266. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  267. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  268. msi_g qtools # ./qdload k3 i

  269.  Ожидаем пакет Hello от устройства…

  270.  Пакет Hello от устройства не получен

  271. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  272. msi_g qtools # ./qcommand e c «c 3a»

  273. —- ответ

  274. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  275. msi_g qtools # dmesg | tail          

  276. [  793.849077] usbserial_generic 11.2:1.2: device disconnected

  277. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  278. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  279. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  280. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  281. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  282. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  283. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  284. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  285. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  286. msi_g qtools # ./qdload k3 i        

  287.  Ожидаем пакет Hello от устройства…

  288.  Пакет Hello от устройства не получен

  289. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  290. msi_g qtools # ./qdload s            

  291.  Ожидаем пакет Hello от устройства…

  292.  Пакет Hello от устройства не получен

  293. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  294. msi_g qtools # ls /dev/ttyUSB*

  295. /dev/ttyUSB0

  296. msi_g qtools # ./qrflash x b0 l10 o test.bin

  297.  Отсылка hello… повторный hello возвратил ошибку!

  298. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  299. Floating point exception

  300. msi_g qtools # ./qcommand c «c b»

  301. —- ответ

  302. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  303. msi_g qtools # ls /dev/ttyUSB*                  

  304. /dev/ttyUSB0

  305. msi_g qtools # dmesg | tail                    

  306. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  307. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  308. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  309. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  310. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  311. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  312. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  313. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  314. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  315. [ 1258.055714] traps: qrflash[4089] trap divide error ip:401472 sp:7fff0f189f50 error:0 in qrflash[400000+8000]

  316. msi_g qtools # ./qcommand e c «c 4b aa 00 00 00»

  317. —- ответ

  318. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  319. msi_g qtools # dmesg | tail                      

  320. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  321. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  322. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  323. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  324. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  325. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  326. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  327. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  328. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  329. [ 1258.055714] traps: qrflash[4089] trap divide error ip:401472 sp:7fff0f189f50 error:0 in qrflash[400000+8000]

  330. msi_g qtools # ./qcommand e c «c 29 02 00»

  331. —- ответ

  332. 00000000: 04 00 00 00 10 00 00 00 07 00 00 00 01 00 00 00  *…………….*

  333. msi_g qtools # dmesg | tail                

  334. [  794.336227] usb 11.2: new highspeed USB device number 9 using ehcipci

  335. [  794.447889] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  336. [  794.447893] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  337. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  338. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  339. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  340. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  341. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  342. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  343. [ 1258.055714] traps: qrflash[4089] trap divide error ip:401472 sp:7fff0f189f50 error:0 in qrflash[400000+8000]

  344. msi_g qtools # ifconfig

  345. enp3s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

  346.         inet6 fe80::9d8d:b64c:290e:3790  prefixlen 64  scopeid 0x20<link>

  347.         ether 44:8a:5b:ec:e1:1f  txqueuelen 1000  (Ethernet)

  348. RX packets 0  bytes 0 (0.0 B)

  349. RX errors 0  dropped 0  overruns 0  frame 0

  350. TX packets 0  bytes 0 (0.0 B)

  351. TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  352.         device interrupt 19  

  353. lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

  354.         inet 127.0.0.1  netmask 255.0.0.0

  355.         inet6 ::1  prefixlen 128  scopeid 0x10<host>

  356.         loop  txqueuelen 0  (Local Loopback)

  357. RX packets 322  bytes 50631 (49.4 KiB)

  358. RX errors 0  dropped 0  overruns 0  frame 0

  359. TX packets 322  bytes 50631 (49.4 KiB)

  360. TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  361. wlp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

  362.         inet 192.168.88.186  netmask 255.255.255.0  broadcast 192.168.88.255

  363.         inet6 fe80::250e:beb5:521:fc67  prefixlen 64  scopeid 0x20<link>

  364.         ether 40:e2:30:0c:d0:eb  txqueuelen 1000  (Ethernet)

  365. RX packets 5324  bytes 1558324 (1.4 MiB)

  366. RX errors 0  dropped 845  overruns 0  frame 0

  367. TX packets 4043  bytes 787188 (768.7 KiB)

  368. TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  369. msi_g qtools # dmesg | tail

  370. [  794.447894] usb 11.2: Product: QHSUSB__BULK

  371. [  794.447896] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  372. [  846.958572] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  373. [  846.958574] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  374. [  846.958575] usbserial_generic 11.2:1.0: generic converter detected

  375. [  846.958670] usb 11.2: generic converter now attached to ttyUSB0

  376. [ 1258.055714] traps: qrflash[4089] trap divide error ip:401472 sp:7fff0f189f50 error:0 in qrflash[400000+8000]

  377. [ 1677.508108] usb 11.2: USB disconnect, device number 9

  378. [ 1677.508295] generic ttyUSB0: generic converter now disconnected from ttyUSB0

  379. [ 1677.508307] usbserial_generic 11.2:1.0: device disconnected

  380. msi_g qtools # dmesg | tail

  381. [ 1677.508307] usbserial_generic 11.2:1.0: device disconnected

  382. [ 1735.410241] usb 11.2: new highspeed USB device number 10 using ehcipci

  383. [ 1735.521629] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  384. [ 1735.521632] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  385. [ 1735.521633] usb 11.2: Product: QHSUSB__BULK

  386. [ 1735.521635] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  387. [ 1735.521943] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  388. [ 1735.521945] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  389. [ 1735.521946] usbserial_generic 11.2:1.0: generic converter detected

  390. [ 1735.522013] usb 11.2: generic converter now attached to ttyUSB0

  391. msi_g qtools # ./qcommand e c «c 3a»

  392. ^Z

  393. [1]+  Stopped                 ./qcommand e c «c 3a»

  394. msi_g qtools # ./qcommand e c «c 3a»

  395. ^Z

  396. [2]+  Stopped                 ./qcommand e c «c 3a»

  397. msi_g qtools # dmesg | tail          

  398. [ 2226.830778] usbserial_generic 11.2:1.0: generic converter detected

  399. [ 2226.830872] usb 11.2: generic converter now attached to ttyUSB1

  400. [ 2226.830934] usbserial_generic 11.2:1.1: The «generic» usbserial driver is only for testing and oneoff prototypes.

  401. [ 2226.830935] usbserial_generic 11.2:1.1: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  402. [ 2226.830936] usbserial_generic 11.2:1.1: generic converter detected

  403. [ 2226.830993] usb 11.2: generic converter now attached to ttyUSB2

  404. [ 2226.831045] usbserial_generic 11.2:1.2: The «generic» usbserial driver is only for testing and oneoff prototypes.

  405. [ 2226.831046] usbserial_generic 11.2:1.2: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  406. [ 2226.831047] usbserial_generic 11.2:1.2: generic converter detected

  407. [ 2226.831098] usb 11.2: generic converter now attached to ttyUSB3

  408. msi_g qtools # ./qcommand e c «c 3a»

  409. Последовательный порт /dev/ttyUSB0 не открывается

  410. msi_g qtools # ./qcommand p1 e c «c 3a»

  411. —- ответ

  412. 00000000: 3a a1 6e 7e                                      *:.n~            *

  413. msi_g qtools # ./qcommand p2 e c «c 3a»

  414. Последовательный порт 2 не открывается

  415. msi_g qtools # ./qcommand p3 e c «c 3a»

  416. Последовательный порт 3 не открывается

  417. msi_g qtools # ls /dev/ttyUSB*                    

  418. /dev/ttyUSB1

  419. msi_g qtools # dmesg | tail              

  420. [ 2283.871125] usbserial_generic 11.2:1.2: device disconnected

  421. [ 2284.189558] usb 11.2: new highspeed USB device number 12 using ehcipci

  422. [ 2284.301056] usb 11.2: New USB device found, idVendor=19d2, idProduct=0076

  423. [ 2284.301059] usb 11.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3

  424. [ 2284.301072] usb 11.2: Product: QHSUSB__BULK

  425. [ 2284.301073] usb 11.2: Manufacturer: Qualcomm CDMA Technologies MSM

  426. [ 2284.301421] usbserial_generic 11.2:1.0: The «generic» usbserial driver is only for testing and oneoff prototypes.

  427. [ 2284.301423] usbserial_generic 11.2:1.0: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  428. [ 2284.301425] usbserial_generic 11.2:1.0: generic converter detected

  429. [ 2284.301508] usb 11.2: generic converter now attached to ttyUSB1

  430. msi_g qtools # ./qcommand p1 e c «c 3a»

  431. —- ответ

  432. 00000000: 01 00 00 00 30 00 00 00 02 00 00 00 01 00 00 00  *….0………..*

  433. 00000010: 00 04 00 00 02 00 00 00 00 00 00 00 00 00 00 00  *…………….*

  434. 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  *…………….*

  435. 00000030: 01 00 00 00 30 00 00 00 02 00 00 00 01 00 00 00  *….0………..*

  436. 00000040: 00 04 00 00 02 00 00 00 00 00 00 00 00 00 00 00  *…………….*

  437. 00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  *…………….*

  438. msi_g qtools # ls /dev/ttyUSB*            

  439. /dev/ttyUSB1

  440. msi_g qtools # ./qdload p1 k3 i

  441.  Ожидаем пакет Hello от устройства…

  442.  Идентификатор образа для загрузки: 00000007

  443.  Загружаем loaders/NPRG9x25p.bin…

  444.  Передаём загрузчик в устройство…

  445.  Загрузчик передан успешно

  446.  Отсылка hello…ok

  447.  Чипсет: MDM9x25  (f9af0000)

  448.  Флешпамять: Elite Semiconductor FM6BD4G2GA, NAND 512MiB 1.8V 8bit

  449.  Версия протокола: 3

  450.  Размер сектора: 512 байт

  451.  Размер страницы: 2048 байт (4 секторов)

  452.  Размер OOB: 64 байт

  453.  Тип ECC: BCH, 4 бит

  454.  Размер ЕСС: 7 байт

  455.  Размер spare: 4 байт

  456.  Положение маркера дефектных блоков: user+1d1

  457.  Общий размер флешпамяти = 4096 блоков (512 MB)

  458. msi_g qtools # qrflash p1 x b0 l0 o rawdump.bin        

  459. bash: qrflash: command not found

  460. msi_g qtools # ./qrflash p1 x b0 l0 o rawdump.bin

  461.  Чтение блоков 00000000 00000fff

  462.  Формат данных: 512+16

  463.  Блок: 00000642 Badblock

  464.  Блок: 000007d1 Badblock

  465.  Блок: 00000fff

  466. msi_g qtools # ./qcommand p1 c «c 0b»        

  467. —- ответ

  468. 00000000: 7e 0c 14 3a 7e                                   *~..:~           *

  469. msi_g qtools # ls /dev/ttyUSB*                        

  470. /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3

  471. msi_g qtools # dmesg | tail                          

  472. [ 3902.650913] usbserial_generic 11.2:1.0: generic converter detected

  473. [ 3902.651008] usb 11.2: generic converter now attached to ttyUSB1

  474. [ 3902.651065] usbserial_generic 11.2:1.1: The «generic» usbserial driver is only for testing and oneoff prototypes.

  475. [ 3902.651066] usbserial_generic 11.2:1.1: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  476. [ 3902.651068] usbserial_generic 11.2:1.1: generic converter detected

  477. [ 3902.651171] usb 11.2: generic converter now attached to ttyUSB2

  478. [ 3902.651231] usbserial_generic 11.2:1.2: The «generic» usbserial driver is only for testing and oneoff prototypes.

  479. [ 3902.651232] usbserial_generic 11.2:1.2: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  480. [ 3902.651233] usbserial_generic 11.2:1.2: generic converter detected

  481. [ 3902.651338] usb 11.2: generic converter now attached to ttyUSB3

  482. msi_g qtools # ./qcommand p1 e c «c 4b aa 00 00 00»

  483. —- ответ

  484. 00000000: 4b aa 00 00 00 2a 37 7e                          *K….*7~        *

  485. msi_g qtools # dmesg | tail

  486. [ 3902.650913] usbserial_generic 11.2:1.0: generic converter detected

  487. [ 3902.651008] usb 11.2: generic converter now attached to ttyUSB1

  488. [ 3902.651065] usbserial_generic 11.2:1.1: The «generic» usbserial driver is only for testing and oneoff prototypes.

  489. [ 3902.651066] usbserial_generic 11.2:1.1: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  490. [ 3902.651068] usbserial_generic 11.2:1.1: generic converter detected

  491. [ 3902.651171] usb 11.2: generic converter now attached to ttyUSB2

  492. [ 3902.651231] usbserial_generic 11.2:1.2: The «generic» usbserial driver is only for testing and oneoff prototypes.

  493. [ 3902.651232] usbserial_generic 11.2:1.2: Tell linuxusb@vger.kernel.org to add your device to a proper driver.

  494. [ 3902.651233] usbserial_generic 11.2:1.2: generic converter detected

  495. [ 3902.651338] usb 11.2: generic converter now attached to ttyUSB3

  496. msi_g qtools # ls /dev/ttyUSB*

  497. /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3

  498. msi_g qtools # ./qcommand p1 e c «c 29 02 00»

  499. —- ответ

  500. 00000000: 29 02 00 59 6a 7e                                *)..Yj~          *

  501. msi_g qtools # ls /dev/ttyUSB*

  502. ls: cannot access /dev/ttyUSB*: No such file or directory

  503. msi_g qtools # dmesg | tail

  504. [ 4123.824702] usb 11.2: Manufacturer: ZTE,Incorporated

  505. [ 4123.824703] usb 11.2: SerialNumber: P680A1ZTED000000

  506. [ 4123.841902] rndis_host 11.2:1.0 usb0: register ‘rndis_host’ at usb0000:00:1a.01.2, RNDIS device, 36:4b:50:b7:ef:da

  507. [ 4123.845765] usbstorage 11.2:1.2: USB Mass Storage device detected

  508. [ 4123.845988] scsi host9: usbstorage 11.2:1.2

  509. [ 4124.305706] rndis_host 11.2:1.0 enp0s26u1u2: renamed from usb0

  510. [ 4124.842072] scsi 9:0:0:0: CDROM            CWID     USB SCSI CDROM  2.31 PQ: 0 ANSI: 2

  511. [ 4124.845056] sr 9:0:0:0: [sr1] scsi1 drive

  512. [ 4124.845231] sr 9:0:0:0: Attached scsi CDROM sr1

  513. [ 4124.845309] sr 9:0:0:0: Attached scsi generic sg3 type 5

  514. msi_g qtools #

@snegin

Пожалуйста сделайте патченный загрузчик под этот проц.

@forth32

Это в смысле MSM7625? А непатченный загрузчик под этот чипсет есть?

@snegin

@snegin

@snegin

@forth32

Кто ж его знает. У меня нет ни одного устройства на этом чипсете, как мне проверить?
Кстати, а какие вообще распространенные устройства на нем есть?

@vvevvevve

На этих чипсетах делали ещё и устройства с eMMC в качестве носителя.
snegin:

  1. Ваш аппарат точно с NAND? Как он называется?
  2. В каком режиме находится Ваш аппарат? Что доступно — интерфейс PBL, интерфейс SBL?
  3. Загрузчик, который Вы выложили — без заголовка. Куда делся заголовок? В оригинале, это был NPRG, ENPRG или MPRG? Откуда Вы, вообще, взяли этот код?
  4. Вы пробовали использовать наш «комплектный» ENPRG7x27Ap.bin ?

@snegin

to forth32
Я в том плане можно ли пропатчить этот загрузчик.Понятно что без устройства не протестируешь.
Novatel 4082
Huawei E585

to vvevvevve
1.С нандом.Сегодня разберу и посмотрю точно какая там память.
2.Аппарат полностью в рабочем режиме.Есть 2 стандартных порта.
3.Загрузчик вырезан из софта для анлока.Судьба заголовка мне неизвестна.Думаю что изначально это был NPRG.
4.Не провобовал.Заведу в PBL — попробую.

Мне нужно прочитать efs и слить разделы устройства.

@vvevvevve

Вот, нашёл какое-то чудо: http://vve.su/files/misc/tmp/NPRG7627A.bin .
Попробуйте просто запустить его в исходном виде, непатченный. Думаю, что это нужно делать так:
qdload -pX -k9 -q -a2dc00000 NPRG7627A.bin
Если он запустится и успешно выполнится команда hello, то пропатчим его и включим в комплект.

@vvevvevve

Да, X — это номер порта интерфейса SBL, после переключения аппарата в download mode.

@snegin

Ребут после отправки лоадера. Думаю что 7627 и 7625 разные.В 7627 есть пбл.У меня получалось их заводить в него.В 7625 ничего не получилось.

@snegin

Кажется появилась мысль где загрузчик можно взять.Есть один апдейтер. В понедельник выложу.

@vvevvevve

Они все разные, в той или иной мере. И PBL есть во всех 7xxx. И ОЗУ на 7×25 может быть размещено в диапазоне от 0 до 40000000, так что 2dc00000 «вписывается» в этот диапазон.
А может, этот ребут возникает на этапе попытки выполнения hello? Попробуйте запускать без ключа -q.

@vvevvevve

Да, и базовый адрес NANDC в 7×25, абсолютно достоверно, равен a0a00000, как у нас и предполагается.

@snegin

hello ни при чём.Сразу после отправки загрузчика перезагрузка.В Вашем загрузчике нет NAND,которая стоит в роутере.Я думаю что хелло не даст ответа при отсутствии в загрузчике этой NAND.Хотя перезагружаться он не должен.Встречал я «творения» самсунга и хуавеи у которых встречалось аналогичное.При этом PBL загрузчики на них работали отлично,а вот SPL ребут и все…Но не на всех прошивках — на некоторых все работало. Апдейтеры их шили и конечно при SBL. Как вариант поищу апдейтер под эту модель.

@snegin

HYNIX_H8BCS0PHOMCP-56M — NAND.

@snegin

https://yadi.sk/d/u3JK6Sf53GMaRQ
Апдейтер в котором должен быть рабочий загрузчик.При распаковке он скорее всего лежит в файле 505 вместе с прошивкой,но необходимо найти начало и конец.С этим проблемы.

@carver-ua

это же хуавей, в ресурсах обычный их app.
старый формат, распковывается скрипом от 2009 года,
split_updata.pl, # Author(s) : McSpoon, # Description : Unpack a Huawei U8220 ‘UPDATA.APP’ file.
но смысла нет, никаких бутов там нет, они в хуавея не используются.

@snegin

Понятно.С хуавеями не знаком.Есть и другие загрузчики под 7627.Одна надежда на PBL.А он там точно есть?

@snegin

@vvevvevve

hello ни при чём.Сразу после отправки загрузчика перезагрузка.
Если запускаете qdload с ключом -q или -i, то hello отправляется автоматически. После запуска загрузчика, конечно. Но разумнее в таких случаях запускать утилиту без этих ключей.

В Вашем загрузчике нет NAND,которая стоит в роутере.Я думаю что хелло не даст ответа при отсутствии в загрузчике этой NAND
Даст ответ. «Unrecognized flash» или вроде того.

Есть и другие загрузчики под 7627
Ну так пробуйте их запускать, проверяйте. Чего Вы ждёте?

Одна надежда на PBL.А он там точно есть?
Да какая разница? Если он даже не называется PBL, всё равно в ПЗУ платформы есть код, который умеет инициализировать железо, загружать и запускать ENPRG.

@vvevvevve

Ещё загрузчики.

Ну и пробуйте их запускать. Смотрите адреса в заголовках (они там у Вас все разные) и задавайте в ключе -a: (слово по смещению 0xc в файле) — 0x28.

@snegin

@vvevvevve

Кстати, тот ENPRG7x27Ap.bin в комплекте — это, по идентификатору образа, NPRG, а не ENPRG. Так что его можно тоже пробовать грузить (по адресу 600000).

@snegin

Загрузчик отправлен.Дальше отсылка hello:
Отсылка hello… повторный hello возвратил ошибку!
00000000: 7e 03 00 03 33 1b 7e *…3. *
Ребут.
Это о ENPRG7x27Ap.bin.

@vvevvevve

Видите, он даже запускается и что-то успевает ответить.
Запускайте qdload без hello, а hello потом пробуйте отправить в интерактивном режиме qcommand, командой is .

@vvevvevve

Или хотя бы просто без параметров — посмотреть, что ответит: команда c 0 в интерактивном режиме.

@carver-ua

по коду ошибки, похоже что после отправки загрузчика, ему забыли передать управление.
поэтому телефон на 01 и отвечает 03 с кодом 0003 — неправильная длина.
(NAK response packet+Invalid length)
потому что 01 это еще не hello, a пока write.

@snegin

—- ответ —
00000000: 7e 03 00 06 9e 4c 7e *….L *
Что я делаю не так?

@snegin

ДМ — qdload -p21 -k9 -a600000 loadersENPRG7x27Ap.bin

@snegin

С остальными перезагрузка.

@vvevvevve

Что я делаю не так?

Я ведь вижу только ответ, но не вижу — что и на что отвечает. Покажите полный сеанс загрузки NPRG и выполнения команды.

@carver-ua

попробуйте просто профлешить другое похожее устройство, и снифером посмотреть как все устроенно на квалкоме. потом сравнить оба лога, и все станет намного понятнее. пока выходит что у вас все буты не те. или в ребут или не стартуют. может вы не туда грузите, или не то.
может есть тема на 4pda, или еще где, по вашему устройству на 7625, или не на 7625))).
думаю на многих форумах — есть ребята, которые по удаленке — и бут нужный найдут, и допилят его, и помогут вам поднять устройство.

@vvevvevve

потому что 01 это еще не hello a пока white.

Это в DMSS команда 01 = Write, а в SDP это Hello. Он же не SBL эту команду отправляет, а загрузчику. Я надеюсь, во всяком случае… Почему и прошу показать полную картину сессии.

@carver-ua

ARMPRG не может ответить 03, там ответы четные восновном.
значит OEMSBL не стартонул ARMPRG, и отвечает сам.
ARMPRG кривой или адресс, х.з.
может канешно ответ на 05/GO — чем-то поможет,
но в случае перегрузки — он не поможет, а там где не стартует, явно дело в буте.

подозреваю производитель устройства, версии с DIAG/ATI, дамп ram, и еще что, было бы намного информативнее чем фраз бут для 7625.

@snegin

@carver-ua

да, там сразу в cmm написанно что Huawei E5832
7625A-13553008-SNCAALZM

@carver-ua

лет пять назад, у меня был его близкий родственник, huawei ec5825, в oemsbl
7625A-135520-SNCABLUM

я тогда нашел пару NPRG7625 в гугле, от acer e101 и wellcom a66
но вроде у меня тогда ничего не получилось, но уже не помю с чем.
толи с адресом загрузки, толи с дописыванием в бут своего флешера.
адресс загрузки в тех бутах был 0x05F00000, а qtools тогда ее небыло.

тут не помню, но на старых платформах адрес мог быть разный,
иногда нужно было сделать «rebase» чужому загрузчику,
ну поправить скриптом все смещения в файле.

@carver-ua

вот линк на те буты. может там только дрова придется самому допилить.
https://www.4shared.com/rar/T_jjXg4Qei/nprg7625.html
acer e101 0502_9002 NPRG7625.hex
acer e101 05C6_9002 NPRG7625.hex
wellcom a66 AQ4-0-0360-NPRG7625.hex
wellcom a66 AQ4-0-0370-NPRG7625.hex

@snegin

В любом случае огромное спасибо.О результатах напишу.

@carver-ua

судя по 80-VP758, в msm7225(думаю всех 7×25 тоже) — отсутствует PBL. тоесть загрузчик в процессоре.
и вообще по большинству пунктов *Cannot be supported, due to hardware issue.

тоесть, в отличии от новых процов, qtools на данном устройстве, пригодится в очень редких ситуациях,
скорее в одной наверное, переписать/поправить OEMINFO, на рабочем устройстве.

востановить с довндоада — скорее всего можно стандартным флешером,
а если полностью труп, то только jtag, а там пиши что угодно.

@vvevvevve

отсутствует PBL. тоесть загрузчик в процессоре

Да не отсутствует он — как же без него? Просто из-за какой-то ошибки у них не получилось организовать загрузку кода. Даже не могу представить — какая это могла бы быть ошибка, ведь сама по себе и флешка пишется, и порт USB работает. А одновременно эти действия сразу после запуска почему-то не получается.
То есть, да: особого смысла что-то читать из него нет. Разве только для того, чтобы потом c JTAG-ом записать.

@carver-ua

наверное первой фразой я должен написать спасибо,
и вам/тебе, и forth32, за помощь в других ситуациях, не связанных с qtools.

у меня нет большого опыта, но PBL в квалкомах появился «недавно».
когда другие процы уже грузились с sd/usb/232, может что забыл,
а тот-же i7 — наверняка до сих пор биос просит.

на этой пасочке, думаю это просто квалкомовский download,
после dmss комманды 3a или проблем с amss(на lte — dsp2)

ИМНО, нет тут никаких PBL по архитектуре,
и по топику, armprg все-равно пока левак грузился.
и грузился через странный OEMSBL, которому armprg не нужны по определению.

@newadb

  1. У меня аналогичная проблема (mf677).
    qdload -p49 -k1 -i -t -d50 ENPRG8200p.bin

Найден блок идентификации загрузчика
Не указан тип чипсета — полная инициализация невозможна

Файл загрузчика: ENPRG8200p.bin
Адрес загрузки: 58020000
Размер файла: 162084
Загружено: 162084
Запуск загрузчика…ok
Отсылка hello… повторный hello возвратил ошибку!
00000000: 15 01 51 43 4f 4d 20 66 61 73 74 20 64 6f 77 6e ..QCOM fast down
00000010: 6c a8 8b 7e *l..~

  1. Ну и гораздо более тривиальная:
    image

Recommend Projects

  • React photo

    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo

    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo

    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo

    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo

    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo

    Laravel

    A PHP framework for web artisans

  • D3 photo

    D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Visualization

    Some thing interesting about visualization, use data art

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo

    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo

    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo

    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo

    Alibaba

    Alibaba Open Source for everyone

  • D3 photo

    D3

    Data-Driven Documents codes.

  • Tencent photo

    Tencent

    China tencent open source team.

Иногда в веб-приложениях появляется необходимость выполнить сложные ресурсоемкие задачи, которые не могут быть умещены в коротком временном интервале HTTP запроса. В этом случае на помощь приходят очереди. Основная идея очередей – избежать выполнения ресурсоемких задач непосредственно после отправки запроса. Вместо этого задача ставится в очередь для последующего выполнения в асинхронном режиме. Т.е. при получении запроса от клиента мы инкапсулируем задачу как сообщение и отправляем его в очередь, а уже обработчик очереди достает сообщения в порядке их следования и обрабатывает надлежащим образом. Забегая вперед, скажу, что возможен режим работы очередей, когда при наличии нескольких копий обработчика, следующая задач будет поступать на свободный обработчик. Таким образом достигается распараллеливание выполнения задач.

В данном разделе рассматривается работа с очередями, использующими сервер сообщений RabbitMQ. Сервер RabbitMQ по сути является менеджером очередей, который имеет следующие преимущества:

  • в случае некорректного завершения работы сервера, данные в очереди не теряются. И при последующем запуске обработка продолжается с того места, где был обрыв;
  • распределить задачи на несколько очередей, т.е. создать распараллеливание на уровне сообщений
  • если результат обработки не удовлетворяет, задачу можно послать в очередь повторно;
  • существует несколько режимов работы очереди: рассылка типа точка-точка(direct), рассылка сообщений по шаблону(topic), широковещательная рассылка сообщений(fanout);
  • возможность синхронизировать работу клиента и сервера, своего рода реализация RPC
  • количество хранимых в очереди сообщений неограничено
  • сервер сообщений может быть расположен удаленно как по отношению к продюсеру, так и по отношению к консьюмеру.

В туториалах будут приведены примеры для всех вышеперечисленных вариантов. За основу взяты туториалы с официального сайта, дополнены и реализованы на PHP для RabbitMQ.

RabbitMQ испозует протокол AMQP. Чтобы использовть RabbitMQ необходимо поставить клиентскую и серверную части.

Установка сервера

Для установки расширения AMQP для PHP необходимо сначала установить RabbitMQ Server

Добавим следующию строку в файл /etc/apt/sources.list

1
deb http://www.rabbitmq.com/debian/ testing main
1
2
3
4
wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc
sudo apt-get update
sudo apt-get install rabbitmq-server

Установка клиента

Выбираем нужную библиотеку и устанавливаем http://www.rabbitmq.com/devtools.html.
Наиболее популярны php-amqplib и PECL AMQP library

Базовые понятия

В RabbitMQ используются следующий обозначения. Продюсер – программа, которая посылает сообщения. Будем обозначать его так

Брокер(очередь) – собственно просто буфер в памяти без каких-либо ограничений на количество хранимых сообщений. В одну и ту же очередь могут отсылать сообщения несколько продюсеров, так же как несколько консьюмеров могут пытаться получить сообщения из одной и той же очереди. Очередь будет обозначена так(сверху указано имя очереди)

Консьюмер(получатель) – программа, которая принимает сообщения из очереди. Будем обозначать его так

Здесь важно отметить, что продюсер, консьюмер и брокер могут быть расположены на различных машинах, более того, в большинстве случаев это именно так.

Первый скрипт работы с очередью, своего рода “Hello world”, будет отсылать текстовое сообщение с клиента, принимать его на сервере и выводить на экран.

Т.е. схема работы следующая: Первое, что надо сделать, это установить соединение с сервером RabbitMQ. Соединение устанавливается командами

1
2
$connection = new AMQPConnection($connection_params);
$connection->connect();

где

1
2
3
4
5
6
7
$connection_params = array(
  'host' => 'localhost',
  'port' => 5672,
  'vhost' => '/',
  'login' => 'guest',
  'password' => 'guest'
);

это дефолтные значения. Если достаточно дефолтного значения любого из этих параметров, то его можно опустить. И, напротив, если, к примеру, нужно подключиться к другой машине, в параметре host необходимо указать ее имя или ip адрес.

Используя коннект можно получить объект для канала

1
$channel = new AMQPChannel($connection);

На основе полученного канала создаем обменник

1
2
3
4
5
$exchange = new AMQPExchange($channel);
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declare();

и, собственно, саму очередь

1
2
3
4
$queue = new AMQPQueue($channel);
$queue->setName('hello');
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE);
$queue->declare();

Когда обменник и очередь готовы, их можно связать по ключу

1
$queue->bind($exchange->getName(), 'foo_key');

Объявлять очередь и связывать ее с обменником можно как на продюсере, так и на консьюмере. Все зависит от того, что первым будет запускаться. Если неизвестно, то, возможно следует объявить и там и там. При этом имена очередей должны совпадать. Если имена очередей совпадают, то количество объявлений не имеет значения. Очередь с определенным именем может быть только одна.
Стоит отметить, что сообщение не может быть опубликовано напрямую в очередь, оно должно проходить через обменник. Собственно посредством обменника оно и публикуется
$result = $exchange->publish(json_encode(“Hello world!”), “foo_key”);

После того как сообщение отослано, коннект можно разорвать.

1
$connection->disconnect();

Получатель также должен выполнить ту же последовательность
– приконнектиться к серверу сообщений;
– создать канал;
– объявить обменник;
– объявить очередь;
– связать очередь с обменником по ключу
Последние два действия, как упоминалось выше, не обязательны. Теперь можно начать прослушивать очередь

1
2
3
4
5
6
while (true) {
    if ($envelope = $queue->get(AMQP_AUTOACK)) {
        $message = json_decode($envelope->getBody());
        print($message);
    }
}

Здесь методу get в качетсве параметра передается константа ARMQ_AUTOACK, которая оповещает сервер сообщений о том, что данное сообщение получено. Это самый простой способ удалить сообщение из очереди. Однако в данном случае в случае неудачной обработки сообщения, вернуть повторно его в очередь нельзя.

Таким образом, получаем два скрипта

send.php

1
2
3
4
5
6
7
8
9
10
11
12
13
$connection = new AMQPConnection($connection_params);
$connection->connect();
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declare(); $queue = new AMQPQueue($channel);
$queue->setName('hello');
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE);
$queue->declare();
$result = $exchange->publish(json_encode("Hello world!"), "foo_key");
$connection->disconnect();

receiver.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$connection = new AMQPConnection($connection_params);
$connection->connect();
$channel = new AMQPChannel($connection);
$exchange = new AMQPExchange($channel);
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE);
$exchange->declare(); $queue = new AMQPQueue($channel);
$queue->setName('hello');
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE);
$queue->declare();
$queue->bind($exchange->getName(), 'foo_key');
while (true) {
    if ($envelope = $queue->get(AMQP_AUTOACK)) {
        $message = json_decode($envelope->getBody());
        print($message);
    }
}
$connection->disconnect();

Распределенные очереди

Основная идея заключается в следующем. Допустим нужно обработать видео файл, чтобы получить на выходе три сконвертированных файла в различные форматы, информацию о метаданных и создать иконки для этого видеофайла. Т.е. получаем 5 задач, три из которых довольно тяжеловесные(конвертация), одна легкая(получение метаданных) и одна средняя(создание иконок). При этом все эти задачи являются независимыми друг от друга. Таким образом, можно выполнять их одновременно, т.е. распараллелить обработку очереди на уровне сообщений(пункт 2). Для этого при объявлении обменника необходимо установить ему тип AMQP_EX_TYPE_FANOUT. Тогда все сообщения, посылаемые в указанный обменник, независимо от имени очереди и ключа роутера, будут прослушиваться всеми запущенными копиями консьюмера. Т.е. каждое следующее сообщение будет отсылаться на следующий свободный консьюмер. В нашем случае их должно быть пять. Такой способ обработки получил название round-robin dispathing. Обратите внимание, что при отправке продюсером и при получении консьюмером используется одна и та же очередь.

Оповещение (acknowledgment)

Некоторые задачи могут выполняться довольно долго. И неизвестно, что может произойти с сервером в этот момент: сервер может перезагрузиться, либо задача может зависнуть или завершится фатальной ошибкой. В первом туториале оповещение было отключено путем передачи параметра AMQP_AUTOACK в метод get(). В этом случае сообщения удаляются из памяти сразу после выполнения метода get и в случае ошибки, случившейся во время обработки, не вернутся в очередь. Чтобы избежать этого, не будем передавать константу AMQP_AUTOACK в метод get. Вместо этого по завершению обработки вызовем метод ack(), который уведомит брокер о том, что сообщение успешно обработано и его можно удалить из памяти. В противном случае RabbitMQ понимает, что сообщение не обратботано и перенаправляет его другому свободному консьюмеру. Однако здесь стоит отметить один важный момент. Перенаправленные сообщения не будут обрабатываться до того пока консьюмер не отконнектится и приконнектится заново к брокеру. Если необходимо заново обработать сообщение в рамках того же коннекта к серверу сообщений, то необходимо вызвать метод nack() с флагом AMQP_REQUEUE, который поставит неудачно обработанную задачу обратно в очередь и уведомит брокер о том, что эта задача должна быть вновь обработана.

1
2
3
4
5
6
7
8
9
10
11
12
while (true) {
    if ($evnelope = $queue->get()) {
        $message = $enevelope->getBody();
        if (doWork($message)) {
            $queue->ack($envelope->getDeliveryTag());
        } else {
            // этот фрагмент кода может быть опущен, если мы собираемся обработать 
            // передоставленный сообщения в рамках нового коннекта к сереверу сообщений
            $queue->nack($envelope->getDeliveryTag(), AMQP_REQUEUE);
        }  
    }
}

Распростаненная ошибка – при включенном оповещении не подтверждать корректно обработанные задачи(сообщения). В этом случае при каждом новом коннекте, все уже обработанные задачи будут поступать заново на обработку. Процесс будет выглядеть как беспорядочная повторная отпарка сообщений, что в конечном итоге приведет к переполнению памяти. Отследить такую ситуацию можно путем использования нативного инструмента сервера сообщений rabbitmqctl

1
2
3
4
$ sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged
Listing queues ...
hello 0 0
...done.

Жизнеспособность сообщений (durability)

В предыдущем параграфе мы рассмотрели как не потерять сообщение в очереди путем повторной отправки его в очередь. Тем не менее сообщение может быть потеряно в случае если сервер сообщений был неожиданно остановлен. Чтобы этого избежать, очередь должна быть создана с флагом AMQP_DURABLE.

1
2
3
4
$queue = new AMQPQueue($channel);
$queue->setName('hello');
$queue->setFlags(AMQP_DURABLE);
$queue->declare();

Если очередь ‘hello’ уже была объявлена, то данный код вызовет ошибку, поскольку один раз объявленную очередь нельзя объявить повторно с другими параметрами. Из этой ситуации есть два выхода, либо обнулить все очереди как сказано здесь, либо создать новую очередь с неиспользуемым именем. Посмотреть список очередей можно спопособом упомянутым в предыдущем параграфе.
Установка флага AMQP_DURABLE не гарантирует стопроцентную сохранность сообщений в очереди. Несмотря на то, что таким спопосбом мы указываем RabbitMQ сохранять сообщения на диске, существует мертвая зона после получения соощения, когда оно уже в памяти, но еще не сохранено на диске. В этот момент, в случае не предвиденной ситуации, оно может быть утеряно из памяти. Для нашего простого примера таких гарантий достаточно, но если необходимо добиться высоких гарантий получения сообщения, то следует использовать транзакции.

Все вместе

Для примера распределения сообщений между очередями нам понадобится функция, имитирующая загруженность системы. Для этого мы используем обычный таймер

1
2
3
4
5
6
function doWork($message) {
    $sleep_interval = rand(1, 5);
    sleep($sleep_interval);
    print($message.str_repeat('.', $sleep_interval).PHP_EOL);
    return true;
}

Полный код продюсера (send.php) будет выглядеть так

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE);
$exchange->declare();

$queue = new AMQPQueue($channel);
$queue->setName('hello');
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_DURABLE);
$queue->declare();
$queue->bind($exchange->getName(), '');

$result = $exchange->publish(json_encode("Hello world!"), '');

if ($result)
    echo 'sent'.PHP_EOL;
else
    echo 'error'.PHP_EOL;

$connection->disconnect();

Консьюмер (receive.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->declare();

$queue = new AMQPQueue($channel);
$queue->setName('hello');
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_DURABLE);
$queue->declare();
$queue->bind($exchange->getName(), '');

while (true) {
    if ($envelope = $queue->get()) {
        $message = json_decode($envelope->getBody());
        echo "delivery tag: ".$envelope->getDeliveryTag().PHP_EOL;
        if (doWork($message)) {
            $queue->ack($envelope->getDeliveryTag());
        } else {
            $queue->nack($envelope->getDelivaryTag(), AMQP_REQUEUE);
        }
    }
}

$connection->disconnect();

Обратите внимание, что очереди создаются с абсолютно идентичными параметрами. Как уже было сказано, повторное создание очереди с иными параметрами вызовет исключение. Также стоит отметить, что если вы уверены, что консьюмер будет запускаться первым, то создание очереди в продюсере не обязательно.

Теперь, если запустить несколько копий консьюмера, то можно будет видеть как между ними распределяются сообщения. Предположим, что мы отправили 8 сообщений в очередь, т.е. запустили скрипт send.php 8 раз. После этого запускаем в двух разных терминалах по консьюмеру

Вывод в первом терминале

1
2
3
4
5
6
7
$ php receive.php
delivery tag: 1
Hello world!...
delivery tag: 2
Hello world!.....
delivery tag: 3
Hello world!....

Вывод во втором терминале

1
2
3
4
5
6
7
8
9
10
11
$ php receive.php
delivery tag: 1
Hello world!.
delivery tag: 2
Hello world!..
delivery tag: 3
Hello world!...
delivery tag: 4
Hello world!..
delivery tag: 5
Hello world!.

Как видно сообщения распределились по мере нагрузки консьюмера.

Рассылка публикаций

В предыдущем уроке мы распределяли сообщения между всеми консьюмерами. В данном уроке, наоборот, будем отсылать все сообщения из очереди на все консьюмеры. Такой шаблон известен как “публичная рассылка”(publish subscribe). Такое поведение может быть полезно, к примеру, при создании логирования с одновременным выводом сообщения в терминал. Т.е. один консьюмер получает сообщение и сохраняет его на диска, в то время как другой выводит это сообщение на экране.

В предыдущих разделах мы не заостряли внимание на обменнике(exchanger). На самом деле продюсер никогда не отправляет сообщения непосредственно в очередь. Он размещает их в обменнике. Собственно говоря, продюсер и не знает было ли сообщение доставлено в очередь или нет. Обменник представляет собой простую вещь – он получает сообщения от продюсера и отправляет(публикует) их в очередь. При этом обменник четко знает по какому алгоритму он работает:

  • отправляет сообщение во все очереди с четко заданным именем на все консьюмеры, обрабатывающими эту очередь(direct)
  • отправляет сообщение во все очереди и распределяет сообщение между консьюмерами, обрабатывающими очередь с одинаковым именем(fanout)
  • отправляет сообщение во все очереди с именем, удовлетворяющим шаблону(topic)
  • отклоняет сообщение

В нашем примере будем использовть тип обменника fanout.

1
2
3
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->declare();

Для этой цели продюсер не создает именованную очередь. Консьюмер же, в свою очередь, создает анонимную очередь, в которую принимает сообщения продюсера. При таком подходе каждый консьюмер будет принимать все сообщения продюсера.

Анонимные очереди

В предыдущем уроке у нас была необходимость рассылки сообщений в очереди с одинаковыми именами для возможности распределения сообщений между продюсерами и консьюмерами. Для достижения же текущей цели нам нужны выполнить две вещи. Во-первых, нам нужны очереди с различными именами. Во-вторых, созданные очереди должны автоматически удаляться после окончания работы скрипта.
Для создания рандомного имени, можно воспользоваться одной из функций генерации хеша, к примеру sha1 или md5. Или же оставить эту задачу серверу сообщений. Если при объявлении очереди не устанавливать ей имя, то RabbitMQ сам задаст рандомное имя очереди.
Для возможности автоматического удаления очереди, при ее создании нужно задать флаги AMQP_IFUNUSED, AMQP_AUTODELETE.

1
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE);

Связывание (bindings)

Мы уже создали обменник с типо fanout и очередь. Теперь нужно сказать обменнику, что он должен публиковать сообщения имеено в эту очередь. Это отношение называется связыванием (binding)

1
$queue->bind($exchange->getName(), '');

Здесь второй параметр – ключ, по которому связывается обменник и очередь. В данном случае он может быть любой строкой, поскольку его значение игнорируется в случае, если обменник имеет тип fanout.

Все вместе

Поскольку в данном примере мы имеем дело с анонимными очередями, создаваться они должны на стороне консьюмера, и консьюмер, соответственно, должен быть запущен первым. Из продюсера создание очередей удаляется.

send.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$message = isset($argv[1]) ? $argv[1] : 'default_message';

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->setFlags();
$exchange->declare();

$result = $exchange->publish(json_encode($message), '');

if ($result)
    echo 'sent'.PHP_EOL;
else
    echo 'error'.PHP_EOL;

$connection->disconnect();

Консьюмер (receive.php)

$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('ex_hello');
$exchange->setType(AMQP_EX_TYPE_FANOUT);
$exchange->setFlags();
$exchange->declare();

$queue = new AMQPQueue($channel);
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_DURABLE);
$queue->declare();

$queue->bind($exchange->getName(), '');

while (true) {
    if ($envelope = $queue->get()) {
        $message = json_decode($envelope->getBody());
        echo "delivery tag: ".$envelope->getDeliveryTag().PHP_EOL;
        if (doWork($message)) {
            $queue->ack($envelope->getDeliveryTag());
        } else {
            $queue->nack($envelope->getDelivaryTag(), AMQP_REQUEUE);
        }
    }
}

$connection->disconnect();

Селективная рассылка

В предыдущем уроке была рассмотрена возможность отсылки сообщений нескольким получателям.В данном уроке мы рассмотрим как отсылать сообщения в четко определенные очереди. Такая возможность может понадобиться, к примеру, если мы не хотим сохранять все сообщения на диске, а только критический. В то время как на экран будут выводиться все сообщения.

Связывание (bindings)

Связываение уже упоминалось в предыдущем уроке

1
$queue->bind($exchange->getName(), '');

Повторимся, оно нужно, чтобы сказать обменнику, что он должен публиковать сообщения имеено в эту очередь.
В методе bind() имеется второй параметр – ключ(routingKey), по которому связывается обменник и очередь. В данном уроке он будет играть основную роль. Стоит также напомнить, что ключ напрямую зависит от типа обменника. Так для обменника с типом fanout, он просто игнорируется.
К примеру, если нужно связать обменник и очередь по ключу ‘failure_messages’

1
$queue->bind($exchange->getName(), 'failure_messages');

Прямое связывание (точка-точка)

В предыдущем уроке система логирования выполняла широковещательную рассылку всем консьюмерам. Теперь мы хотим расширить это поведение путем добавления фильтра сообщений по их важности. К примеру, критические ошибки писать на диск, а предупреждения только выводить на экран с целью экономии дискового пространтсва. Ранее мы использовали обменник с типом fanout, который не позволяет это сделать. Сейчас мы используем другой тип обменника – direct, который отправляет сообщения только тем очередям, routingKey которых совпадает с routingKey сообщения. Это поведение проиллюстрировано на изображении

На изображении можно видеть обменник X с типом direct, который связан с очередью Q1 по ключу failure, и с очередью Q2 по ключам notice и warning. В данном случае все сообщения с ключем failure будут отсылаться только в очередь Q1, а все сообщения с ключами notice и warning будут отсылаться в очередь Q2. Сообщения, ключи которые не совпадают с выше указанными, будут игнорироваться всеми очередями.

Множественная связь

Вполне возможно несколько очередей связать с обменником по одному и тому же ключу. Т.е. для нашего примера мы вполне можем установить связь по ключу notice между обменником и очередью Q1 и между обменником и очередью Q2. В таком случае сообщения с ключем notice будут отсылаться на обе очереди, т.е. получаем поведение аналогичное обменнику с типом fanout.

Отправка сообщений

Для отправки сообщений способом точка-точка обменник должен быть создан с типом direct, который сооветствует константе AMQP_EX_TYPE_DIRECT.

1
2
3
4
$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();

После чего возможна публикация сообщений по ключу

1
$exchange->publish($message, 'notice');

Получение сообщений
Получение сообщений ничем не отличается от предыдущего урока, за исключением того, что нам нужно связать обменник с очередью по каждому типу

1
2
3
4
5
6
$queue = new AMQPQueue($channel);
$queue->declare();

foreach ($routingKeys as $routingKey) {
    $queue->bind($exchange->getName(), $routingKey');
}

Все вместе

Как и в предыдущем уроке, поскольку в данном примере мы имеем дело с анонимными очередями, создаваться они должны на стороне консьюмера, и консьюмер, соответственно, должен быть запущен первым. Из продюсера создание очередей удаляется.

Продюсер (send.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$message = 'default_message';
$routingKey = isset($argv[1]) ? $argv[1] : 'default_key';

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();


$result = $exchange->publish(json_encode($message), $routingKey);

if ($result)
    echo 'sent'.PHP_EOL;
else
    echo 'error'.PHP_EOL;

$connection->disconnect();

Консьюмер (receive.php)

$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$routingKeys = array('notice', 'warning', 'failure');

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();

$queue = new AMQPQueue($channel);
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_DURABLE);
$queue->declare();

foreach ($routingKeys as $routingKey) {
    $queue->bind($exchange->getName(), $routingKey');
}

while (true) {
    if ($envelope = $queue->get()) {
        $message = json_decode($envelope->getBody());
        echo "delivery tag: ".$envelope->getDeliveryTag().PHP_EOL;
        echo "routing key: ".$envelope->getRoutingKey().PHP_EOL;
        if (doWork($message)) {
            $queue->ack($envelope->getDeliveryTag());
        } else {
            $queue->nack($envelope->getDelivaryTag(), AMQP_REQUEUE);
        }
    }
}

$connection->disconnect();

Рассылка по шаблону

В предыдущем уроке мы улучшили нашу систему логирования путем использования обменников с типом direct, создав возможность получать сообщения выборочно. Следующим этапом будет создание системы, позволяющей логировать по множеству критериев. Допустим мы хотим разделить обработаку логирования основываясь не только на важности сообщений, но и по устройствам, вызвавшим эту ошибку. Это предоставило бы нам большую гибкость – к примеру, можно было бы выделить обработку логов для критических ошибок, инициированных кроном, и отдельно выделить обработку логов всех сообщений от ядра системы. Для имплементации такой возможности нам неоходимо нечто большее, чем прямая рассылка сообщений (рассылка по методу точка-точка).
Связывание по шаблону

Для выполнения связи по шалбону обменник должен иметь тип topic, который определяется константой AMQP_EX_TYPE_TOPIC. Ключи routingKey составляются из слова, следующих через точку, например, “logs.devices.kernel.notice”, “logs.devices.cron”. Максимальная длина такого ключа может составлять 255 символов. Логика доставки сообщений по ключу схожа с логикой для обменников с типом direct – сообщения с определенным ключем будут доставлены в очереди с соответствующим ключем. Но есть одна большая разница. Ключи, используемые для связи по шаблону, могут содержать два специальных символа:

  • * , соответствует строго одному слову;
  • # , соответствует любому количеству слов, в том числе и отсутствию слов;

Например, имеем следующие связи
*.orange.*
*.*.rabbit
lazy.#

Первое слово описывает скорость, второе – цвет и третье – вид животного, т.е. [speed][color][species]. Мы создали три связи: очередь Q1 связали по ключу “.orange.” и очередь Q2 – по ключам “..rabbit” и “lazy.#”. Таким образом, можно сказать, что очередь Q1 рассматривает всех оранжевых животных, а очередь Q2 – всех зайцев и всех медленных животных.

Рассмотрим несколько примеров:

  • “quick.orange.rabbit” – в обе очереди
  • “lazy.orange.elephant” – в обе очереди
  • “quick.orange.fox” – только в 1-ую
  • “lazy.brown.fox” – только во 2-ую
  • “quick.brown.fox” – будет отброшена
  • “quick.orange.male.fox” – будет отброшена
  • “lazy.orange.male.fox” – только во 2-ую

Обменник с типом topic может повторять поведение обменника с типом fanout, если с ним связать очередь по ключу “#”. Если в ключе не испльзовать специальных символов, то такой обменник будет соответствовать обменнику с типом direct.

Отправка сообщений

Для отправки сообщений по шаблону обменник должен быть создан с типом topic, который сооветствует константе AMQP_EX_TYPE_TOPIC.

1
2
3
4
$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_TOPIC);
$exchange->declare();

После чего возможна публикация сообщений по ключу

1
$exchange->publish($message, 'kern.notice');

Получение сообщений

Получение сообщений ничем не отличается от предыдущего урока

1
2
3
4
5
6
$queue = new AMQPQueue($channel);
$queue->declare();

foreach ($routingKeys as $routingKey) {
    $queue->bind($exchange->getName(), $routingKey');
}

Все вместе

Как и в предыдущем уроке, поскольку в данном примере мы имеем дело с анонимными очередями, создаваться они должны на стороне консьюмера, и консьюмер, соответственно, должен быть запущен первым. Из продюсера создание очередей удаляется.

Продюсер(send.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$message = 'default_message';
$routingKey = isset($argv[1]) ? $argv[1] : 'default_key';

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_TOPIC);
$exchange->declare();

$result = $exchange->publish(json_encode($message), $routingKey);

if ($result)
echo 'sent'.PHP_EOL;
else
echo 'error'.PHP_EOL;

$connection->disconnect();

Консьюмер (receive.php)

$params = array(
'host' => 'localhost',
'port' => 5672,
'vhost' => '/',
'login' => 'guest',
'password' => 'guest'
);

$routingKeys = array('cron.notice', 'kern.*', '*.failure');

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_TOPIC);
$exchange->declare();

$queue = new AMQPQueue($channel);
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_DURABLE);
$queue->declare();

foreach ($routingKeys as $routingKey) {
    $queue->bind($exchange->getName(), $routingKey');
}
while (true) {
    if ($envelope = $queue->get()) {
        $message = json_decode($envelope->getBody());
        echo "delivery tag: ".$envelope->getDeliveryTag().PHP_EOL;
        echo "routing key: ".$envelope->getRoutingKey().PHP_EOL;
        if (doWork($message)) {
            $queue->ack($envelope->getDeliveryTag());
        } else {
            $queue->nack($envelope->getDelivaryTag(), AMQP_REQUEUE);
    }
}
}

$connection->disconnect();

Реализация RPC шаблона

Во втором уроке была реализована очередь, которая распределяла нагрузку между всеми имеющимися консьюмерами. Но, что если нам нужно получить результат от обработчика очереди. Такой подход известен как вызов удаленных процедур или RPC(remote procedure call). В этом уроке будет реализована модель RPC с использованием очереди сообщений RabbitMQ. Конечно, такой подход предполагает, что обработка не должна занимать много времени. Для реализации примера наша функция обработчик будет изменять сообщение “message before” на “message after”.

В целом, реализация RPC посредством RabbitMQ довольно проста. Клиент отправляет сообщение, а сервере отвечает. Для обработки ответа сервера, необходимо создать callback очередь. Чтобы узнать какая callback очередь ожидает ответа, мы должны в запросе послать ее имя. Для этого на продюсере создается анонимная очередь и ее имя добавляется в параметры запроса

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$replyQueue = new AMQPQueue($channel);
$replyQueue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_EXCLUSIVE);
$replyQueue->declare();

$replyQueue->bind($exchange->getName(), $replyQueue->getName());

$correlationId = sha1($replyQueue->getName());
$attributes = array(
'reply_to' => $replyQueue->getName(),
'correlation_id' => $correlationId
);
$result = $exchange->publish(json_encode($message), '', AMQP_MANDATORY, $attributes);

// ... then code to read a response message from the callback_queue ...

Обратите внимание, что callback очередь создается с флагом AMQP_EXCLUSIVE, что означает, что только один консьюмер может слушать эту очередь.

Correlation ID

В методе, представленном выше, мы предполагаем создавать callback очередь для каждого RPC запроса. Поскольку нельзя однозначно по имени очереди определить какому запросу принадлежит ответ, в запрос также добавляется параметр correlationId, который имеет уникальное значение для каждого запроса. Позже, когда мы получим ответ, мы сможем сравнить его correlationId со значением, переданным вместе с запросом. И в случае их несовпадения просто отбросить полученный ответ.

Итоговый план действий

  • клиент создает анонимную эксклюзивную callback очередь
  • клиент отсылает запрос с двумя параметрами:
    replyTo – имя callback очереди
    corralationId – уникальное значение для каждого запроса
  • запрос отправляется в именованную очередь, к примеру, с именем rpc_queue
  • RPC воркер (RPC сервер) ждет запрос от этой очереди и когда запрос появляется, обрабатывает его и шлет ответ обратно клиенту, используя имя callback очереди в качестве роутер-ключа
  • клиент слушает callback очередь и когда сообщение появляется, сверяет correlationId. Если значение этого свойства из полученного сообщения соответствует ранее сформированном значению, ответ обрабатывается приложением.

Все вместе

Функция обработки сообщения на стороне сервера выглядит следующим образом

1
2
3
4
5
6
7
8
9
10
11
12
13
function doWork($message)
{
    foreach ($message as &$m) {
        echo $m;
        $sleep_time = rand(0, 10);
        $tmp = explode(' ', $m);
        $m = $tmp[0].' after';
        echo str_repeat('.', floor($sleep_time));
        echo PHP_EOL;
    }
    sleep($sleep_time);
    return $message;
}

Функция обработки сообщения на стороне клиента

1
2
3
4
function getWork($message)
{
    print_r($message);
}

Продюсер(send.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$message = 'message before';
$routingKey = isset($argv[1]) ? $argv[1] : 'default_key';

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_TOPIC);
$exchange->declare();


$replyQueue = new AMQPQueue($channel);
$replyQueue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_EXCLUSIVE);
$replyQueue->declare();

$replyQueue->bind($exchange->getName(), $replyQueue->getName());

$correlationId = sha1($replyQueue->getName());
$attributes = array(
'reply_to' => $replyQueue->getName(),
'correlation_id' => $correlationId
);
$result = $exchange->publish(json_encode($message), $routing_key, AMQP_MANDATORY, $attributes);

if ($result)
echo 'sent'.PHP_EOL;
else
echo 'error'.PHP_EOL;

while (true) {
    if ($envelope = $replyQueue->get()) {
        if ($envelope->getCorrelationId() == $corrlationId) {
            echo ($envelope->isRedelivery()) ? 'r: ' : 'n: ';
            $message = json_decode($envelope->getBody());
            getWork($message);
            echo PHP_EOL;
            $replyQueue->ack($envelope->getDeliveryTag()); break;
         }
    }  
    // for avoid a hunging erlang    sleep(1); 
}

$connection->disconnect();

Консьюмер (receive.php)

$params = array(
    'host' => 'localhost',
    'port' => 5672,
    'vhost' => '/',
    'login' => 'guest',
    'password' => 'guest'
);

$routingKey = isset($argv[1]) ? $argv[1] : 'default_key';

$connection = new AMQPConnection();
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('logs');
$exchange->setType(AMQP_EX_TYPE_TOPIC);
$exchange->declare();

$queue = new AMQPQueue($channel);
$queue->setName('rpc_queue');
$queue->setFlags(AMQP_IFUNUSED | AMQP_AUTODELETE | AMQP_DURABLE);
$queue->declare();

$queue->bind($exchange->getName(), $routingKey);

while (true) {
    if ($envelope = $queue->get()) {
        $message = json_decode($envelope->getBody());
        echo "delivery tag: ".$envelope->getDeliveryTag().PHP_EOL;
        echo "routing key: ".$envelope->getRoutingKey().PHP_EOL;
        if (doWork($message)) {
            $queue->ack($envelope->getDeliveryTag());
        } else {
            $queue->nack($envelope->getDelivaryTag(), AMQP_REQUEUE);
        }
    }
}

$connection->disconnect();

forth32 / qtools
Goto Github
PK

View Code? Open in Web Editor
NEW

125.0
125.0
58.0
6.74 MB

Набор инструментов для работы с flash модемов на чипсете qualcom

License: GNU General Public License v3.0

Assembly 2.57%
C 92.85%
Shell 1.28%
Makefile 0.47%
C++ 2.83%

qtools’s People

qtools’s Issues

qrflash possibility to add save ptable.bin while using -m

Hello
is it possible to save the partition table when we use qrflash -m to view the partition table directly from the flash into a file current-ptable.bin ? thanks for support


qtools_win>qrflash -p22 -m``
 # start size A0 A1 A2 F # format ------ Name ------
============================================================
00 0 00000a ff 01 00 00 LNX 0:SBL
01 a 00000a ff 01 ff 00 LNX 0:MIBIB
02 14 00002c ff 01 00 00 LNX 0:EFS2
03 40 00001b ff 01 00 00 LNX 0:SDI
04 5b 00001b ff 01 00 00 LNX 0:TZ
05 76 000006 ff 01 00 00 LNX 0:MBA
06 7c 00001b ff 01 00 00 LNX 0:RPM
07 97 000196 ff 01 00 00 LNX 0:QDSP
08 22d 000054 ff 01 00 00 LNX 0:ADSP
09 281 000032 ff 01 00 00 LNX 0:ZTEFLAG
10 2b3 0000a2 ff 01 00 00 LNX 0:BSPFOTA
11 355 00002b ff 01 00 00 LNX 0:NVBAK
12 380 000007 ff 01 00 00 LNX 0:APPSBL
13 387 000052 ff 01 00 00 LNX 0:APPS
14 3d9 000196 ff 01 00 00 LNX 0:SCRUB
15 56f 00000b ff 01 00 00 LNX 0:MISC
16 57a 000159 ff 01 00 00 LNX 0:CACHE
17 6d3 00012c ff 01 00 00 LNX 0:SYSTEM
18 7ff 000279 ff 01 00 00 LNX 0:USERDATA
19 a78 000053 ff 01 00 00 LNX 0:RECOVERY
20 acb 00000b ff 01 00 00 LNX 0:FOTA
21 ad6 0000a5 ff 01 00 00 LNX 0:ZTEDATA
22 b7b 0000ad ff 01 00 00 LNX 0:ZTEFILE
23 c28 0003d8 ff 01 00 00 LNX 0:RECOVERYFS
============================================================
Section table version: 4


*NEW* NRPG ENPRG for ZTE..

ZTE_NPRG_ENPRG.zip

Found these in MF920V firmware update.
md5 is different from the files in loaders directory.


THIS ISSUE WAS DELETED

THIS ISSUE WAS DELETED

Translate Readme to english

raw dump mdm9x25 badblocks detected

Hello
i’m performing raw dumpe write to mdm9x25 device it detects badblocks then device is unable to start and stays on download mode qualcomm hs-usb qdloader 9008 , is there anyway to fix the badblocks by erasing or any other solution ?

thanks for help

`
qwdirect -p22
-fi -b0 rawdump-Djezzy-MF910+-B03.bin

Write from file rawdump-B01.bin, starter unit 000, the size 1000
Recording mode: raw image without calculation of ЕСС
Data format: 512+16
Block: 0f39 Page: 3f
Block f3a defective — skipping
Block: 0f99 Page: 3f
Block f9a defective — skipping
Block: 0fb9 Page: 3f
Block fba defective — skipping
Block: 0fc9 Page: 3f
Block fca defective — skipping
Block: 0fd9 Page: 3f
Block fda defective — skipping
Block: 0fe9 Page: 3f
Block fea defective — skipping

Block feb defective — skipping
Block: 0ff9 Page: 3f
Block ffa defective — skipping

Block ffb defective — skipping

Block: 1008 Page: 3f

qcommand -p22 -c «c 0b»

—- ответ —
00000000: 7e 0c 14 3a 7e *..: *
`

Использована неинициализированная локальная переменная «cwsize»

qtoolsqrflash.c (253)

FM6BD4G2GA для ENPRG9x45p.bin/NPRG9x45p.bin

Пожалуйста добавьте флешку FM6BD4G2GA.Она есть в загрузчике для 9Х25.

respected sir ! huawei ec315-5 mdn repair

Teacher
i have huawei ec315-5 device i want to repair his esn
qpst tool can reapair esn?
or another metod plz share on our project
i will thanksfull 2 u.

add MSM8996 chipset support

Hi! I’m trying to use qdload with my leEco x829 (Snapdragon 820 MSM8996) and noticed that it’s not listed in chipset list, also calling command ./qdload -p /dev/ttyUSB0 -k MSM8996 gives - Неверный код чипсета error. Same issue with any of listed chipset codes. Am i doing something wrong or this chipset is unsupported for now?

Thank you

Формат файла загрузчика

Добрый день. Не нашёл места где можно было бы задать вопрос по проекту. Я так понимаю что все вопросы писать можно сюда. Извините если ошибся.
Я хотел спросить о формате файлов загрузчиков. В проекте они все (почти) hex. Или BIN. У меня телефон на qualcomm, но к нему в заводской прошивке загрузчик идёт в ELF формате. ARM little indean. Его понимает QPTS. Через него шью когда надо бывает восстановить кирпич. Qtools не принимает такой загрузчик. Да мне его и не про патчить даже.
HEX мне нужно как то перекомпилировать из ELF? Или это вообще разные вещи и нужно искать отдельный загрузчик в hex формате. И ELF никакого отношения к этому не имеет?

И такой вопрос. В телефоне есть какая то проверка на валидность загрузчика? Типа контрольной суммы? Я пробовал свой загрузчик декомпилировать и вносить небольшие изменения. Но телефон после попытки загрузить в него изменённый загрузчик переставал работать и переходил в режим загрузки пока в него не загружался оригинальный файл. В том что изменял корректно и не запорол файл уверен на 78% :)

SM-N97xx SM-N976V QDLoader 9008 Qualcomm Streaming mode?

MDM9207 MSM8909

MDM9215 (SIM7100E)

Здравствуйте, товарищи разработчики.
Спасибо за Ваш труд, набор утилит очень полезный.

Теперь, если позволите, к проблеме.
Имеется модем SIM7100E PCI-E, построенный на базе Qualcomm MDM9215.

  1. Если модем жив-здоров, то его прошивка легко и просто сливается по инструкции уважаемого @vvevvevve . Выглядит это так:
./qdload -p /dev/ttyUSB0 -i loaders/NPRG9x15p.bin

 Найден блок идентификации загрузчика
 
Файл загрузчика: loaders/NPRG9x15p.bin
 Адрес загрузки: 41700000
 Размер файла: 63816
 Загружено: 63816
 Запуск загрузчика...ok
 Версия HELLO-протокола: 3
 Чипсет: MDM9x15
 Базовый адрес NAND-контроллера: 1b400000
 Флеш-память: Elite Semiconductor FM6AD2G1GA, NAND 256MiB 1.8V 8-bit
 Размер сектора: 512 байт
 Размер страницы: 2048 байт (4 секторов)
 Число страниц в блоке: 64
 Размер OOB: 64 байт
 Тип ECC: R-S, 4 бит
 Размер ЕСС: 10 байт
 Размер spare: 5 байт
 Положение маркера дефектных блоков: user+1d1
 Общий размер флеш-памяти = 2048 блоков (256 MB)

./qrflash -p /dev/ttyUSB0 -m
00       0  00000a   ff ff ff 00   STD   0:MIBIB
01       a  00001b   ff ff 00 00   STD   0:SBL2
02      25  00001b   ff ff 00 00   STD   0:RPM
03      40  000053   ff ff ff 00   STD   0:EFS2
04      93  00001f   ff 01 00 00   LNX   0:DSP1
05      b2  000052   ff 01 00 00   LNX   0:DSP3
06     104  000196   ff 01 00 00   LNX   0:DSP2
07     29a  000062   ff ff 00 00   STD   0:APPSBL
08     2fc  000052   ff ff 00 00   STD   0:APPS
09     34e  000203   ff ff ff 00   STD   0:CACHE
10     551  00000b   ff ff ff 00   STD   0:MISC
11     55c  000053   ff ff ff 00   STD   0:RECOVERY
12     5af  00000b   ff ff ff 00   STD   0:FOTA
13     5ba  0000b7   ff ff ff 00   STD   0:RECOVERYFS
14     671  000144   ff ff ff 00   STD   0:SYSTEM
15     7b5  00004b   ff ff ff 00   STD   0:USERDATA

qrflash -p3 -x -b0 -l0 -o rawdump.bin

 Чтение блоков 00000000 - 000007ff
 Формат данных: 512+16
 Блок: 000007ff

Первые 2 команды запускались из-под Linux, но это не суть (кстати, под Linux есть проблемы, но это отдельная тема). Таким образом, патченный NPRG-загрузчик спокойно попадает на модем и выполняет свою работу.

  1. Проблема возникает, когда я пытаюсь прошить модем, находящийся в аварийном Download Mode (SimTech HS-USB QDLoader 9008). Не могу загрузить ENPRG-загрузчик никак. Выглядит это как-то так:
qdload.exe -p9 -k4 -a 2A000000 -i loadersENPRG9x15p.bin

 Файл загрузчика: loadersENPRG9x15p.bin
 Адрес загрузки: 2a000000
 Размер файла: 75776
 Загружено: 75776
 Запуск загрузчика...ok
 Отсылка hello... повторный hello возвратил ошибку!
00000000: 7e 0d 08 00 00 00 55 6e 72 65 63 6f 67 6e 69 7a  *~.....Unrecogniz*
00000010: 65 64 20 66 6c 61 73 68 20 64 65 76 69 63 65 53  *ed flash deviceS*
00000020: b2 7e                                            *.~              *

«Тут — помню, тут — не помню». Там флешку узнает, а тут — не узнает. На всякий случай предупреждаю, что все эксперименты проводятся на здоровом модеме со здоровой флешкой (с ней все хорошо, модем я специально перевожу в аварийный режим загрузки, чтобы научиться спасать его собратьев).

Производитель поставляет собственные загрузчики в составе прошивки, на всякий случай размещаю их тут: http://rgho.st/8pqLC2nqq

Очень надеюсь, что вы сможете чем-то помочь в данной ситуации. Готов оказывать всяческое содействие.

Сохранить статус 9008 после qwdirect

У меня есть модуль 4G MDM9225. После рендера rawdump.bin делаю прошивку qwdirect но модем все равно не ревертируется

Загрузчик 7625

Пожалуйста сделайте патченный загрузчик под этот проц.

Добавить память в ENPRG6695

Возможно ли добавить флеш Hynix_H9DA1GH51HBMBR в этот загрузчик?

error in compile

[email protected]:~/Desktop/qtools-master$ make
gcc -O2 -g -Wno-unused-result -Wunused -c -o qcommand.o qcommand.c
In file included from qcommand.c:1:0:
include.h:38:39: fatal error: readline/readline.h: No such file or directory
compilation terminated.
: recipe for target ‘qcommand.o’ failed
make: *** [qcommand.o] Error 1

Ошибка сегментирования

segfault at 7fffbba9d040 ip 0000564c9dd8b662 sp 00007ffcbf21f540 error 6 in qrflash[564c9dd8b000+5000]

Востановление загрузчика

Добрый день.
Имеются неаколько mini-PCIe карт Sierra Wireless AirPrime MC8090 у которых поврежден загрузчик, находится в режиме Qualcomm HS-USB QDLoader 9008.
Пытаюсь востановить загружчик с помощью команды:
./qdload -p /dev/ttyUSB0 -k 4 -i loaders/NPRG6200_p_1.bin
Но после этого модем вообще перестает определяться
usb 1-3: device descriptor read/64, error -110
Может кто-нибудь помочь с востановлением.
Заранее спасибо.

Hi I have a ZTE MF920v it has MDM9207, how can i backup and restore rom.

Hi, I used ZTE terminal software update framework to update one of my ZTE MF920v, at first it was sucessfully flashed now it is always stuck at 4%. I need to backup rom from my other ZTE MF920v and restore it on my bricked device. Please help.

logical error in convert_cmdbuf

The correct way to escape a command is:

Example

  1. escape the command
  2. apply the hdlc checksum
  3. escape the checksum

Your rotine does only the first one
But it will give error if the checksum contains 7e,7d or 5d.

Regards.
Zibri

Huawei EC5377 Flash

Нужен лоадер для Qualcomm MSM7625A

Здравтвуйте! Я так надругался над своим E5830, что, похоже, он ушел в режим аварийной загрузки PBL. Единтсвенное, на что он реагирует, так это на qdload (начинает моргать индикатор модемного соединения). На прошивки он не реагирует. Разве что, после balong_flash он начинает выдавать это:
~¤¤¤Њo~_
Пожалуйста, помогите найти загрузчик и адрес загрузки.

ENPRG9x00 with NAND KFM1GN6Q2D-VEB.

Does not work with NAND KFM1GN6Q2D-VEB. Can help to understand what’s the reason.
Thank advance

Очень нужен дамп PBL

Коллеги, здравствуйте.
Для исследования очень нужен дамп PBL от MSM8953 или чего-нибудь близкого. Выложите куда-нибудь, пожалуйста.

Recommend Projects

  • React photo
    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo
    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo
    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo
    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo
    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo
    Laravel

    A PHP framework for web artisans

  • D3 photo
    D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Visualization

    Some thing interesting about visualization, use data art

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo
    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo
    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo
    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo
    Alibaba

    Alibaba Open Source for everyone

  • D3 photo
    D3

    Data-Driven Documents codes.

  • Tencent photo
    Tencent

    China tencent open source team.

Возможно, вам также будет интересно:

  • Отсутствуют свободные талоны идентификатор ошибки 39
  • Отчет об ошибке в автокаде
  • Отчет об ошибке в word
  • Отсутствует файл msvcp120 dll как исправить ошибку msvcp120
  • Отчет об ошибке xiaomi убрать как телефон xiaomi

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии