Re: iio: inv_mpu6050: client: Erratic data.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 14, 2015 at 3:13 PM, Mike Mestnik <cheako@xxxxxxxxxxxxxxx> wrote:
> This was taken with the tablet as still as I could without resorting
> to using a vice and clamps.
>
> How to know if this is kernel or app?

Testing shows these are the values coming from the kernel, there can
be no mistake.  Are the values relative instead of absolute

https://github.com/cheako/iio-sensor-proxy/blob/structeddata/src/drv-iio-buffer-accel.c#L76
(gdb) run
Starting program: /usr/sbin/iio-sensor-proxy
[Thread debugging using libthread_db enabled]
Using host libthread_db library
"/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".
[New Thread 0xf795bb40 (LWP 17038)]
[New Thread 0xf6fffb40 (LWP 17039)]
[New Thread 0xf65ffb40 (LWP 17040)]
** (process:17037): DEBUG: Found accel_3d at
/sys/devices/pci0000:00/INT3432:00/i2c-5/i2c-INVN6500:00/iio:device0
** (process:17037): DEBUG: Found device
/sys/devices/pci0000:00/INT3432:00/i2c-5/i2c-INVN6500:00/iio:device0
of type accelerometer at IIO Buffer accelerometer
** (process:17037): DEBUG: Found associated trigger at
/sys/devices/pci0000:00/INT3432:00/i2c-5/i2c-INVN6500:00/trigger0
** (process:17037): DEBUG: Got type for in_anglvel_x: is signed: 1,
bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Got type for in_anglvel_y: is signed: 1,
bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Got type for in_anglvel_z: is signed: 1,
bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Got type for in_accel_x: is signed: 1,
bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Got type for in_accel_y: is signed: 1,
bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Got type for in_accel_z: is signed: 1,
bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Got type for in_timestamp: is signed: 1,
bytes: 8, bits_used: 64, shift: 0, mask: 0x18446744073709551615, be: 0
** (process:17037): DEBUG: Built channel array for in_anglvel_x: is
signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Built channel array for in_anglvel_y: is
signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Built channel array for in_anglvel_z: is
signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Built channel array for in_accel_x: is
signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Built channel array for in_accel_y: is
signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Built channel array for in_accel_z: is
signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
** (process:17037): DEBUG: Built channel array for in_timestamp: is
signed: 1, bytes: 8, bits_used: 64, shift: 0,
mask:0x18446744073709551615, be: 0
** (process:17037): DEBUG: Handling driver refcounting method
'ClaimLight' for ambient light sensor device
** (process:17037): DEBUG: Handling driver refcounting method
'ClaimLight' for ambient light sensor device
** (process:17037): DEBUG: Handling driver refcounting method
'ClaimAccelerometer' for accelerometer device

Breakpoint 1, read_orientation (channel=0x5656fb28, condition=G_IO_IN,
user_data=0x565715f8) at drv-iio-buffer-accel.c:164
(gdb) print *(*mydata)
Structure has no component named operator*.
(gdb) print *mydata
$1 = {in_anglvel_x = {a = {a = -62 '\302', b = -44 '\324'}, value =
-11070}, in_anglvel_y = {a = {a = -5 '\373', b = -32 '\340'}, value =
-7941}, in_anglvel_z = {a = {a = 11 '\v', b = 116 't'}, value =
29707}, in_accel_x = {a = {a = 0 '\000', b = 2 '\002'}, value = 512},
in_accel_y = {a = {a = -1 '\377', b = -2 '\376'}, value = -257},
in_accel_z = {a = {a = -1 '\377', b = -2 '\376'}, value = -257}, a = 0
'\000', b = -120 '\210', c = -1 '\377', d = -1 '\377', in_timestamp =
{a = {a = -102 '\232', b = 124 '|', c = 29 '\035', d = -104 '\230', e
= -32 '\340', f = -42 '\326', g = 13 '\r', h = 20 '\024'}, value =
1445047315568884890}}
(gdb) cont
Continuing.
** (process:17037): DEBUG: Read from IIO: 512, -257, -257
** (process:17037): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0

Breakpoint 1, read_orientation (channel=0x5656fb28, condition=G_IO_IN,
user_data=0x565715f8) at drv-iio-buffer-accel.c:164
(gdb) print *mydata
$2 = {in_anglvel_x = {a = {a = -60 '\304', b = 40 '('}, value =
10436}, in_anglvel_y = {a = {a = -3 '\375', b = -120 '\210'}, value =
-30467}, in_anglvel_z = {a = {a = 14 '\016', b = -124 '\204'}, value =
-31730}, in_accel_x = {a = {a = 0 '\000', b = 11 '\v'}, value =2816},
in_accel_y = {a = {a = 0 '\000', b = 15 '\017'}, value = 3840},
in_accel_z = {a = {a = -1 '\377', b = -2 '\376'}, value = -257}, a = 0
'\000', b = -120 '\210', c = -1 '\377', d = -1 '\377', in_timestamp =
{a = {a = -126 '\202', b = -35 '\335', c = -79'\261', d = -104 '\230',
e = -1 '\377', f = -42 '\326', g = 13 '\r', h = 20 '\024'}, value =
1445047448722595202}}
(gdb) cont
Continuing.
** (process:17037): DEBUG: Read from IIO: 2816, 3840, -257
** (process:17037): DEBUG: Accel sent by driver (quirk applied): -1, -2, 0
** (process:17037): DEBUG: Emitted orientation changed: from undefined
to bottom-up
** (process:17037): DEBUG: Handling driver refcounting method
'ClaimAccelerometer' for accelerometer device

Breakpoint 1, read_orientation (channel=0x5656fb28, condition=G_IO_IN,
user_data=0x565715f8) at drv-iio-buffer-accel.c:164
(gdb) print *mydata
$3 = {in_anglvel_x = {a = {a = -60 '\304', b = 52 '4'}, value =
13508}, in_anglvel_y = {a = {a = -3 '\375', b = -120 '\210'}, value =
-30467}, in_anglvel_z = {a = {a = 14 '\016', b = -80 '\260'}, value =
-20466}, in_accel_x = {a = {a = 0 '\000', b = 10 '\n'}, value =2560},
in_accel_y = {a = {a = -1 '\377', b = -1 '\377'}, value = -1},
in_accel_z = {a = {a = -1 '\377', b = -6 '\372'}, value = -1281}, a =
0 '\000', b = -120 '\210', c = -1 '\377', d = -1 '\377', in_timestamp
= {a = {a = -11 '\365', b = -20 '\354', c = -120'\210', d = 106 'j', e
= 4 '\004', f = -41 '\327', g = 13 '\r', h = 20 '\024'}, value =
1445047469422996725}}
(gdb) cont
Continuing.
** (process:17037): DEBUG: Read from IIO: 2560, -1, -1281
** (process:17037): DEBUG: Accel sent by driver (quirk applied): -1, 0, 0
** (process:17037): DEBUG: Emitted orientation changed: from bottom-up
to left-up

Breakpoint 1, read_orientation (channel=0x5656fb28, condition=G_IO_IN,
user_data=0x565715f8) at drv-iio-buffer-accel.c:164
(gdb) print *mydata
$4 = {in_anglvel_x = {a = {a = -61 '\303', b = -4 '\374'}, value =
-829}, in_anglvel_y = {a = {a = -3 '\375', b = 108 'l'}, value
=27901}, in_anglvel_z = {a = {a = 14 '\016', b = -4 '\374'}, value =
-1010}, in_accel_x = {a = {a = 0 '\000', b = 8 '\b'}, value =2048},
in_accel_y = {a = {a = -1 '\377', b = -1 '\377'}, value = -1},
in_accel_z = {a = {a = -1 '\377', b = -6 '\372'}, value = -1281}, a =
0 '\000', b = -120 '\210', c = -1 '\377', d = -1 '\377', in_timestamp
= {a = {a = 17 '\021', b = -81 '\257', c = -99'\235', d = 50 '2', e =
5 '\005', f = -41 '\327', g = 13 '\r', h = 20 '\024'}, value =
1445047472779800337}}
(gdb) cont
Continuing.
** (process:17037): DEBUG: Read from IIO: 2048, -1, -1281
** (process:17037): DEBUG: Accel sent by driver (quirk applied): -1, 0, 0

Breakpoint 1, read_orientation (channel=0x5656fb28, condition=G_IO_IN,
user_data=0x565715f8) at drv-iio-buffer-accel.c:164
(gdb) print *mydata
$5 = {in_anglvel_x = {a = {a = -61 '\303', b = -64 '\300'}, value =
-16189}, in_anglvel_y = {a = {a = -3 '\375', b = -124 '\204'}, value =
-31491}, in_anglvel_z = {a = {a = 13 '\r', b = 16 '\020'}, value =
4109}, in_accel_x = {a = {a = 0 '\000', b = 11 '\v'}, value = 2816},
in_accel_y = {a = {a = -1 '\377', b = -24 '\350'}, value = -5889},
in_accel_z = {a = {a = 0 '\000', b = 2 '\002'}, value =512}, a = 0
'\000', b = -120 '\210', c = -1 '\377', d = -1 '\377', in_timestamp =
{a = {a = -49 '\317', b = -27 '\345', c = 111 'o', d = 36 '$', e = 7
'\a', f = -41 '\327', g = 13 '\r', h = 20 '\024'}, value =
1445047481131853263}}
(gdb) cont
Continuing.
** (process:17037): DEBUG: Read from IIO: 2816, -5889, 512
** (process:17037): DEBUG: Accel sent by driver (quirk applied): -1, 3, 0
** (process:17037): DEBUG: Emitted orientation changed: from left-up to normal
[Thread 0xf6fffb40 (LWP 17039) exited]

Breakpoint 1, read_orientation (channel=0x5656fb28, condition=G_IO_IN,
user_data=0x565715f8) at drv-iio-buffer-accel.c:164
(gdb) print *mydata
$6 = {in_anglvel_x = {a = {a = -60 '\304', b = 48 '0'}, value =
12484}, in_anglvel_y = {a = {a = -3 '\375', b = -68 '\274'}, value =
-17155}, in_anglvel_z = {a = {a = 13 '\r', b = 108 'l'}, value =
27661}, in_accel_x = {a = {a = 0 '\000', b = 11 '\v'}, value = 2816},
in_accel_y = {a = {a = -1 '\377', b = -6 '\372'}, value = -1281},
in_accel_z = {a = {a = 0 '\000', b = 5 '\005'}, value = 1280}, a =
0'\000', b = -120 '\210', c = -1 '\377', d = -1 '\377', in_timestamp =
{a = {a = -31 '\341', b = -122 '\206', c = -62 '\302', d = 106'j', e =
8 '\b', f = -41 '\327', g = 13 '\r', h = 20 '\024'}, value =
1445047486606640865}}
(gdb) cont
Continuing.
** (process:17037): DEBUG: Read from IIO: 2816, -1281, 1280
** (process:17037): DEBUG: Accel sent by driver (quirk applied): -1, 0, 0
** (process:17037): DEBUG: Emitted orientation changed: from normal to left-up

Breakpoint 1, read_orientation (channel=0x5656fb28, condition=G_IO_IN,
user_data=0x565715f8) at drv-iio-buffer-accel.c:164
(gdb) print *mydata
$7 = {in_anglvel_x = {a = {a = -61 '\303', b = -80 '\260'}, value =
-20285}, in_anglvel_y = {a = {a = -3 '\375', b = -112 '\220'}, value =
-28419}, in_anglvel_z = {a = {a = 13 '\r', b = -40 '\330'}, value =
-10227}, in_accel_x = {a = {a = 0 '\000', b = 11 '\v'}, value = 2816},
in_accel_y = {a = {a = -1 '\377', b = -29 '\343'}, value = -7169},
in_accel_z = {a = {a = -1 '\377', b = -3 '\375'}, value = -513}, a = 0
'\000', b = -120 '\210', c = -1 '\377', d = -1 '\377', in_timestamp =
{a = {a = 11 '\v', b = 127 '\177', c = 119'w', d = 73 'I', e = 9 '\t',
f = -41 '\327', g = 13 '\r', h = 20 '\024'}, value =
1445047490343042827}}


(gdb) print *(or_data->buffer_data->channels[0])
$1 = {name = 0x565727a0 "in_anglvel_x", generic_name = 0x56574090
"in_anglvel", scale = 0.00106472406, offset = 0, index = 3, bytes =2,
bits_used = 16, shift = 0, mask = 65535, be = 1, is_signed = 1,
enabled = 0, location = 0}
(gdb) print *(or_data->buffer_data->channels[1])
$2 = {name = 0x56586878 "in_anglvel_y", generic_name = 0x5656f9d0
"in_anglvel", scale = 0.00106472406, offset = 0, index = 4, bytes =2,
bits_used = 16, shift = 0, mask = 65535, be = 1, is_signed = 1,
enabled = 0, location = 2}
(gdb) print *(or_data->buffer_data->channels[2])
$3 = {name = 0x56574070 "in_anglvel_z", generic_name = 0x5656f9f0
"in_anglvel", scale = 0.00106472406, offset = 0, index = 5, bytes =2,
bits_used = 16, shift = 0, mask = 65535, be = 1, is_signed = 1,
enabled = 0, location = 4}
(gdb) print *(or_data->buffer_data->channels[3])
$4 = {name = 0x5656f9e0 "in_accel_x", generic_name = 0x5656fa50
"in_accel", scale = 0.000598000013, offset = 0, index = 0, bytes = 2,
bits_used = 16, shift = 0, mask = 65535, be = 1, is_signed = 1,
enabled = 0, location = 6}
(gdb) print *(or_data->buffer_data->channels[4])
$5 = {name = 0x5656fa40 "in_accel_y", generic_name = 0x5656fab0
"in_accel", scale = 0.000598000013, offset = 0, index = 1, bytes = 2,
bits_used = 16, shift = 0, mask = 65535, be = 1, is_signed = 1,
enabled = 0, location = 8}
(gdb) print *(or_data->buffer_data->channels[5])
$6 = {name = 0x5656faa0 "in_accel_z", generic_name = 0x5656fb10
"in_accel", scale = 0.000598000013, offset = 0, index = 2, bytes = 2,
bits_used = 16, shift = 0, mask = 65535, be = 1, is_signed = 1,
enabled = 0, location = 10}
(gdb) print *(or_data->buffer_data->channels[6])
$7 = {name = 0x56574190 "in_timestamp", generic_name = 0x5656f9c0
"in", scale = 1, offset = 0, index = 6, bytes = 8, bits_used = 64,
shift = 0, mask = 18446744073709551615, be = 0, is_signed = 1, enabled
= 0, location = 16}
(gdb) print *(or_data->buffer_data->channels[7])
Cannot access memory at address 0x3a323334
(gdb) kill


>
> root@debian:~# G_MESSAGES_DEBUG=all /usr/sbin/iio-sensor-proxy | awk
> '{ print strftime("%M:%S"), $0; fflush(); }'
> 00:21 ** (process:22742): DEBUG: Found accel_3d at
> /sys/devices/pci0000:00/INT3432:00/i2c-7/i2c-INVN6500:00/iio:device0
> 00:21 ** (process:22742): DEBUG: Found device
> /sys/devices/pci0000:00/INT3432:00/i2c-7/i2c-INVN6500:00/iio:device0
> of type accelerometer at IIO Buffer accelerometer
> 00:21 ** (process:22742): DEBUG: Found associated trigger at
> /sys/devices/pci0000:00/INT3432:00/i2c-7/i2c-INVN6500:00/trigger0
> 00:21 ** (process:22742): DEBUG: Got type for in_anglvel_x: is signed:
> 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Got type for in_anglvel_y: is signed:
> 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Got type for in_anglvel_z: is signed:
> 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Got type for in_accel_x: is signed:
> 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Got type for in_accel_y: is signed:
> 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Got type for in_accel_z: is signed:
> 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Got type for in_timestamp: is signed:
> 1, bytes: 8, bits_used: 64, shift: 0, mask: 0x18446744073709551615,
> be: 0
> 00:21 ** (process:22742): DEBUG: Built channel array for in_anglvel_x:
> is signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Built channel array for in_anglvel_y:
> is signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Built channel array for in_anglvel_z:
> is signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Built channel array for in_accel_x:
> is signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Built channel array for in_accel_y:
> is signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Built channel array for in_accel_z:
> is signed: 1, bytes: 2, bits_used: 16, shift: 0, mask: 0x65535, be: 1
> 00:21 ** (process:22742): DEBUG: Built channel array for in_timestamp:
> is signed: 1, bytes: 8, bits_used: 64, shift: 0, mask:
> 0x18446744073709551615, be: 0
> 00:27 ** (process:22742): DEBUG: Handling driver refcounting method
> 'ClaimAccelerometer' for accelerometer device
> 00:27 ** (process:22742): DEBUG: Handling driver refcounting method
> 'ClaimLight' for ambient light sensor device
> 00:28 ** (process:22742): DEBUG: Read from IIO: 2304, -1, 1280
> 00:28 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): -1, 0, 0
> 00:28 ** (process:22742): DEBUG: Emitted orientation changed: from
> undefined to left-up
> 00:29 ** (process:22742): DEBUG: Read from IIO: 3840, 2304, 2816
> 00:29 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): -2, -1, 1
> 00:29 ** (process:22742): DEBUG: Read from IIO: 1024, 512, -1281
> 00:29 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0
> 00:30 ** (process:22742): DEBUG: Read from IIO: 1536, -513, -2049
> 00:30 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, -1
> 00:31 ** (process:22742): DEBUG: Read from IIO: 1024, -1025, -1281
> 00:31 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0
> 00:31 ** (process:22742): DEBUG: Read from IIO: 1280, -1537, -1537
> 00:31 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0
> 00:32 ** (process:22742): DEBUG: Read from IIO: 1536, -1537, -1281
> 00:32 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0
> 00:33 ** (process:22742): DEBUG: Read from IIO: 768, 512, -2561
> 00:33 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, -1
> 00:34 ** (process:22742): DEBUG: Read from IIO: 2048, -513, -2049
> 00:34 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): -1, 0, -1
> 00:34 ** (process:22742): DEBUG: Read from IIO: 1280, -5121, -769
> 00:34 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 3, 0
> 00:34 ** (process:22742): DEBUG: Emitted orientation changed: from
> left-up to normal
> 00:35 ** (process:22742): DEBUG: Read from IIO: 768, -513, -1025
> 00:35 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0
> 00:36 ** (process:22742): DEBUG: Read from IIO: 768, 2816, -513
> 00:36 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, -1, 0
> 00:36 ** (process:22742): DEBUG: Emitted orientation changed: from
> normal to bottom-up
> 00:36 ** (process:22742): DEBUG: Read from IIO: 1024, 1280, -513
> 00:36 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0
> 00:37 ** (process:22742): DEBUG: Read from IIO: 1280, -4865, -2049
> 00:37 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 2, -1
> 00:37 ** (process:22742): DEBUG: Emitted orientation changed: from
> bottom-up to normal
> 00:38 ** (process:22742): DEBUG: Read from IIO: 1536, 256, -769
> 00:38 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, 0, 0
> 00:38 ** (process:22742): DEBUG: Read from IIO: 2304, 7936, 1280
> 00:38 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): -1, -4, 0
> 00:38 ** (process:22742): DEBUG: Emitted orientation changed: from
> normal to bottom-up
> 00:39 ** (process:22742): DEBUG: Read from IIO: 0, 4864, -5377
> 00:39 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): 0, -2, -3
> 00:40 ** (process:22742): DEBUG: Read from IIO: 2304, 10496, 0
> 00:40 ** (process:22742): DEBUG: Accel sent by driver (quirk applied): -1, -6, 0
>
> The client reported the motion ?!correctly!?:
> ** Message: Accelerometer orientation changed: left-up
> ** Message: Accelerometer orientation changed: normal
> ** Message: Accelerometer orientation changed: bottom-up
> ** Message: Accelerometer orientation changed: normal
> ** Message: Accelerometer orientation changed: bottom-up
>
>
> Patches applied, there are a few!
> get them from here:
> http://j.mp/1VSEEnK
>
> Project link:
> http://j.mp/1VST95v
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux