OBS User unknown 2008-05-06 20:35:38 +00:00 committed by Git OBS Bridge
parent d74ebd297a
commit d8860253bb
10 changed files with 322 additions and 260 deletions

View File

@ -1,156 +0,0 @@
--- lirc-0.8.2/drivers/Makefile.am
+++ lirc-0.8.2/drivers/Makefile.am
@@ -15,6 +15,7 @@
lirc_i2c \
lirc_igorplugusb \
lirc_imon \
+ lirc_imon2 \
lirc_it87 \
lirc_mceusb \
lirc_mceusb2 \
--- lirc-0.8.2/drivers/lirc_imon/Makefile.am
+++ lirc-0.8.2/drivers/lirc_imon/Makefile.am
@@ -5,9 +5,9 @@
## this is so that Automake includes the C compiling definitions, and
## includes the source files in the distribution.
EXTRA_PROGRAMS = automake_dummy
-automake_dummy_SOURCES = lirc_imon.c
+automake_dummy_SOURCES = lirc_imon2.c
## there is no *just* object file support in automake. This is close enough
-module_DATA = lirc_imon.o
+module_DATA = lirc_imon2.o
-include ../Makefile.common
\ No newline at end of file
+include ../Makefile.common
--- lirc-0.8.2/drivers/lirc_imon/lirc_imon.c
+++ lirc-0.8.2/drivers/lirc_imon/lirc_imon.c
@@ -65,9 +65,9 @@
#define MOD_AUTHOR "Venky Raju <dev@venky.ws>"
-#define MOD_DESC "Driver for Soundgraph iMON MultiMedian IR/VFD"
-#define MOD_NAME "lirc_imon"
-#define MOD_VERSION "0.3"
+#define MOD_DESC "Driver for Soundgraph iMON MultiMedian IR/VFD w/imon pad2keys patch"
+#define MOD_NAME "lirc_imon2"
+#define MOD_VERSION "0.3p2k"
#define VFD_MINOR_BASE 144 /* Same as LCD */
#define DEVFS_MODE S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
@@ -81,6 +81,7 @@
#define SUCCESS 0
#define TRUE 1
#define FALSE 0
+#define CURSOR_LIMIT 16
/* ------------------------------------------------------------
@@ -166,6 +167,9 @@
atomic_t busy; /* write in progress */
int status; /* status of tx completion */
} tx;
+ int key_x;
+ int key_y;
+ int last_count; /* number of times pressed */
};
#define LOCK_CONTEXT down (&context ->sem)
@@ -256,6 +260,7 @@
MODULE_AUTHOR (MOD_AUTHOR);
MODULE_DESCRIPTION (MOD_DESC);
+MODULE_VERSION(MOD_VERSION); /* MBr: was missing */
MODULE_LICENSE ("GPL");
MODULE_DEVICE_TABLE (usb, imon_usb_id_table);
module_param (debug, int, 0);
@@ -682,6 +687,11 @@
context ->rx.initial_space = 1;
context ->rx.prev_bit = 0;
+ /* init pad context */
+ context ->key_x = 0;
+ context ->key_y = 0;
+ context ->last_count = 0;
+
usb_fill_int_urb (context ->rx_urb, context ->dev,
usb_rcvintpipe (context ->dev,
context ->rx_endpoint-> bEndpointAddress),
@@ -836,6 +846,76 @@
/* The signals have been decoded onboard the iMON controller */
+ /* encode mouse pad as key events */
+ /* we like pad events, not mouse button events*/
+ if((buf[0] & 0x40) &&
+ !(buf[1] & 0x01 || buf[1] >> 2 & 0x01))
+ {
+ int rel_x = (buf[1] & 0x08) | (buf[1] & 0x10) >> 2 | (buf[1] & 0x20) >> 4 | (buf[1] & 0x40) >> 6;
+ int rel_y = (buf[2] & 0x08) | (buf[2] & 0x10) >> 2 | (buf[2] & 0x20) >> 4 | (buf[2] & 0x40) >> 6;
+
+ if(buf[0] & 0x02)
+ rel_x |= ~0x10+1;
+ if(buf[0] & 0x01)
+ rel_y |= ~0x10+1;
+
+ /* keyboard direction key emulation */
+ if( context->last_count > 32 )
+ { /* Hopefully eliminate drift*/
+ context->last_count=0;
+ context->key_y=0;
+ context->key_x=0;
+ }
+ context->last_count++;
+
+ /* limit decoded events */
+ if(abs(context->key_x) > CURSOR_LIMIT || abs(context->key_y) > CURSOR_LIMIT )
+ {
+ if(abs(context->key_y ) > abs(context->key_x))
+ { /* mouse s/n */
+ if(context->key_y > 0 && rel_y > 0)
+ { /* mouse s */
+ buf[0] = 0x68;
+ buf[1] = 0x82;
+ buf[2] = 0x91;
+ }
+ else if(context->key_y < 0 && rel_y < 0)
+ { /* mouse n */
+ buf[0] = 0x69;
+ buf[1] = 0x02;
+ buf[2] = 0x81;
+ }
+ }
+ else
+ { /* mouse e/w*/
+ if(context->key_x > 0 && rel_x > 0 )
+ { /* mouse e */
+ buf[0] = 0x68;
+ buf[1] = 0x8A;
+ buf[2] = 0x81;
+ }
+ else if(context->key_x < 0 && rel_x < 0 )
+ { /* mouse w */
+ buf[0] = 0x6A;
+ buf[1] = 0x82;
+ buf[2] = 0x81;
+ }
+ }
+ }
+ else
+ {
+ context->key_x += rel_x;
+ context->key_y += rel_y;
+
+ return; /* discard those key codes */
+ }
+ }
+
+ /* a key was pressed, reset count */
+ context->key_x = 0;
+ context->key_y = 0;
+ context->last_count = 0;
+
lirc_buffer_write_1 (context ->plugin ->rbuf, buf);
wake_up (&context ->plugin ->rbuf ->wait_poll);
return;

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:717e62ee763bad9c1ffc25dd096a8845d252eaa050f16f67c6fe3506194e7f62
size 634331

3
lirc-0.8.3.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8190c84fb40376380c163009808df4bd25bac53890261a48c522bb9ccad5723f
size 667882

View File

@ -0,0 +1,262 @@
Index: lirc-0.8.3/drivers/lirc_imon/lirc_imon.c
===================================================================
--- lirc-0.8.3.orig/drivers/lirc_imon/lirc_imon.c
+++ lirc-0.8.3/drivers/lirc_imon/lirc_imon.c
@@ -73,9 +73,9 @@
#define MOD_AUTHOR "Venky Raju <dev@venky.ws>"
-#define MOD_DESC "Driver for Soundgraph iMON MultiMedia IR/VFD"
+#define MOD_DESC "Driver for Soundgraph iMON MultiMedia IR/VFD w/imon pad2keys patch"
#define MOD_NAME "lirc_imon"
-#define MOD_VERSION "0.3"
+#define MOD_VERSION "0.3p2k"
#define VFD_MINOR_BASE 144 /* Same as LCD */
#define DEVFS_MODE (S_IFCHR | S_IRUSR | S_IWUSR | \
@@ -91,6 +91,7 @@
#define TRUE 1
#define FALSE 0
+#define CURSOR_LIMIT 16
/* ------------------------------------------------------------
* P R O T O T Y P E S
@@ -177,6 +178,10 @@ struct imon_context {
atomic_t busy; /* write in progress */
int status; /* status of tx completion */
} tx;
+
+ int key_x;
+ int key_y;
+ int last_count; /* number of times pressed */
};
#define LOCK_CONTEXT down(&context->sem)
@@ -248,6 +253,9 @@ static int is_lcd = 1;
static int is_lcd; /* If LIRC_IMON_LCD not defined, default to non-LCD */
#endif
+/* pad2keys module parameter. pad2keys patch active? */
+static int pad2keys_active = 0;
+
#if !defined(KERNEL_2_5)
#define MAX_DEVICES 4 /* In case there's more than one iMON device */
@@ -271,12 +279,16 @@ extern devfs_handle_t usb_devfs_handle;
MODULE_AUTHOR(MOD_AUTHOR);
MODULE_DESCRIPTION(MOD_DESC);
+MODULE_VERSION(MOD_VERSION); /* MBr: was missing */
MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(usb, imon_usb_id_table);
module_param(debug, int, 0);
MODULE_PARM_DESC(debug, "Debug messages: 0=no, 1=yes(default: no)");
+module_param (pad2keys_active, int, 0);
+MODULE_PARM_DESC (pad2keys_active, "pad2keys patch active: 0=no, 1=yes (default: no)");
+
#ifdef LIRC_IMON_LCD
module_param(is_lcd, int, 1);
MODULE_PARM_DESC(is_lcd, "The device is an LCD: 0=no (it's a VFD), "
@@ -766,6 +778,11 @@ static int ir_open(void *data)
context->rx.initial_space = 1;
context->rx.prev_bit = 0;
+ /* init pad context for pad2keys */
+ context ->key_x = 0;
+ context ->key_y = 0;
+ context ->last_count = 0;
+
usb_fill_int_urb(context->rx_urb, context->dev,
usb_rcvintpipe(context->dev,
context->rx_endpoint->bEndpointAddress),
@@ -915,6 +932,94 @@ static inline void incoming_packet(struc
if (context->ir_onboard_decode) {
/* The signals have been decoded onboard the iMON controller */
+
+ if (pad2keys_active)
+ {
+ /* imon pad2keys patch
+ *
+ * make PAD and mouse buttons available for use with VDR,
+ * based on pad-mouse-emu patch from venky's forum
+ *
+ * last change: M.Brakemeier 2007-10-14
+ *
+ * generated PAD key codes:
+ * Mouse_N 0x690281B7
+ * Mouse_S 0x688291B7
+ * Mouse_W 0x6A8281B7
+ * Mouse_E 0x688A81B7
+ *
+ * mouse buttons (non-synthetic):
+ * MouseRightClick 0x688481B7
+ * MouseLeftClick 0x688301B7
+ */
+ if((buf[0] & 0x40) &&
+ !(buf[1] & 0x01 || buf[1] >> 2 & 0x01))
+ {
+ int rel_x = (buf[1] & 0x08) | (buf[1] & 0x10) >> 2 | (buf[1] & 0x20) >> 4 | (buf[1] & 0x40) >> 6;
+ int rel_y = (buf[2] & 0x08) | (buf[2] & 0x10) >> 2 | (buf[2] & 0x20) >> 4 | (buf[2] & 0x40) >> 6;
+
+ if(buf[0] & 0x02)
+ rel_x |= ~0x10+1;
+ if(buf[0] & 0x01)
+ rel_y |= ~0x10+1;
+
+ /* keyboard direction key emulation */
+ if( context->last_count > 32 )
+ { /* Hopefully eliminate drift*/
+ context->last_count=0;
+ context->key_y=0;
+ context->key_x=0;
+ }
+ context->last_count++;
+
+ /* limit decoded events */
+ if(abs(context->key_x) > CURSOR_LIMIT || abs(context->key_y) > CURSOR_LIMIT )
+ {
+ if(abs(context->key_y ) > abs(context->key_x))
+ { /* mouse s/n */
+ if(context->key_y > 0 && rel_y > 0)
+ { /* mouse s */
+ buf[0] = 0x68;
+ buf[1] = 0x82;
+ buf[2] = 0x91;
+ }
+ else if(context->key_y < 0 && rel_y < 0)
+ { /* mouse n */
+ buf[0] = 0x69;
+ buf[1] = 0x02;
+ buf[2] = 0x81;
+ }
+ }
+ else
+ { /* mouse e/w*/
+ if(context->key_x > 0 && rel_x > 0 )
+ { /* mouse e */
+ buf[0] = 0x68;
+ buf[1] = 0x8A;
+ buf[2] = 0x81;
+ }
+ else if(context->key_x < 0 && rel_x < 0 )
+ { /* mouse w */
+ buf[0] = 0x6A;
+ buf[1] = 0x82;
+ buf[2] = 0x81;
+ }
+ }
+ }
+ else
+ {
+ context->key_x += rel_x;
+ context->key_y += rel_y;
+
+ return; /* discard those key codes */
+ }
+ }
+ /* a key was pressed, reset count */
+ context->key_x = 0;
+ context->key_y = 0;
+ context->last_count = 0;
+ }
+
lirc_buffer_write_1(context->plugin->rbuf, buf);
wake_up(&context->plugin->rbuf->wait_poll);
return;
Index: lirc-0.8.3/remotes/imon/lircd.conf.imon-pad2keys
===================================================================
--- /dev/null
+++ lirc-0.8.3/remotes/imon/lircd.conf.imon-pad2keys
@@ -0,0 +1,88 @@
+# Please make this file available to others
+# by sending it to <lirc@bartelmus.de>
+#
+# this config file was generated
+# using lirc-0.8.3pre1 (imon w/pad2keys patch)
+#
+# contributed by M.Brakemeier
+#
+# brand: SoundGraph
+# model no. of remote control: iMON-PAD
+# devices being controlled by this remote:
+#
+
+begin remote
+
+ name iMON-PAD
+ bits 32
+ eps 30
+ aeps 100
+
+ one 0 0
+ zero 0 0
+ gap 235965
+ min_repeat 1
+ toggle_bit 0
+
+ begin codes
+ AppExit 0x288195B7
+ Power 0x289115B7
+ Record 0x298115B7
+ Play 0x2A8115B7
+ Open 0x29B1D5B7
+ Rewind 0x2A8195B7
+ Pause 0x2A9115B7
+ FastForward 0x2B8115B7
+ PrevChapter 0x2B9115B7
+ Stop 0x2B9715B7
+ NextChapter 0x298195B7
+ Esc 0x2BB715B7
+ Eject 0x299395B7
+ AppLauncher 0x29B715B7
+ MultiMon 0x2AB195B7
+ TaskSwitcher 0x2A9395B7
+ Mute 0x2B9595B7
+ Vol+ 0x28A395B7
+ Vol- 0x28A595B7
+ Ch+ 0x289395B7
+ Ch- 0x288795B7
+ Timer 0x2B8395B7
+ 1 0x28B595B7
+ 2 0x2BB195B7
+ 3 0x28B195B7
+ 4 0x2A8595B7
+ 5 0x299595B7
+ 6 0x2AA595B7
+ 7 0x2B9395B7
+ 8 0x2A8515B7
+ 9 0x2AA115B7
+ 0 0x2BA595B7
+ ShiftTab 0x28B515B7
+ Tab 0x29A115B7
+ Red 0x2B8515B7 # MyMovie
+ Green 0x299195B7 # MyMusic
+ Blue 0x2BA115B7 # MyPhoto
+ Yellow 0x28A515B7 # MyTV
+ Bookmark 0x288515B7
+ Thumbnail 0x2AB715B7
+ AspectRatio 0x29A595B7
+ FullScreen 0x2AA395B7
+ Purple 0x29A295B7 # MyDVD
+ Menu 0x2BA385B7
+ Caption 0x298595B7
+ Language 0x2B8595B7
+ MouseKeyboard 0x299115B7
+ SelectSpace 0x2A9315B7
+ MouseMenu 0x28B715B7
+ MouseRightClick 0x688481B7
+ Enter 0x28A195B7
+ MouseLeftClick 0x688301B7
+ WindowsKey 0x2B8195B7
+ Backspace 0x28A115B7
+ Mouse_N 0x690281B7
+ Mouse_S 0x688291B7
+ Mouse_W 0x6A8281B7
+ Mouse_E 0x688A81B7
+ end codes
+
+end remote

View File

@ -1,30 +0,0 @@
--- drivers/lirc_dev/lirc_dev.c
+++ drivers/lirc_dev/lirc_dev.c
@@ -880,8 +880,7 @@
return SUCCESS;
out_unregister:
- if(unregister_chrdev(IRCTL_DEV_MAJOR, IRCTL_DEV_NAME))
- printk(KERN_ERR "lirc_dev: unregister_chrdev failed!\n");
+ unregister_chrdev(IRCTL_DEV_MAJOR, IRCTL_DEV_NAME);
out:
return -1;
}
@@ -905,15 +904,11 @@
*/
void cleanup_module(void)
{
- int ret;
- ret = unregister_chrdev(IRCTL_DEV_MAJOR, IRCTL_DEV_NAME);
+ unregister_chrdev(IRCTL_DEV_MAJOR, IRCTL_DEV_NAME);
class_destroy(lirc_class);
- if(ret)
- printk("lirc_dev: error in module_unregister_chrdev: %d\n", ret);
- else
- dprintk("lirc_dev: module successfully unloaded\n");
+ dprintk("lirc_dev: module successfully unloaded\n");
}
MODULE_DESCRIPTION("LIRC base driver module");

View File

@ -1,57 +0,0 @@
--- drivers/lirc_dev/lirc_dev.c
+++ drivers/lirc_dev/lirc_dev.c
@@ -242,7 +242,8 @@
#ifdef LIRC_HAVE_DEVFS_24
char name[16];
#endif
- DECLARE_MUTEX_LOCKED(tn);
+ struct semaphore tn;
+ sema_init(&tn,0);
if (!p) {
printk("lirc_dev: lirc_register_plugin: "
@@ -431,8 +432,9 @@
int lirc_unregister_plugin(int minor)
{
struct irctl *ir;
- DECLARE_MUTEX_LOCKED(tn);
- DECLARE_MUTEX_LOCKED(tn2);
+ struct semaphore tn, tn2;
+ sema_init(&tn, 0);
+ sema_init(&tn2, 0);
if (minor < 0 || minor >= MAX_IRCTL_DEVICES) {
printk("lirc_dev: lirc_unregister_plugin: "
--- drivers/lirc_it87/lirc_it87.c
+++ drivers/lirc_it87/lirc_it87.c
@@ -934,7 +934,7 @@
/* Leaving MB PnP Mode */
it87_write(IT87_CFGCTRL, 0x2);
- retval = request_irq(irq, it87_interrupt, 0 /*SA_INTERRUPT*/,
+ retval = request_irq(irq, it87_interrupt, 0 /*IRQF_DISABLED*/,
LIRC_DRIVER_NAME, NULL);
if (retval < 0) {
printk(KERN_ERR LIRC_DRIVER_NAME
--- drivers/lirc_serial/lirc_serial.c
+++ drivers/lirc_serial/lirc_serial.c
@@ -998,7 +998,7 @@
do_gettimeofday(&lasttv);
result=request_irq(irq,irq_handler,
- SA_INTERRUPT | (share_irq ? SA_SHIRQ:0),
+ IRQF_DISABLED | (share_irq ? IRQF_SHARED:0),
LIRC_DRIVER_NAME,(void *)&hardware);
switch(result)
--- drivers/lirc_sir/lirc_sir.c
+++ drivers/lirc_sir/lirc_sir.c
@@ -1051,7 +1051,7 @@
return -EBUSY;
}
#endif
- retval = request_irq(irq, sir_interrupt, SA_INTERRUPT,
+ retval = request_irq(irq, sir_interrupt, IRQF_DISABLED,
LIRC_DRIVER_NAME, NULL);
if (retval < 0) {
# ifndef LIRC_ON_SA1100

View File

@ -1,3 +1,16 @@
-------------------------------------------------------------------
Mon May 5 16:52:22 CEST 2008 - lnussel@suse.de
- new version 0.8.3
* added support for Samsung USB IR Receiver (Robert Schedel)
* added support for Soundgraph iMON IR/LCD (Dean Harding)
* added support for IRLink receiver (Maxim Muratov)
* added support for VLSystem MPlay Blast (Benoit Laurent)
* implemented SIMULATE command in irsend to simulate IR events
* added user-space I2C driver (Adam Sampson)
* added support for Hauppauge HVR-1300 (Jan Frey)
* dropped support for 2.4 kernels
-------------------------------------------------------------------
Tue Apr 29 12:10:36 CEST 2008 - lnussel@suse.de

View File

@ -1,5 +1,5 @@
#
# spec file for package lirc-kernel (Version 0.8.2)
# spec file for package lirc-kernel (Version 0.8.3)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@ -17,15 +17,14 @@ BuildRequires: kernel-source kernel-syms module-init-tools
License: GPL v2 or later
Group: System/Kernel
Summary: LIRC kernel modules
Version: 0.8.2
Release: 6
Source0: lirc-0.8.2.tar.bz2
Version: 0.8.3
Release: 1
Source0: lirc-%{version}.tar.bz2
Source1: Makefile.module
Source2: Makefile.modsub
Patch: lirc-0.8.1-kernel_SLAB_ATOMIC.diff
Patch1: lirc-0.8.1-imon_pad2keys.patch
Patch2: lirc-2.6.23.diff
Patch3: lirc-2.6.24.diff
# http://brakemeier.de/electronics/vdr/lirc-imon.html
Patch1: lirc-0.8.3pre1-imon-pad2keys.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%suse_kernel_module_package -n lirc kdump um debug
@ -74,15 +73,13 @@ receivers for the serial port.
%prep
%setup -q -n lirc-0.8.2
%setup -q -n lirc-%{version}
pushd drivers
cp -av lirc_imon lirc_imon2
mv lirc_imon2/lirc_imon.c lirc_imon2/lirc_imon2.c
popd
#%patch -p1
%patch1 -p1
%patch2 -p0
%patch3 -p0
autoreconf -f -i
./configure --with-driver=all
cp -a drivers source
@ -112,6 +109,16 @@ for flavor in %flavors_to_build; do
done
%changelog
* Mon May 05 2008 lnussel@suse.de
- new version 0.8.3
* added support for Samsung USB IR Receiver (Robert Schedel)
* added support for Soundgraph iMON IR/LCD (Dean Harding)
* added support for IRLink receiver (Maxim Muratov)
* added support for VLSystem MPlay Blast (Benoit Laurent)
* implemented SIMULATE command in irsend to simulate IR events
* added user-space I2C driver (Adam Sampson)
* added support for Hauppauge HVR-1300 (Jan Frey)
* dropped support for 2.4 kernels
* Tue Apr 29 2008 lnussel@suse.de
- add modalias supplements
- recommend lirc

View File

@ -1,3 +1,16 @@
-------------------------------------------------------------------
Mon May 5 16:30:37 CEST 2008 - lnussel@suse.de
- new version 0.8.3
* added support for Samsung USB IR Receiver (Robert Schedel)
* added support for Soundgraph iMON IR/LCD (Dean Harding)
* added support for IRLink receiver (Maxim Muratov)
* added support for VLSystem MPlay Blast (Benoit Laurent)
* implemented SIMULATE command in irsend to simulate IR events
* added user-space I2C driver (Adam Sampson)
* added support for Hauppauge HVR-1300 (Jan Frey)
* dropped support for 2.4 kernels
-------------------------------------------------------------------
Thu Apr 10 12:54:45 CEST 2008 - ro@suse.de

View File

@ -1,5 +1,5 @@
#
# spec file for package lirc (Version 0.8.2)
# spec file for package lirc (Version 0.8.3)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@ -20,11 +20,11 @@ Url: http://www.lirc.org/
License: GPL v2 or later
Group: Hardware/Other
AutoReqProv: on
Version: 0.8.2
Release: 70
Version: 0.8.3
Release: 1
PreReq: %fillup_prereq %insserv_prereq
Summary: Tools for Infrared Receivers
Source0: lirc-0.8.2.tar.bz2
Source0: lirc-0.8.3.tar.bz2
Source4: rc.lirc
Source5: sysconfig.lirc
Source6: fix-remote-keys.pl
@ -158,6 +158,16 @@ install -D -m 644 /dev/null %{buildroot}/etc/lircd.conf
rm -rf %{buildroot}
%changelog
* Mon May 05 2008 lnussel@suse.de
- new version 0.8.3
* added support for Samsung USB IR Receiver (Robert Schedel)
* added support for Soundgraph iMON IR/LCD (Dean Harding)
* added support for IRLink receiver (Maxim Muratov)
* added support for VLSystem MPlay Blast (Benoit Laurent)
* implemented SIMULATE command in irsend to simulate IR events
* added user-space I2C driver (Adam Sampson)
* added support for Hauppauge HVR-1300 (Jan Frey)
* dropped support for 2.4 kernels
* Thu Apr 10 2008 ro@suse.de
- added baselibs.conf file to build xxbit packages
for multilib support