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.