commit 59c5f9e107b6df36d60eb9684c7f23b53d8b333e Author: Silvan Calarco Date: Thu Jan 24 01:00:00 2013 +0100 Initial commit (release 0.3.25) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Changelog b/Changelog new file mode 100644 index 0000000..9b22c71 --- /dev/null +++ b/Changelog @@ -0,0 +1,115 @@ +2012-01-21 0.3.25 Silvan Calarco + - initscript: + - load applesmc module + - macbook-lightd: + - check for sensor file existence or exit + +2011-09-01 0.3.24 Silvan Calarco + - initscript: + - configure it-macbook in /etc/vconsole.conf when Apple computer is detected; + - remove it-macbook KEYMAP configuration for non Apple computers + +2009-08-03 0.3.23 Silvan Calarco + - macbook-lightd: small fix to algorithm + +2009-07-25 0.3.22 Silvan Calarco + - modprobe.conf.d/macbook: install as /etc/modprobe.d/macbook.conf + +2009-06-29 0.3.21 Silvan Calarco + - initscript: redirect macbook-light output to fix multithreaded init lockup + +2009-06-23 0.3.20 Silvan Calarco : + - initscript: disabled LCD backlight setting (managed by HAL/KDE) + - macbook-lightd: modified and re-enabled in initscript + +2009-02-24 0.3.19 Silvan Calarco : + - modprobe.conf.d/macbook: st fnmode for hid_apple not for hid (kernel 2.6.28) + +2008-04-14 0.3.18 Silvan Calarco : + - isight-firmware-loaded: removed as it is now provided by external package + +2008-03-09 0.3.17 Silvan Calarco : + - initscript: fix check for SYSTEM_MANUFACTURER against new postplug + +2008-02-01 0.3.16 Silvan Calarco : + - macbook-set-input: don't execute xbindkeys and xmodmap as they are + now handled by xbindkeys-start + - initscript: use /etc/sysconfig/machine to detect manufacturer + +2008-01-08 0.3.15 Silvan Calarco : + - Makefile: build statically against libpci + +2007-11-10 0.3.14 Silvan Calarco : + - initscript: remove mapping of button to central mouse key + +2007-09-12 0.3.13 Silvan Calarco : + - initscripts: replace loading of module speedstep-centrino (obsolete) + with acpi_cpufreqd + +2007-09-10 0.3.12 Silvan Calarco : + - swapped right-Apple and numpad enter association (respectively they + are now ISO_Level3_Shift and right mouse key + +2007-08-31 0.3.11 Silvan Calarco : + - initscript: set mause button emulation to apple keys + - modprobe: enable pb_fnmode=2 option of hid module + - macbook_set_input: xprofile script moved to /usr/bin/macbook_set_input + and called by kde autostart desktop file + +2007-08-15 0.3.10 Silvan Calarco : + - initscript: don't install suid root + +2007-08-06 0.3.9 Silvan Calarco : + - initscript: load specific modules here instead of /etc/modules.d/macbook + - /etc/modules.d/macbook: remove + - initscript: change chkconfig priority from 44 to 42 (before cpufreqd) + +2007-08-03 0.3.8 Silvan Calarco : + - initscript: added support for macmini configuration in lirc + - modprobe: removed loading of appletouch (now automatic) and appleir + (obsolete) + - udev: removed macbook file installation + - scripts: added check for Apple chassis so this package can be installed + harmlessy also on non macbook computers + +2007-03-08 0.3.7 Silvan Calarco : + - modprobe macbook: fix appleir and appletouch loading before usbhid + +2007-03-06 0.3.6 Silvan Calarco : + - use xprofile.d instead of autostart desktop file + +2006-10-20 0.3.5 Silvan Calarco : + - fix xmodmap file to match new keyboard layout fixes in kernel 2.6.18.3 + +2006-10-12 0.3.4 Silvan Calarco : + - fix udev rule to match KERNEL event device + - appleir: load before usbhid + +2006-10-10 0.3.3 Silvan Calarco : + - add udev rule for appleir + +2006-10-08 0.3.2 Silvan Calarco : + - add lircd support + - load uvcvideo on boot + +2006-10-02 0.3 Silvan Calarco : + - add more complete kbd support (Function keys mapping and commands) + - set keyboard configuration on X session startup + +2006-10-02 0.2.2 Silvan Calarco : + - appletouch: load before usbhid (needs usbhid compiled as a module) + +2006-07-24 0.2.1 Silvan Calarco : + - add modprobe.conf.d file for automatic firmware loading + +2006-07-24 0.2 Silvan Calarco : + - added isight firmware loader tool + - applesmc: resync from original macbook-tools 0.1.1 + - macbook-lightd: added very simple daemon for keyboard backlight control + +2006-07-13 0.1a Silvan Calarco : + - backlight tool updated + - added applesmc tool for keyboard backlight control + +2006-07-09 0.1: + - first official release with backlight tool by Nicolas Boichat diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c30fed7 --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +include VERSION + +BINDIR:=/usr/bin +SBIN:=/sbin +SBINDIR:=/usr/sbin +SYSCONFDIR:=/etc +DESTDIR:= +DATADIR:=/usr/share +INITDIR:=/etc/rc.d/init.d +RPMSOURCEDIR:=/usr/src/RPM/SOURCES +KDEAUTOSTART:=/opt/kde3/share/autostart/ + +all: applesmc backlight + +applesmc: applesmc.c Makefile + gcc -DVERSION=\"$(VERSION)\" -Wall applesmc.c -o applesmc +backlight: backlight.c Makefile + gcc -DVERSION=\"$(VERSION)\" -Wall backlight.c -o backlight -lpci -static + +install: backlight applesmc + install -d $(DESTDIR)$(BINDIR) $(DESTDIR)$(INITDIR) \ + $(DESTDIR)$(SBIN) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(SYSCONFDIR)/modprobe.d \ + $(DESTDIR)$(SBIN) $(DESTDIR)$(SBINDIR) \ + $(DESTDIR)$(SYSCONFDIR)/sysconfig $(DESTDIR)$(KDEAUTOSTART) + install -s -m 4755 applesmc $(DESTDIR)$(BINDIR) + install -s -m 4755 backlight $(DESTDIR)$(BINDIR) + install -m 0755 macbook-set-input $(DESTDIR)$(BINDIR)/ + install -m 0755 macbook-tools-init $(DESTDIR)$(INITDIR)/macbook-tools + install -m 644 macbook-tools-sysconfig $(DESTDIR)$(SYSCONFDIR)/sysconfig/macbook-tools + install -m 0755 macbook-lightd $(DESTDIR)$(SBINDIR)/ + install -m 0644 macbook-modprobe $(DESTDIR)$(SYSCONFDIR)/modprobe.d/macbook.conf + install -m 0644 macbook_set_input.desktop $(DESTDIR)$(KDEAUTOSTART)/macbook_set_input.desktop + +clean: + rm -f backlight + rm -f applesmc + rm -f *~ + +dist: clean + rm -rf macbook-tools-$(VERSION) + rm -rf macbook-tools-$(VERSION).tar.bz2 + mkdir macbook-tools-$(VERSION) + find . -maxdepth 1 -exec cp {} macbook-tools-$(VERSION) \; + tar cvfj macbook-tools-$(VERSION).tar.bz2 macbook-tools-$(VERSION) + rm -rf macbook-tools-$(VERSION) + +dist-rpm: dist + cp macbook-tools-$(VERSION).tar.bz2 $(RPMSOURCEDIR) diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..770b1d4 --- /dev/null +++ b/VERSION @@ -0,0 +1,2 @@ +VERSION = 0.3.25 + diff --git a/applesmc.c b/applesmc.c new file mode 100644 index 0000000..41daebc --- /dev/null +++ b/applesmc.c @@ -0,0 +1,286 @@ +/* + * Apple Macbook Pro SMC control + * + * Copyright (C) 2006 Nicolas Boichat + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +#define LIGHT_SENSOR_LEFT_KEY "ALV0" //0x414c5630, r-o length 6 +#define LIGHT_SENSOR_RIGHT_KEY "ALV1" //0x414c5631, r-o length 6 +#define BACKLIGHT_KEY "LKSB" //0x4c4b5342, w-o +#define CLAMSHELL_KEY "MSLD" //0x4d534c44, r-o length 1 (unused) +#define MOTION_SENSOR_X_KEY "MO_X" //0x4d4f5f58, r-o length 2 +#define MOTION_SENSOR_Y_KEY "MO_Y" //0x4d4f5f58, r-o length 2 +#define MOTION_SENSOR_Z_KEY "MO_Z" //0x4d4f5f58, r-o length 2 +#define MOTION_SENSOR_KEY "MOCN" //0x4d4f434e, r/w length 2 + + +static int debug = 0; + +static struct timeval lasttv; +static struct timeval newtv; + +void inline ssleep(const int usec) { + gettimeofday(&lasttv, NULL); + while (1) { + gettimeofday(&newtv, NULL); + if (((newtv.tv_usec - lasttv.tv_usec) + ((newtv.tv_sec - lasttv.tv_sec)*1000000)) > usec) { + break; + } + } +} + +unsigned char get_status() { + return inb(0x304); +} + +int waitfree(char num) { + char c, pc = -1; + int retry = 100; + while (((c = get_status())&0x0F) != num && retry) { + ssleep(10); + retry--; + if (pc != c) { + //printf("%x-%d:", c, retry); + pc = c; + } + } + if (retry == 0) { + printf("Waitfree failed %x != %x.\n", c, num); + return 0; + } + /*else + printf("Waitfree ok %x.\n", c);*/ + + return 1; +} + +int writekey(char* key, char len, unsigned char* buffer) { + int i; + + outb(0x11, 0x304); + if (!waitfree(0x0c)) return 0; + + for (i = 0; i < 4; i++) { + outb(key[i], 0x300); + if (!waitfree(0x04)) return 0; + } + if (debug) printf(">%s", key); + + outb(len, 0x300); + if (debug) printf(">%x", len); + + for (i = 0; i < len; i++) { + if (!waitfree(0x04)) return 0; + outb(buffer[i], 0x300); + if (debug) printf(">%x", buffer[i]); + } + if (debug) printf("\n"); + return 1; +} + +int readkey(char* key, char len, unsigned char* buffer) { + int i; unsigned char c; + + outb(0x10, 0x304); + if (!waitfree(0x0c)) return 0; + + for (i = 0; i < 4; i++) { + outb(key[i], 0x300); + if (!waitfree(0x04)) return 0; + } + if (debug) printf("<%s", key); + + outb(len, 0x300); + if (debug) printf(">%x", len); + + for (i = 0; i < len; i++) { + if (!waitfree(0x05)) return 0; + c = inb(0x300); + buffer[i] = c; + if (debug) printf("<%x", c); + } + if (debug) printf("\n"); + return 1; +} + +int read_light_sensor(int left) { + unsigned char buffer[6]; + if (readkey(left ? LIGHT_SENSOR_LEFT_KEY : LIGHT_SENSOR_RIGHT_KEY, 6, buffer)) + return buffer[2]; + else + return -1; +} + +int set_keyboard_backlight(char value) { + unsigned char buffer[2]; + buffer[0] = value; + buffer[1] = 0x00; + return writekey(BACKLIGHT_KEY, 2, buffer); +} + +int init_motion_sensor() { + unsigned char buffer[2]; + int retry = 50; + int ret; + + while (retry) { + ret = readkey(MOTION_SENSOR_KEY, 2, buffer); + if (ret) { + if (buffer[0] || buffer[1]) { + return 1; + } + } + else { + usleep(100000); + retry--; + continue; + } + buffer[0] = 0xe0; + buffer[1] = 0; + writekey(MOTION_SENSOR_KEY, 2, buffer); + retry--; + usleep(100000); + } + return 0; +} + +int read_motion_sensor(int index) { + unsigned char buffer[2]; + int ret; + + switch (index) { + case 0: + ret = readkey(MOTION_SENSOR_X_KEY, 2, buffer); + break; + case 1: + ret = readkey(MOTION_SENSOR_Y_KEY, 2, buffer); + break; + case 2: + ret = readkey(MOTION_SENSOR_Z_KEY, 2, buffer); + break; + } + //printf("%d %x %x\n", index, buffer[0], buffer[1]); + if (ret) { + return (short)(buffer[0] << 8 | buffer[1]); + } + else { + return 0x0FFFFFFF; + } +} + +/* Brute-force device probing... */ +void probe() { + char key[5]; + char chars[37]; + unsigned char buffer[2]; + int i, j, k, l; + + for (i = 0; i < 26; i++) { + chars[i] = 'A'+i; + } + for (i = 0; i < 10; i++) { + chars[i+26] = '0'+i; + } + chars[36] = '_'; + + key[4] = 0; + for (i = 0; i < 37; i++) { + key[0] = chars[i]; + for (j = 0; j < 37; j++) { + key[1] = chars[j]; + for (k = 0; k < 37; k++) { + key[2] = chars[k]; + for (l = 0; l < 37; l++) { + key[3] = chars[l]; + printf("key=%s\n", key); + readkey(key, 2, buffer); + } + } + } + } +} + +void usage(char* argv0) { + printf("Apple Macbook (pro) SMC control " VERSION); + printf("\n"); + printf("Usage:\n"); + printf("%s [-d]: read light/motion sensors values\n", argv0); + printf("%s [-d] value: write keyboard backlight value [0-255]\n", argv0); +} + +int main(int argc, char** argv) { + int argi = 1; + if (argc > 3) { + usage(argv[0]); + return 1; + } + + if (ioperm(0x300, 0x304, 1) < 0) { + perror("ioperm failed (you should be root)."); + exit(1); + } + + if ((argc > 1) && !strcmp(argv[1], "-d")) { + debug = 1; + argi = 2; + } + + if (argc-argi == 1) { + char* endptr; + long value = strtol(argv[argi], &endptr, 10); + if ((value < 0) || (value > 255) || (endptr[0])) { + printf("Invalid value \"%s\" (should be an integer between 0 and 255).\n", argv[1]); + usage(argv[0]); + return 1; + } + else { + set_keyboard_backlight(value); + } + } + else { + init_motion_sensor(); + printf("Light: Left: %d, Right: %d\n", read_light_sensor(1), read_light_sensor(0)); + printf("Motion: X: %d, Y: %d, Z: %d\n", read_motion_sensor(0), read_motion_sensor(1), read_motion_sensor(2)); + /*while (1) { + printf("Motion: X: %d, Y: %d, Z: %d\n", read_motion_sensor(0), read_motion_sensor(1), read_motion_sensor(2)); + sleep(1); + } + int x, y, z, ox, oy, oz; + ox = read_motion_sensor(0); + oy = read_motion_sensor(1); + oz = read_motion_sensor(2); + while (1) { + x = read_motion_sensor(0); + y = read_motion_sensor(1); + z = read_motion_sensor(2); + if ((x-ox)*(x-ox)+(y-oy)*(y-oy)+(z-oz)*(z-oz) > 50) + printf("Accel: X: %d, Y: %d, Z: %d (%d %d)\n", x-ox, y-oy, z-oz, z, oz); + usleep(1000000); + ox = x; oy = y; oz = z; + }*/ + } + + return 0; +} diff --git a/backlight.c b/backlight.c new file mode 100644 index 0000000..dce1632 --- /dev/null +++ b/backlight.c @@ -0,0 +1,194 @@ +/* + * Apple Macbook Pro LCD backlight control + * + * Copyright (C) 2006 Nicolas Boichat + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +char* memory; + +static inline unsigned int readl(const volatile void *addr) +{ + return *(volatile unsigned int*) addr; +} + +static inline void writel(unsigned int b, volatile void *addr) +{ + *(volatile unsigned int*) addr = b; +} + +#define INREG(addr) readl(memory+addr) +#define OUTREG(addr,val) writel(val, memory+addr) + +unsigned char read_backlight() { + return INREG(0x7af8) >> 8; +} + +void write_backlight_value(unsigned char value) { + OUTREG(0x7af8, 0x00000001 | ((unsigned int)value << 8)); +} + +void write_backlight(unsigned char value) { + unsigned int current = read_backlight(); + + if (current < value) { + while (current < value) { + current += 5; + if (current > value) + current = value; + write_backlight_value((unsigned char)current); + usleep(50000); + } + } + else { + while (current > value) { + current -= 5; + if (current < value) + current = value; + write_backlight_value((unsigned char)current); + usleep(50000); + } + } +} + +void usage(char* argv0) { + printf("Apple Macbook (pro) backlight control " VERSION); + printf("\n"); + printf("Usage:\n"); + printf("%s: read current value\n", argv0); + printf("%s value: write value [0-255]\n", argv0); + printf("%s +n: increase value by n\n", argv0); + printf("%s -n: decrease value by n\n", argv0); +} + +int main(int argc, char** argv) { + if (argc > 2) { + usage(argv[0]); + return 1; + } + + char* endptr; + int ret = 0; + long address = 0; + long length = 0; + int fd; + int state; + + /* Search for the graphics card. */ + /* Default values: */ + /* address = 0x90300000; */ + /* length = 0x20000; */ + + struct pci_access *pacc = pci_alloc(); + pci_init(pacc); + pci_scan_bus(pacc); + struct pci_dev *dev; + for(dev=pacc->devices; dev; dev=dev->next) { /* Iterate over all devices */ + pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES); + if ((dev->vendor_id == 0x1002) && (dev->device_id == 0x71c5)) { // ATI X1600 + address = dev->base_addr[2]; + length = dev->size[2]; + } + } + pci_cleanup(pacc); + + if (!address) { + printf("Failed to detect ATI X1600, aborting...\n"); + return 1; + } + + fd = open("/dev/mem", O_RDWR); + + if (fd < 0) { + perror("cannot open /dev/mem"); + return 1; + } + + memory = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, address); + + if (memory == MAP_FAILED) { + perror("mmap failed"); + return 1; + } + + /* Is it really necessary ? */ + OUTREG(0x4dc, 0x00000005); + state = INREG(0x7ae4); + OUTREG(0x7ae4, state); + + if (argc == 2) { + if (argv[1][0] == '+') { + long value = strtol(&argv[1][1], &endptr, 10); + if ((value < 0) || (value > 255) || (endptr[0])) { + printf("Invalid value \"%s\" (should be an integer between 0 and 255).\n", &argv[1][1]); + usage(argv[0]); + ret = 1; + } + else { + value = read_backlight()+value; + if (value > 255) + value = 255; + write_backlight(value); + } + } + else if (argv[1][0] == '-') { + long value = strtol(&argv[1][1], &endptr, 10); + if ((value < 0) || (value > 255) || (endptr[0])) { + printf("Invalid value \"%s\" (should be an integer between 0 and 255).\n", &argv[1][1]); + usage(argv[0]); + ret = 1; + } + else { + value = read_backlight()-value; + if (value < 0) + value = 0; + write_backlight(value); + } + } + else { + long value = strtol(argv[1], &endptr, 10); + if ((value < 0) || (value > 255) || (endptr[0])) { + printf("Invalid value \"%s\" (should be an integer between 0 and 255).\n", argv[1]); + usage(argv[0]); + ret = 1; + } + else { + write_backlight(value); + } + } + } + else { + printf("%d\n", read_backlight()); + } + + munmap(memory, length); + close(fd); + + return ret; +} diff --git a/keyboard_brigthness b/keyboard_brigthness new file mode 100755 index 0000000..579753e --- /dev/null +++ b/keyboard_brigthness @@ -0,0 +1,54 @@ +#!/bin/bash + +# set the keyboard brigthness on a Apple MacBook computer +# Copyright (C) 2006 Ludovic Rousseau +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +#set -v +#set -x +BRIGHTNESS=/sys/class/leds/smc\:kbd_backlight/brightness +value=$(cat $BRIGHTNESS) + +if [ -z "$1" ]; then + echo $value + exit +fi + +if [ "$1" = "-h" ]; then + echo "Usage: $0 [-h|arg|+arg|-arg]" + echo + echo "Change the keyboard brigthness to:" + echo " arg" + echo " or current value + arg" + echo " or current value - arg" + echo + echo "Without argument it return the current value" + exit +fi + +if [ $(expr match "$1" "[+-]") = "1" ]; then + value=$((value$1)) +else + value=$1 +fi + +if [ $value -lt 0 ]; then + value=0 +fi + +echo $value > $BRIGHTNESS +cat $BRIGHTNESS + diff --git a/lircd.conf-apple b/lircd.conf-apple new file mode 100644 index 0000000..4365662 --- /dev/null +++ b/lircd.conf-apple @@ -0,0 +1,40 @@ + +# Please make this file available to others +# by sending it to +# +# this config file was automatically generated +# using lirc-0.8.0(devinput) on Fri Aug 25 23:48:04 2006 +# +# contributed by +# +# brand: lircd.conf +# model no. of remote control: +# devices being controlled by this remote: +# + +begin remote + + name apple-frontrow + bits 8 + eps 30 + aeps 100 + + one 0 0 + zero 0 0 + pre_data_bits 24 + pre_data 0x800100 + gap 135862 + toggle_bit 0 + + + begin codes + menu 0x8B + plus 0x73 + minus 0x72 + back 0xA5 + forward 0xA3 + play 0xA4 + end codes + +end remote + diff --git a/macbook-led.sh b/macbook-led.sh new file mode 100755 index 0000000..337e040 --- /dev/null +++ b/macbook-led.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +VERSION=01 + +if [ "$1" == "--help" ]; then + echo " +MacBook LED indicator (v$VERSION) Jason Parekh +Put that SPDIF-out to use! http://jasonparekh.com/linux-on-macbook + +Usage: $0 [dev] + +type Choose between 'disk' (default) or 'net' indicator +dev Use the 'dev' device (eg: 'sda1' or even just 'sda' for all partitions) + +Examples: + $0 Monitors all block devices activity (disk and CD/DVD drives) + $0 disk sda Monitors all disk drives activity + $0 net eth0 Monitors LAN activity + $0 net Monitors all network activity (WARNING: wlan0 will pickup ANY wifi activity) + $0 net ath0 Monitors wireless activity +" + exit +fi + +STATS_FILE="/proc/diskstats" + +if [ "$1" == "net" ]; then + STATS_FILE="/proc/net/dev" +fi + +STATS_CMD="cat $STATS_FILE" +if [ "$2" != "" ]; then + STATS_CMD="grep $2 $STATS_FILE" +fi + +renice 19 -p $$ >/dev/null 2>&1 + +while [ 1 ]; do + CUR_STATS=`$STATS_CMD` + if [ "$CUR_STATS" != "$LAST_STATS" ]; then + if [ "$LAST_OP" != "ACTIVE" ]; then + amixer set IEC958 on >/dev/null 2>&1 + fi + LAST_OP="ACTIVE" + else + if [ "$LAST_OP" != "IDLE" ]; then + amixer set IEC958 off >/dev/null 2>&1 + fi + LAST_OP="IDLE" + fi + LAST_STATS="$CUR_STATS" + sleep 0.2 +done + diff --git a/macbook-lightd b/macbook-lightd new file mode 100755 index 0000000..f878042 --- /dev/null +++ b/macbook-lightd @@ -0,0 +1,41 @@ +#!/bin/bash +# +# applesmc keyboard backlight sample test daemon +# by Silvan Calarco +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License v2 as published by the +# Free Software Foundation. +# +SENSIBILITY=25 +TIMEWAIT=2 +BLINDOFF=50 +BLINDON=100 +SENSOR_FILE=/sys/devices/platform/applesmc.768/light + +[ -e $SENSOR_FILE ] || exit 1 + +while [ "1" ]; do + eval `cat $SENSOR_FILE|sed "s|(\(.*\),\(.*\))|LIGHTL=\1 LIGHTR=\2|"` >/dev/null + if [ "$LIGHTR" ]; then + if [ $LIGHTL -gt $LIGHTR ]; then + LIGHTM=$LIGHTL + else + LIGHTM=$LIGHTR + fi +# LIGHTM=`expr \( $LIGHTL + $LIGHTR \) / 2` + BACKLIGHT=`expr 255 - $LIGHTM \* $SENSIBILITY` + if [ $BACKLIGHT -lt $BLINDOFF ]; then + BACKLIGHT=0 + elif [ $BACKLIGHT -lt $BLINDON ]; then + BACKLIGHT=`expr $BACKLIGHT + 50` + else + [ $BACKLIGHT -gt 255 ] && BACKLIGHT=255 + fi + echo "LightM=$LIGHTM Backlight=$BACKLIGHT " + applesmc $BACKLIGHT +# echo $BACKLIGHT > /sys/devices/platform/applesmc.768/keyboard_backlight +# CURRBACKLIGHT=$BACKLIGHT + sleep $TIMEWAIT + fi +done diff --git a/macbook-modprobe b/macbook-modprobe new file mode 100644 index 0000000..44c76e7 --- /dev/null +++ b/macbook-modprobe @@ -0,0 +1 @@ +options hid_apple fnmode=2 diff --git a/macbook-set-input b/macbook-set-input new file mode 100755 index 0000000..03ec738 --- /dev/null +++ b/macbook-set-input @@ -0,0 +1,12 @@ +#!/bin/sh +# +# Start commands for keyboard mapping and commands inside an X session +# Copyright (c) 2007-2008 by Silvan Calarco +# Released under the terms of the GNU GPL License version 3 +# + +# Check for an Apple chassis or exit + +[[ `hal-get-property --udi /org/freedesktop/Hal/devices/computer --key system.chassis.manufacturer 2>/dev/null | grep Apple 2>/dev/null` ]] && { + xkbset m +} \ No newline at end of file diff --git a/macbook-tools-init b/macbook-tools-init new file mode 100755 index 0000000..c78cbe5 --- /dev/null +++ b/macbook-tools-init @@ -0,0 +1,84 @@ +#!/bin/bash +# +# Macbook tools initscript +# Copyright (c) 2006-2009 by Silvan Calarco +# Released under the GPL v.2 license +# +# /etc/rc.d/init.d/macbook-tools +# +# chkconfig: 345 42 58 +# description: set screen backlight level and load iSight firmware on Apple MacBooks +# processname: macbook-tools + +# Source function library. +. /etc/rc.d/init.d/functions + +[ -e /etc/sysconfig/machine ] && . /etc/sysconfig/machine + +# Check for Apple manufacturer or exit +[ "${SYSTEM_MANUFACTURER:0:5}" = "Apple" ] || { + sed -i "s|KEYMAP=it-macbook|KEYMAP=it|" /etc/vconsole.conf + exit 0 +} + +[ -f /etc/sysconfig/macbook-tools ] && . /etc/sysconfig/macbook-tools + +sed -i "s|KEYMAP=it$|KEYMAP=it-macbook|" /etc/vconsole.conf + +[ "$BACKLIGHT_LEVEL" ] || BACKLIGHT_LEVEL=190 + +RETVAL=0 + +# +# See how we were called. +# + +start() { + [ -e /sys/devices/platform/applesmc.768 ] || modprobe applesmc + + if [ "$IR_EVENT_DEVICE" ]; then + echo -n "Starting lircd for Apple IR remote: " + lircd -H macmini /etc/lirc/apple/lircd.conf.macmini + evaluate_retval + echo + fi + + #echo -n "Setting middle and right click mouse emulation: " + #echo 1 > /proc/sys/dev/mac_hid/mouse_button_emulation + #echo 125 > /proc/sys/dev/mac_hid/mouse_button2_keycode + #echo 96 > /proc/sys/dev/mac_hid/mouse_button3_keycode + #evaluate_retval + #echo + + echo -n "Loading MacBook light sensor control daemon: " + macbook-lightd &>/dev/null & + evaluate_retval + echo +} + +stop() { + echo -n "Stopping MacBook light sensor control daemon: " + killall -9 macbook-lightd + evaluate_retval + echo +} + +restart() { + stop + start +} + +case "$1" in +start) + start + ;; +restart) + restart + ;; +*) + INITNAME=`basename $0` + echo "Usage: $INITNAME {start|restart}" + exit 1 +esac + +exit $RETVAL diff --git a/macbook-tools-sysconfig b/macbook-tools-sysconfig new file mode 100644 index 0000000..ae58dd7 --- /dev/null +++ b/macbook-tools-sysconfig @@ -0,0 +1,2 @@ +ISIGHT_FIRMWARE_FILE=/mnt/osx/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBVideoSupport.kext/Contents/MacOS/AppleUSBVideoSupport +IR_EVENT_DEVICE=/dev/appleir diff --git a/macbook_set_input.desktop b/macbook_set_input.desktop new file mode 100644 index 0000000..3d560b5 --- /dev/null +++ b/macbook_set_input.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Encoding=UTF-8 +X-KDE-autostart-phase=1 +Type=Application +Exec=macbook-set-input +OnlyShowIn=KDE; +Name=Set MacBook input devices