usb serial driver and ATE1 E0 - linux-device-driver
I am writing an USB serial adapter device driver. The kernel is 3.17.4. The driver works fine except that the kernel opens the adapter twice and writes some commands when the adapter is plugged in. Here are dump_stack() for the driver's open() and write().
1st open() and write(). The kernel writes "ATE1 E0" three times.
<4>[19964.897631] Call Trace:
<4>[19964.897642] [<ffffffff8173f929>] dump_stack+0x45/0x56
<4>[19964.897649] [<ffffffffa04aa1ef>] c0087_open+0x2f/0x160 [usb_com_1p_driver]
<4>[19964.897654] [<ffffffff81744bb2>] ? down_write+0x12/0x40
<4>[19964.897661] [<ffffffff81566f75>] serial_port_activate+0x65/0x90
<4>[19964.897667] [<ffffffff8145e864>] ? tty_port_tty_set+0x64/0xa0
<4>[19964.897671] [<ffffffff8145edf9>] tty_port_open+0x89/0xe0
<4>[19964.897675] [<ffffffff81567bf3>] serial_open+0x33/0x70
<4>[19964.897679] [<ffffffff814560eb>] tty_open+0x17b/0x700
<4>[19964.897684] [<ffffffff8149cf72>] ? kobj_lookup+0x112/0x170
<4>[19964.897690] [<ffffffff81211017>] chrdev_open+0xb7/0x1a0
<4>[19964.897694] [<ffffffff81210f60>] ? cdev_put+0x30/0x30
<4>[19964.897698] [<ffffffff81209832>] do_dentry_open+0x1d2/0x320
<4>[19964.897702] [<ffffffff81209b61>] finish_open+0x31/0x50
<4>[19964.897706] [<ffffffff8121cd7c>] do_last+0xc0c/0x11d0
<4>[19964.897710] [<ffffffff81217bd8>] ? inode_permission+0x18/0x50
<4>[19964.897713] [<ffffffff812180e9>] ? link_path_walk+0x99/0xee0
<4>[19964.897717] [<ffffffff8121d40b>] path_openat+0xcb/0x6d0
<4>[19964.897722] [<ffffffff8121e2ad>] do_filp_open+0x4d/0xc0
<4>[19964.897726] [<ffffffff812178db>] ? getname_flags+0x4b/0x180
<4>[19964.897731] [<ffffffff8122b01e>] ? __alloc_fd+0x7e/0x120
<4>[19964.897735] [<ffffffff8120b61b>] do_sys_open+0x13b/0x250
<4>[19964.897738] [<ffffffff8120b74e>] SyS_open+0x1e/0x20
<4>[19964.897743] [<ffffffff81746ae9>] system_call_fastpath+0x16/0x1b
<4>[19965.026562] [<ffffffff8173f929>] dump_stack+0x45/0x56
<4>[19965.026569] [<ffffffffa04aa094>] c0087_write+0x24/0x100 [usb_com_1p_driver]
<4>[19965.026575] [<ffffffff81567890>] serial_write+0x50/0xc0
<4>[19965.026581] [<ffffffff814584e5>] n_tty_write+0x495/0x560
<4>[19965.026586] [<ffffffff810c2850>] ? wake_up_state+0x20/0x20
<4>[19965.026590] [<ffffffff81454a04>] tty_write+0x174/0x300
<4>[19965.026594] [<ffffffff81458050>] ? process_echoes+0x70/0x70
<4>[19965.026599] [<ffffffff8120c597>] vfs_write+0xb7/0x1f0
<4>[19965.026603] [<ffffffff8120d1c5>] SyS_write+0x55/0xd0
<4>[19965.026608] [<ffffffff81746ae9>] system_call_fastpath+0x16/0x1b
2nd open() and write(). The kernel writes "7e 0 78 f0 7e" twice.
<4>[19977.011908] Call Trace:
<4>[19977.011918] [<ffffffff8173f929>] dump_stack+0x45/0x56
<4>[19977.011925] [<ffffffffa04aa1ef>] c0087_open+0x2f/0x160 [usb_com_1p_driver]
<4>[19977.011930] [<ffffffff81744bb2>] ? down_write+0x12/0x40
<4>[19977.011936] [<ffffffff81566f75>] serial_port_activate+0x65/0x90
<4>[19977.011941] [<ffffffff8145e864>] ? tty_port_tty_set+0x64/0xa0
<4>[19977.011945] [<ffffffff8145edf9>] tty_port_open+0x89/0xe0
<4>[19977.011949] [<ffffffff81567bf3>] serial_open+0x33/0x70
<4>[19977.011952] [<ffffffff814560eb>] tty_open+0x17b/0x700
<4>[19977.011958] [<ffffffff81211017>] chrdev_open+0xb7/0x1a0
<4>[19977.011961] [<ffffffff81210f60>] ? cdev_put+0x30/0x30
<4>[19977.011965] [<ffffffff81209832>] do_dentry_open+0x1d2/0x320
<4>[19977.011968] [<ffffffff81209b61>] finish_open+0x31/0x50
<4>[19977.011972] [<ffffffff8121cd7c>] do_last+0xc0c/0x11d0
<4>[19977.011975] [<ffffffff81217bd8>] ? inode_permission+0x18/0x50
<4>[19977.011979] [<ffffffff812180e9>] ? link_path_walk+0x99/0xee0
<4>[19977.011983] [<ffffffff8121d40b>] path_openat+0xcb/0x6d0
<4>[19977.011986] [<ffffffff81455de0>] ? tty_release+0x4c0/0x650
<4>[19977.011990] [<ffffffff8121e2ad>] do_filp_open+0x4d/0xc0
<4>[19977.011993] [<ffffffff812178db>] ? getname_flags+0x4b/0x180
<4>[19977.011998] [<ffffffff8122b01e>] ? __alloc_fd+0x7e/0x120
<4>[19977.012002] [<ffffffff8120b61b>] do_sys_open+0x13b/0x250
<4>[19977.012025] [<ffffffff8120b74e>] SyS_open+0x1e/0x20
<4>[19977.012031] [<ffffffff81746ae9>] system_call_fastpath+0x16/0x1b
<4>[19977.026758] [<ffffffff8173f929>] dump_stack+0x45/0x56
<4>[19977.026766] [<ffffffffa04aa094>] c0087_write+0x24/0x100 [usb_com_1p_driver]
<4>[19977.026772] [<ffffffff81567890>] serial_write+0x50/0xc0
<4>[19977.026777] [<ffffffff814584e5>] n_tty_write+0x495/0x560
<4>[19977.026782] [<ffffffff810c2850>] ? wake_up_state+0x20/0x20
<4>[19977.026786] [<ffffffff81454a04>] tty_write+0x174/0x300
<4>[19977.026789] [<ffffffff81458050>] ? process_echoes+0x70/0x70
<4>[19977.026794] [<ffffffff8120c597>] vfs_write+0xb7/0x1f0
<4>[19977.026797] [<ffffffff8120d1c5>] SyS_write+0x55/0xd0
<4>[19977.026802] [<ffffffff81746ae9>] system_call_fastpath+0x16/0x1b
Anybody knows what happens here?
Thanks!
It is the ModemManager that sends those commands. After stopping ModemManager there are no more commands to the adapter.
On Ubuntu the following command solves the problem:
sudo stop modemmanager
You can the start it again by:
sudo start modemmanager
Related
Flutter ZEBRA mobile printer ZQ521 stuck when print multiple image(ZPL)
Im developing a Flutter app that need to print selected image with mobile printer (ZEBRA ZQ521). Generated ZPL string are works on http://labelary.com/viewer.html. But mobile printer (ZQ521) totally stuck when printing (sometimes goes smooth). error : Caused by: java.io.IOException: Bluetooth LE Write timed out is it my ZPL string are too long? please help. my zpl string: ^XA ~DGimg5.GRF,5126,22, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE FFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFFFFFFFFFFE FFFFFFFFFFFFFFFFFFFFCFC78607FFFFFFFFFFFFFFFE FFFFFFFFFFFFFFFFFFFF0FFCB303FFFFFFFFFFFFFFFE FFFFFFFFFFFFFFFFFFFF3FFC33807FFFFFFFFFFFFFFE FFFFFFFFFFFFFFFFFFFE06338C803FFFFFC7FFFFFFFE FFFFFFFFFFFFFFFFFFFE7FF3CFE01FFFFFE1FFFFFFFE FFFFFFFFFFFFFFFFFFFC380FFFC01FFFFFF1FFFFFFFE FFFFFFFFFFFFFFFFFFFCF338FFE00FFFFFF87FFFFFFE FFFFFFFFFFFFFFFFFFFFFBF03FFFFFFFFFFC3FFFFFFE FFFFFFFFFFFFFFFFFFC1F1F03FFFFFFFFFFC1FFFFFFE FFFFFFFFFFFFFFFFFC000000187C19FFFFF80FFFFFFE FFFFFFFFFFFFFFC000000000000000001CFFFFFFFFFE FFFFFFFFFFFFFEC00000000000000000000FFFFFFFFE FFFFFFFFFFFFFF80000000000000000000007FFFFFFE FFFFFFFFFFFFE0000000000000000000000003FFFFFE FFFFFFFFFFFFF80000000000000000000000007FFFFE FFFFFFFFFFFFFFF000000000000000000000007FFFFE FFFFFFFFFFFFFFE000000000000000000000003FFFFE FFFFFFFFFFFFFFC000000000000000000000003FFFFE FFFFFFFFFFFFFF8000000000000000000000003FFFFE FFFFFFFFFFFFF80000000000000000000000007FFFFE FFFFFFFFFFFFFFFF00000000000000000000007FFFFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000007FFFFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50007FFFFE FFFFFFFFFFFFFFFF8100000000000FE7FFFFF07FFFFE FFFFFFFFFFFF80000000000000000400000407FFFFFE FFFFFFFFFFC000040300000000000C00000000FFFFFE FFFFFFFFFFE1000006000000000000000000007FFFFE FFFFFFFFFFC0000404400000000008000000007FFFFE FFFFFFFFFFC0000000D80000000000000000003FFFFE FFFFFFFFFFC0000000F80000000000000000003FFFFE FFFFFFFFFFC91000007A0000000000000000003FFFFE FFFFFFFFFFC91000009E0000000000000000003FFFFE FFFFFFFFFFCF0000009E0000000000000000003FFFFE FFFFFFFFFFCF000001B60000000000000000001FFFFE FFFFFFFFFFCF000000970000080001000000001FFFFE FFFFFFFFFFEF2000029F0000080001000000001FFFFE FFFFFFFFFFFF2000039F0000080001001000001FFFFE FFFFFFFFFFFEA00003530000080001003000001FFFFE FFFFFFFFFFFF2000061B8000080009001800001FFFFE FFFFFFFFFFEF2000060BA000080008001800001FFFFE FFFFFFFFFFFF200006038000080008001800001FFFFE FFFFFFFFFFFFA00002038000080008000000001FFFFE FFFFFFFFFFFFE00000038000080005000000001FFFFE FFFFFFFFFFFFE00000438000080005000000001FFFFE FFFFFFFFFFFFE00000618040280025000000001FFFFE FFFFFFFFFFFFE0000047B040280025C00000001FFFFE FFFFFFFFFFFFE40001251040280025000000001FFFFE FFFFFFFFFFFFE40001A51040280025000000001FFFFE FFFFFFFFFFFFE40001A53040388024000000003FFFFE FFFFFFFFFFFFE40005A41040388004000000003FFFFE FFFFFFFFFFFFF00007A41040388004000000003FFFFE FFFFFFFFFFFFF00007BD1040348004600000003FFFFE FFFFFFFFFFFFFE0007BDBB4064801760000001FFFFFE FFFFFFFFFFFFFF900735BFC0648ED778000083FFFFFE FFFFFFFFFFFFF7FFFFFFFFC06880877FFEFFDFFFFFFE FFFFFFFFFFFFFFF803FFFFFFFFFFFFFFFFFFFFFFFFFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFE FFFFF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE07FFFFE FFFFFFE3FFFFFFFFFFFFFFFFFFFFFFFFFFFD007FFFFE FFFFFC7FFFFFFF83EFFFFFFFFFFFFFFFD911017FFFFE FFF017FFFFFFFF8007FFFFFE75FFFFFFC201007FFFFE FFFFFFFFFFFFFF0003FFFF581429FFFFC200007FFFFE FFFFFFFFFFFFFF8003F87700102BFFFFC200007FFFFE FFFFFFFFFFFFFFD803F033001021FFFEC20200FFFFFE FFFFFFFFFFCFFF8003FF3B001001FFFEC20700FFFFFE FFFFFFFFF80FFFD803FF3F10100FFFFEC20300FFFFFE FFFFFFFF000FFFFF03F89F101001FFFF431100FFFFFE FFFFFFF00007FFF803F89E50300BFFFF63B900FFFFFE FFFFFC000007FFFD63F91F10210FFFFDD3BB01FFFFFE FFFF00000007FFFFEBF81E00210BFFFDD3FF05FFFFFE FFE000000007FFFFEBF89E00210FFFFFD3FE05FFFFFE F00000000007FFFFE3FD9E00210FFFFFFFFE0DFFFFFE 000000000007FFFEE7FF9E50210FFFFFFFFE0BFFFFFE 000000000007FFFFEFFF9E50210FFFFFFFFE0BFFFFFE 000000000007FFFFF7FF9E50210FFFFFA7FF1BFFFFFE 000000000007FFFFF7DF9E40210FFFFFB7FF1BFFFFFE 000000000007FFFFEBFDAC20200FFFFFFBFE57FFFFFE 000000000007FFFFFBFDEC22200FFFFFFBFF7FFFFFFE 000000000007FFFFFFF5FC22200FFFFFFFFFFFFFFFFE 000000000007FFFFFFF5FC62201FFFFFFFFFFFFFFFFE 000000000007FFFFFFF5FC62201FFFFFFFFEFFFFFFFE 000000000003FFFFFFFDFC0A205FFFFFFFFEFFFFFFFE 000000000003FFFFFFFDFC4A205FFFFFFFFFFFFFFFFE 000000000003FFFFFFFDFDE2207FFFFFFFFFFFFFFFFE 000000000007FFFFFFFFEEDA606FFFFFDFFDDFFFFFFE 000000000003FFFFFFFFFEDA603FFFFFFFFFFFFFFFFE 000000000003FFFFFFFFFFDA603FFFFFFFFFFFFFFFFE 000000000003FFFFFFFFFFDA603FFFFFFFFFFFFFFFFE 000000000003FFFFFFFFDFDA603FFFFFBFFFFFFFFFFE 000000000003FFFFFFFFFEDA629FFFFFFFFFFFFFFFFE 000000000003FFFFFFFFFEDA46DFFFFFFFF7FFFFFFFE 000000000003FFFFFFFFFFFA67DFFFFFFFF7FFFFFFFE 000000000003FFFFFFFFFFFC57FFFFFFFFFFFFFFFFFE 000000000003FFFFFFFFFFFED7FFFFFFFFFFFFFFFFFE 000000000003FFFFFFFFFFFFD3FFFFFFFFEFFFFFFFFE 000000000001FFFFFFFFFFFFD3FFFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFFD77FFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFE5F7FFFFFFFBFFFFFFFFE 000000000001FFFFFFFFFFFE5DFFFFFFFFBFFFFFFFFE 000000000001FFFFFFFFFFFFC9FFFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFD5FFFFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFFCFFFFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFFCFFFFFFFFEFFFFFFFFFE 000000000001FFFFFFFFFFFFCF7FFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFE 000000000001FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFE 000000000000FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFE 000000000000FFFFFFFFFFFFDBFFFFFFFFF07FFFFFFE 000000000000FFFFFFFFFFFFFFFFFFFFFFF007FFFFFE 000000000000FFFFFFFFFFFFFFFFFFFFFFE0003FFFFE 000000000000FFFFFFFFFFFFFFFFFFFFFF800003FFFE 000000000000FFFFFFFFFFFFFFFFFFFFFF8000003FFE 000000000000FFFFFFFFFFFFFFFFFFFFFF00000003FE 000000000000FFFFFFFFFFFFFFFFFFFFFE00000003FE 000000000000FFFFFFFFFFFFFFFFFFFFF800000003FE 000000000000FFFFFFFFFFFFFFFFFFFFE400000003FE 000000000000FFFFFFFFFFFFFFFFFFFFE000000003FE 000000000000FFFFFFFFFFFFFFFFFFFFC000000007FE 000000000000FFFFFFFFFFFFFFFFFFFFC000000007FE 000000000000FFFFFFFFFFFFFFFFFFFF8000000007FE 000000000000FFFFFFFFFFFFFFFFFFFF0000000027FE 000000000000FFFFFFFFFFFFFFFFFFFE0000000027FE 000000000000FFFFFFFFFFFFFFFFFFF60000000067FE 0000000000007F07FFFFFFFFFFFFFFFC00000000FFFE 0000000000007F03FFFFFFFFFFFFFFF0000000009FFE 0000000000007E00FE7EFFFFFFFFFFE0000000019FFE 0000000000007C00387F7FFFFFFFFF0000000000BFFE 0000000000007C00001FEFFFFFFFFE00000000027FFE 0000000000007C000003FFFFFFFFF000000000067FFE 0000000000007C000000FFFFFFFF8000000000007FFE 000000000000780000001FFFFFF8000000000000FFFE 0000000000007000000007FFFE20000000000002FFFE 0000000000007200000000FE0000000000000003FFFE 00000000000060000000043F0000000000000003FFFE 000000000001F20000001C0FE000000000000007FFFE 000000000001CF0000007081FC00000000000007FFFE 000000000006BF600000E0007F0000000000000FFFFE 000000000006EFF0000300000FE000000000001FFFFE 0000000000017FFC0006000003F800000000001FFFFE 000000000003FFFF00180000087E00000000003FFFFE 0000000000017FFB80600000000F80000000003FFFFE 0000000000005FFA00C000000007F0000000007FFFFE 0000000000003FE8020000000000F8000000007FFFFE 0000000000000FF00C00000000003E00000000FFFFFE 00000000000003C01000000000000F80000000FFFFFE 000000000300000060000000000003E0000003FFFFFE 0000000003000001C1010000000000F8000013FFBFFE 0000000006000003000000000000007C000003FFFFFE 000000001800000E000000000000001E000007FFFFFE 0000000030000038000000000000000F80000FFFFFFE 00000000E00000600000000000000003C0000FFFFFFE 00000001803801C00000000000000001A0001FFFFFFE 0000000600FF0700000000000000000060003FFFFFFE 0000000EFFEFFC00000000000000000030003FFFFFFE 00000031FFFFF00000000000000000001C007FFFFFFE 000000C09FFFFC0000000000000000000E007FEFFFFE 000003FFFFFFFF8000000000000000000700FFFFFFFC 000007FFFFFFFFE000000000000000000781FFFFFFFC 00001CFFFFFFFFF0000000000000000003C1FFFFFFFE 000031FFFFFFFFFC000000000000000003C3FFFFFFFE 0000E7FFFFFFFFFE000000000000000001E3FFFFFFFC 00038FFFFFFFFFFF000000000000000008F7FFFFFFFC 000E1FFFFFFFFFFFC00000000000000005F7FFFFFFFE 00183FFFFFFFFFFFE000000000000000007FFEFFFFFE 00707FFFFFFFFFF7F800000000000000007FFFFFFFFE 01C07FFFFFFFFFE7F800000000000000007FF5FBFFFE 0700FFFFFFFFFFE7FE00000000000000007FF0FFFFFE 0C00FFFFFFFFFFF9FF00000000000000007FE83FFFFE 30007FFFFFFFFF00FF00000000000000007FE05FFFFE E0007FFFFFFFFF40FF8000000000000000FFD07FFFF6 C0007FFFFFFFFF01FFC000000000000000FFE07FFFF6 80003FFFFFFFFFE27FE000000000000000FFC0FFFFEE 80001FFFFFFFFC383FE006000000000001FFC13FFFEE 00001FFFFFFFFC393FF000000000000001FFE017FFDE 00008FFFFFFFFFF3BFF800000000000003FFFC06FFDE 00000FFFFFFFFFFFFFF800000000000007FFFE06FFDE 000003FFFFFFFFFFFFFC0000000000000FFFFE0DFFDE 000000FFFFFFCFFFFFFC0000000000000FFFFF0DFFBE 0000000FFFFFFFFFFFFC0000000000001FDFFFCDFFBE 00000203FFFFE7FFFFFF8040000000003F9FFFFBFFBE 00000000FFFFF7FFFFFF00C0000000003F1FFFFBFFBE 000000003FFFFFFFFFFE000003000000FF1FFFF3FF7E 000000001FFFFFFFFFFE000000000000FE1FFFF7FF7E 000000000FFFFFFFFFFE000000000000FC1FFFE7FF68 0000000003FFFFFFFFFE000000000001FC1FFFEFFF00 0000000001FFFFFFFFFC000000800001F81FFFCFFE00 0000010001FFFFFFFFFC000401800003F01FFFCFFE00 0000000100FFFFFFFFFC000000000003E03FFF9FFE00 00000000007FFFFFFFF800000000000FE03FFF9FFE00 00000000003FFFFFFFF800000000003FC07FFF9FFC00 00000000001FFFFFFFF800000000003FC05FFF3FFC00 00000000001FFFFFFFE000000000007FC09FFF3FFC00 00000000000FFFFFFFE000000000007FE69FFF7FFC00 000000100007FFFFFFC000000000007FE3BFFE7FF800 800000100007FFFFFF000000000000FFE93FFE7FF800 000000000003FFFFFE000000400000FFF07FFCFFF800 000000000000FFFFF8000000000001FFE8FFFCFFF800 0000000000047FFFE0000000000003FFCF7FF8FFF000 0000000000001FFF80000000000003FFDFFFF9FFF000 000000000000016000000000100001FFDFFFFBFFF000 000000000000004000000000100001FFBFFFF3FFF000 000000000000000010000000000003FBFFFFF3FFE000 000000000000000000000000000003FB7FFFE7FFE000 000000000000000000000000000007F0FFFFE7FFE000 00000000000000000000000000000780FFFFC7FFE000 00000000000000000000000000002F80FFFFCFFFC000 0000000002000000000000000000FF00DFFFCFFFC000 0000000000000000000200000000FF00C7FF9FFFC000 0000000000000000000000000000FE0101FF9FFF8000 0008000040000000000000000001FC0100FF3FFF8000 0000000000000000000000000001FC03007F3FFF8000 000000000000C000000000000001F802007E3FFF8000 0000000000000000010000000001F006007E3FFF0000 0000000000000000010000000001F00400FC7FFF0000 0000000000000000000000000001E00C00FCFFFF0000 000000000000000000000000003BE01800FCFFFF0000 700000000000000000000000007FC01800F8FFFE0000 700000000000000000000000007FC01000F9FFFE0000 600000000000000000000000007F80200071FFFE0000 00000000000000000000000600FFC0600079FFFC0000 00000000000000000000000701FFF040007BFFFC0000 00000000000000000003000303FFF88000FBFFFC0000 00010000000000000003000007FFFE8000FBFFF80000 0000000000000000000100101FFFFF8001DB9FF80000 0000010000000000000118031FFFFF8001FB8FF80000 0000000000000000000018073FFFFFE003FB83F00000 000000200000000000000004BFFFFFF803BB03F00000 0000000000000000000000887FFFFFFC07FB80F00000 ^FO150,150^XGR:img5.GRF,1,1^FS ^XZ
BTLE on zebra printers is meant to be used just to configure the printer, not to print labels, so it has a low timeout and a slow transmission speed. Not a Flutter expert at all, but all the mobile printers should have the BT Classic, which should allow you to print labels, so you might check if you can switch to that on the printing call you're doing from your app. You can also check what BT type the printer is set on by sending the following command ! U1 getvar "bluetooth.le.controller_mode" and you can set it to use Classic BT sending this command ! U1 setvar "bluetooth.le.controller_mode" "classic" (Note that all these commands need a new line after the command itself). Have a look here to see how to send this command
Use GPIO as chip select for SPI ACPI overlay
I want to use a GPIO pin as a new chip select for SPI on an Up Squared board. The Up squared uses an Intel Pentium N4200, so it's a x86 machine. I have managed to this on a Raspberry Pi by using Device Tree Overlays but as this is an x86 machine I may have to use ACPI overlays. The Up squared has two spi available and they propose here to use ACPI overlays, this repo, which actually works very well. Below one of the asl files they use /* * This ASL can be used to declare a spidev device on SPI0 CS0 */ DefinitionBlock ("", "SSDT", 5, "INTEL", "SPIDEV0", 1) { External (_SB_.PCI0.SPI1, DeviceObj) Scope (\_SB.PCI0.SPI1) { Device (TP0) { Name (_HID, "SPT0001") Name (_DDN, "SPI test device connected to CS0") Name (_CRS, ResourceTemplate () { SpiSerialBus ( 0, // Chip select PolarityLow, // Chip select is active low FourWireMode, // Full duplex 8, // Bits per word is 8 (byte) ControllerInitiated, // Don't care 1000000, // 10 MHz ClockPolarityLow, // SPI mode 0 ClockPhaseFirst, // SPI mode 0 "\\_SB.PCI0.SPI1", // SPI host controller 0 // Must be 0 ) }) } } } I compiled this file using $ sudo iasl spidev1.0.asl > /dev/null $ sudo mv spidev1.0.asl /lib/firmware/acpi-upgrades $ sudo update-initramfs -u -k all Then I reboot an I can see a device and communicate through it. up#up:~$ ls /dev/spi* /dev/spidev1.0 Thus, I decided to write my own overlay based on themeta-acpi samples from intel and I wrote this: /* * This ASL can be used to declare a spidev device on SPI0 CS2 */ DefinitionBlock ("", "SSDT", 5, "INTEL", "SPIDEV2", 1) { External (_SB_.PCI0.SPI1, DeviceObj) External (_SB_.PCI0.GIP0.GPO, DeviceObj) Scope (\_SB.PCI0.SPI1) { Name (_CRS, ResourceTemplate () { GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly, "\\_SB.PCI0.GIP0.GPO", 0) { 22 // pin 22 is BCM25 or 402 in linux } }) Name (_DSD, Package() { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () { "compatible", "spidev" }, // not sure if this is needed Package () { "cs-gpios", Package () { 0, 0, ^SPI1, 0, 0, 0, // index 0 in _CRS -> pin 22 } }, } }) Device (TP2) { Name (_HID, "SPT0001") Name (_DDN, "SPI test device connected to CS2") Name (_CRS, ResourceTemplate () { SpiSerialBus ( 2, // Chip select PolarityLow, // Chip select is active low FourWireMode, // Full duplex 8, // Bits per word is 8 (byte) ControllerInitiated, // Don't care 1000000, // 10 MHz ClockPolarityLow, // SPI mode 0 ClockPhaseFirst, // SPI mode 0 "\\_SB.PCI0.SPI1", // SPI host controller 0 // Must be 0 ) }) } } } But I cannot see the new device. What am I missing? Edit: I have modified the code with a code which actually worked. I can see now a device on /dev/spidev1.2. However, the CS on pin 22 is low all the time which shouldn't be the case. is the number of the pin correct? I'm using pin numbering from here Edit 2: Here is the output of my kernel version Linux up 5.4.65-rt38+ #1 SMP PREEMPT_RT Mon Feb 28 13:42:31 CET 2022 x86_64 x86_64 x86_64 GNU/Linux I compiled this up linux repository with the RT patch for the right kernel version. I also installed the upboard-extras package and I'm actually able to communicate through spi for devices /dev/spidev1.0 and /dev/spidev1.1. So I think I have configured the up squared correctly. There is nongpio file under /sys/class/gpio up#up:~/aru$ ls /sys/class/gpio export gpiochip0 gpiochip267 gpiochip310 gpiochip357 gpiochip434 unexport I can set the GPIO to 1 or 0 and I can see the output on a multimeter, so I think I have right permissions for GPIO. Edit 3: Please find in this link the .dat result from acpidump -o up2-tables.dat
I assume that you are using this board. To be able to use I/O pins(i2c, spi etc.), you need to enable them firstly. Easy way to check you already enabled them or not is that typing in terminal: uname -a Output of this will be look like: Linux upxtreme-UP-WHL01 5.4.0-1-generic #2~upboard2-Ubuntu SMP Thu Jul 25 13:35:27 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux In here #2~upboard2-Ubuntu part can be changed accordingto your board type. However if you don't see a similar result, then you didn't configure your board yet. Otherway to check it, go to folder: /sys/class/gpio and check the ngpio file. Inside it, there should be written 28. To use any I/O pins(i2c, spi etc.), you don't need to change anything on BIOS side, because its coming to you defaultly enabled. Please check the up-wiki page, and update your board kernel after linux installation. Then your I/O configurations will be enabled. Up-wiki main page.
Problem with midi setup on Raspberry Pi with midi board for RPi
I bought this one from osa electronics: https://www.osaelectronics.com/product/midi-board-for-raspberry-pi/ I followed the instructions here on how to set it up: https://www.osaelectronics.com/learn/setting-up-raspberry-pi-for-midi/ After following the setup and running this in command line: python import mido mido.get_output_names() It outputs this which seems to be correct: ['Midi Through:Midi Through Port-0 14:0', 'f_midi:f_midi 24:0'] as well as when I run this from command line: amidi -l outputs this: Dir Device Name IO hw:2,0 f_midi However when I run some test applications from their webapge I get no input or output. like this one: import mido from mido import MidiFile from mido import MetaMessage port = mido.open_output('f_midi') mid = MidiFile('mymidifile.mid') while True: for msg in MidiFile('mymidifile.mid').play(): port.send(msg) or from this one (I tried to print the msg but it wont print it even. So doesnt seem to step into the while loop but no errormessages) import mido import pigpio from numpy import interp pi1 = pigpio.pi() port = mido.open_input('f_midi') # open USB port while True: try: # This filters out all non-note data for msg in port.iter_pending(): # if there is a message pending print(msg) if(msg.type == 'note_on'): # if it is Note On message out = interp(msg.velocity, [0, 127], [0, 255]) #scale velocity from 0-127 to 0-255 # filter the data by note number if(msg.note == 53): pi1.set_PWM_dutycycle(2, out) elif(msg.note == 55): pi1.set_PWM_dutycycle(3, out) elif(msg.note == 57): pi1.set_PWM_dutycycle(4, out) else: # if the message is not Note On (e.g. Note Off) if(msg.note == 53): pi1.set_PWM_dutycycle(2, 0) elif(msg.note == 55): pi1.set_PWM_dutycycle(3, 0) elif(msg.note == 57): pi1.set_PWM_dutycycle(4, 0) except AttributeError as error: print("Error excepted") pass I noticed there is some problems with pigpio daemon After I have been downloading and installed from this page: http://abyz.me.uk/rpi/pigpio/download.html And then try to start the daemon with: sudo pigpiod I get this errormessage: bind to port 8888 failed (Address already in use) Can't initialise pigpio library However I have also been running through with this in command line: aplaymidi -p f_midi myMidiTune.mid No errormessage but no midioutput to my digital piano ... How can I debug this?
An error in my code to be a simple ftp
I met an error when running codes at the bottom. It's like a simple ftp. I use python2.6.6 and CentOS release 6.8 In most linux server, it gets right results like this:(I'm very sorry that I have just sign up and couldn't ) Clinet: [root#Test ftp]# python client.py path:put|/home/aaa.txt Server: [root#Test ftp]# python server.py connected... pre_data:put|aaa.txt|4 cmd: put file_name: aaa.txt file_size: 4 upload successed. But I get errors in some server(such as my own VM in my PC). I have done lots of tests(python2.6/python2.7, Centos6.5/Centos6.7) and found this error is not because them. Here is the error imformation: [root#Lewis-VM ftp]# python server.py connected... pre_data:put|aaa.txt|7sdfsdf ###Here gets the wrong result, "sdfsdf" is the content of /home/aaa.txt and it shouldn't be sent here to 'file_size' and so it cause the "ValueError" below cmd: put file_name: aaa.txt file_size: 7sdfsdf ---------------------------------------- Exception happened during processing of request from ('127.0.0.1', 10699) Traceback (most recent call last): File "/usr/lib64/python2.6/SocketServer.py", line 570, in process_request_thread self.finish_request(request, client_address) File "/usr/lib64/python2.6/SocketServer.py", line 332, in finish_request self.RequestHandlerClass(request, client_address, self) File "/usr/lib64/python2.6/SocketServer.py", line 627, in __init__ self.handle() File "server.py", line 30, in handle if int(file_size)>recv_size: ValueError: invalid literal for int() with base 10: '7sdfsdf\n' What's more, I found that if I insert a time.sleep(1) between sk.send(cmd+"|"+file_name+'|'+str(file_size)) and sk.send(data) in client.py, the error will disappear. I have said that I did tests in different system and python versions and the error is not because them. So I guess that is it because of some system configs? I have check about socket.send() and socket.recv() in python.org but fount nothing helpful. So could somebody help me to explain why this happend? The code are here: #!/usr/bin/env python #coding:utf-8 ################ #This is server# ################ import SocketServer import os class MyServer(SocketServer.BaseRequestHandler): def handle(self): base_path = '/home/ftp/file' conn = self.request print 'connected...' while True: #####receive pre_data: we should get data like 'put|/home/aaa|7' pre_data = conn.recv(1024) print 'pre_data:' + pre_data cmd,file_name,file_size = pre_data.split('|') print 'cmd: ' + cmd print 'file_name: '+ file_name print 'file_size: '+ file_size recv_size = 0 file_dir = os.path.join(base_path,file_name) f = file(file_dir,'wb') Flag = True ####receive 1024bytes each time while Flag: if int(file_size)>recv_size: data = conn.recv(1024) recv_size+=len(data) else: recv_size = 0 Flag = False continue f.write(data) print 'upload successed.' f.close() instance = SocketServer.ThreadingTCPServer(('127.0.0.1',9999),MyServer) instance.serve_forever() #!/usr/bin/env python #coding:utf-8 ################ #This is client# ################ import socket import sys import os ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.connect(ip_port) while True: input = raw_input('path:') #####we should input like 'put|/home/aaa.txt' cmd,path = input.split('|') file_name = os.path.basename(path) file_size=os.stat(path).st_size sk.send(cmd+"|"+file_name+'|'+str(file_size)) send_size = 0 f= file(path,'rb') Flag = True #####read 1024 bytes and send it to server each time while Flag: if send_size + 1024 >file_size: data = f.read(file_size-send_size) Flag = False else: data = f.read(1024) send_size+=1024 sk.send(data) f.close() sk.close()
The TCP is a stream of data. That is the problem. TCP do not need to keep message boundaries. So when a client calls something like connection.send("0123456789") connection.send("ABCDEFGHIJ") then a naive server like while True; data = conn.recv(1024) print data + "_" may print any of: 0123456789_ABCDEFGHIJ_ 0123456789ABCDEFGHIJ_ 0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F_G_H_I_J_ The server has no chance to recognize how many sends client called because the TCP stack at client side just inserted data to a stream and the server must be able to process the data received in different number of buffers than the client used. Your server must contain a logic to separate the header and the data. All of application protocols based on TCP use a mechanism to identify application level boundaries. For example HTTP separates headers and body by an empty line and it informs about the body length in a separate header. Your program works correctly when server receives a header with the command, name and size in a separate buffer it it fails when client is fast enough and push the data into stream quickly and the server reads header and data in one chunk.
Erlang and PostgreSQL
I try to execute simple PostgreSQL query with erlang and epgsql. I do: {ok, C} = pgsql:connect("localhost", "shk", "qwerty", [{database, "mydb"}]). >> {ok,<0.34.0>} Then: {ok, Cols, Rows} = pgsql:squery(C, "select * from users"). But i got error: =ERROR REPORT==== 27-Apr-2012::17:58:23 === ** State machine <0.34.0> terminating ** Last message in was {'EXIT',<0.32.0>, {{badmatch, {error, {error,'ð\236ð¨ð\230ð\221ð\232ð\220',<<"42P01">>, <<208,190,209,130,208,189,208,190,209,136,208,181, 208,189,208,184,208,181,32,34,109,121,100,98,34, 32,208,189,208,181,32,209,129,209,131,209,137, 208,181,209,129,209,130,208,178,209,131,208,181, 209,130>>, [{position,<<"15">>}]}}}, [{erl_eval,expr,3}]}} ** When State == ready ** Data == {state,undefined,<0.35.0>,5000, [{<<"application_name">>,<<>>}, {<<"client_encoding">>,<<"UTF8">>}, {<<"DateStyle">>,<<"ISO, DMY">>}, {<<"integer_datetimes">>,<<"on">>}, {<<"IntervalStyle">>,<<"postgres">>}, {<<"is_superuser">>,<<"off">>}, {<<"server_encoding">>,<<"UTF8">>}, {<<"server_version">>,<<"9.0.7">>}, {<<"session_authorization">>,<<"shk">>}, {<<"standard_conforming_strings">>,<<"off">>}, {<<"TimeZone">>,<<"posixrules">>}], undefined,undefined,undefined, {30932,488494147}, {statement,undefined,undefined,undefined}, 73} ** Reason for termination = ** {{badmatch,{error,{error,'ð\236ð¨ð\230ð\221ð\232ð\220',<<"42P01">>, <<208,190,209,130,208,189,208,190,209,136,208,181, 208,189,208,184,208,181,32,34,109,121,100,98,34, 32,208,189,208,181,32,209,129,209,131,209,137, 208,181,209,129,209,130,208,178,209,131,208,181, 209,130>>, [{position,<<"15">>}]}}}, [{erl_eval,expr,3}]} What's wrong i do? How can i fix it? Thank you.
The error string seems to be in russian if I recognize the characters. To view the response you can use the following command: io:format("~ts",[<<208,190,209,130,208,189,208,190,209,136,208,181, 208,189,208,184,208,181,32,34,109,121,100,98,34, 32,208,189,208,181,32,209,129,209,131,209,137, 208,181,209,129,209,130,208,178,209,131,208,181, 209,130>>]). отношение "mydb" не существует A quick google translate makes me think the database mydb does not exist or you do not have permissions to use it.
try simply doing Response = pgsql:squery(C, "select * from mydb"), io:format("~p~n",[Response]). And see what he is giving back from the server, maybe you have typo or table don't exists etc. also check this out http://www.erlangatwork.com/2009/01/erlang-and-postgresql.html
From epgsql docs: Errors Errors originating from the PostgreSQL backend are returned as {error, #error{}}, see pgsql.hrl for the record definition. epgsql functions may also return {error, What} where What is one of the following: {unsupported_auth_method, Method} - required auth method is unsupported timeout - request timed out closed - connection was closed sync_required - error occured and pgsql:sync must be called Try to include pgsql.hrl, capture the error and print the error message, that should point you to the right direction.