Note for English Readers

If I write the articles in Indonesian, I will write a summary in English so that you can read my articles too. After you read the summary and you feel that you need more information about that, please do not hesitate to contact me via e-mail that can be found in my profile.

Thank you for reading my blogs.

Monday, June 13, 2011

ATI Catalyst Proprietary Display Driver & kernel-2.6.39.x

Updated: I have renewed all links for the patch. If you still have problem with the link, do not hesitate to contact me. Thank you for all you that have informed me about this link problem.

Again, we need to patch the source code of fglrx kernel module, part of ATI Catalyst (you will find it on /lib/modules/fglrx after installation), for kernel 2.6.39.x since there are some changes on the kernel. On this post, I will show how to patch ATI Catalyst 11.x (tested on 11.5) and 10.10 - 10.12 (tested on 10.12) so that it works on 2.6.39.x (tested on 2.6.39.1).

ATI Catalyst 11.x
First, download 2 files: 2.6.39_bkl.patch and no_bkl.patch (Thank's to https://aur.archlinux.org/packages.php?ID=41040 and http://www.mindwerks.net/2011/04/ubuntu-11-04-natty-with-fglrx-and-2-6-39). Copy those files to /lib/modules/fglrx/build_mod then run these commands:
patch -p1 < 2.6.39_bkl.patch
patch -p1 < no_bkl.patch
Next step, execute ./make.sh and if there is no error, change directory to /lib/modules/fglrx then execute ./make_install.sh

ATI Catalyst 10.10 - 10.12
You have to download this patch: fglrx_10.10-12_with_2.6.39.x.patch. Copy this file to /lib/modules/fglrx/build_mod then execute:
patch -p1 < fglrx_10.10-12_with_2.6.39.x.patch
After that, execute ./make.sh and if there is no error, change current working directory to /lib/modules/fglrx then execute ./make_install.sh

Happy patching!

Note: for my other posts about ATI Catalyst, go to this link. You may need to read it.

Saturday, April 30, 2011

Xilinx ISE WebPack on Slackware64

(breaking news) Slackware64-13.37 has been released! Thank's to Pat, Eric, and other maintainers for making this version available.

For a long time, I have struggled with errors on the installation of  Xilinx ISE WebPack on Slackware64 because I want make Slackware64 not only for doing my "office work", but also as the environment for all development software related to my work. So far, I can make design and draw PCB artwork on Slackware64 using gEDA and pcb. Also, I am able to compile and use gcc cross-compilers for AVR and ARM-based embedded systems. However, if I want to develop "some hardware" on FPGA using Verilog HDL, I must switch to other OS that I really don't like it. Finally, I can install Xilinx ISE WebPack on Slackware64. Thank's to Philip Pemberton that has written the solution on Ubuntu 64-bit version.

The installation problem occurs only when you try to install it on 64-bit version of Linux. I have tried it on Slackware64 and Ubuntu 64-bit version, all trials are failed. The solution is just install 32-bit version of Xilinx ISE on Slackware64. By Philip's reference, here is the step of installation:
  • Download the Xilinx ISE (any latest Linux version or complete version) and extract the installer.
  • Enter the installer directory.
  • Install it with this command (must be root): linux32 ./xsetup
  • Follow the instructions.
  • Enter the installation directory (if you don't change the default, it should be /opt/Xilinx/[ISE_version]
  • Create a script: startise.sh (if you use vim, just type: vim startise.sh)
  • Put a few lines below on the script (in my case, I install Xilinx ISE 13.1. If you use different release number, just change the "13.1" to the correct one):

    #!/bin/bash
    source /opt/Xilinx/13.1/ISE_DS/settings32.sh /opt/Xilinx/13.1/ISE_DS/
    ise

  • Don't forget to make it executable: chmod +x startise.sh
  • Execute the script to start Xilinx ISE.

Here is the screenshot of Xilinx ISE on Slackware64 inside my laptop:




    Thursday, April 21, 2011

    myPhone @ES6192


    "myPhone @ES6192" is my final assignment on ES6192 course (Embedded Operating Systems). I worked on this assignment together with my partner, Rahmady. This assignment simulates a phone dialer. We had to develop device drivers and application software that could be performed on ARM-based Embedded System with Linux as its operating system.

    We developed device drivers for simple I/O on the board: 4 LEDs, 7's Segment LED displays, and 4x4 keyboard. For LCD screen, we use framebuffer driver that has already built on the kernel. The keyboard driver can handle interrupt, also, use tasklet, work queue, and  FIFO circular buffer to manage the data.

    The application software is multithreaded; it has 6 threads (excluding main thread) for handling all processes such as manipulating I/O devices (4 threads), updating clock (1 thread), and controlling whole system by setting the operating modes based on user’s input (1 thread). For managing shared data, we use semaphores. 


    Modes on “myPhone @ES6192”:

    • display clock mode or cancel key on phone dialer and off-hook mode by pressing “C” key
    • adjust clock mode by pressing “D” key
    • phone dialer mode by pressing “E” key
    • off-/on-hook by pressing “F” key (toggled)
    • backspace key on adjust clock and phone dialer mode by pressing “A” key

    Structure of "myPhone @ES6192":


    Video demo:

    Friday, March 25, 2011

    How to make touchpad/clickpad temporarily disable when typing?

    Since my laptop has clickpad that has larger area and more sensitive than common touchpad, I get an annoying behavior of my clickpad; when I type and my thumb or palm accidentally touches or near the clickpad, the cursor will be moved to the position that is pointed by mouse pointer, so that, I will continue to type in the wrong position! I hate this behavior! I have to disable my clickpad when I am typing. There are two methods:

    Method 1, I disable my clickpad permanently. I run this script to toggle on/off my clickpad:
    #!/bin/bash
    #Toggle touchpad
    SYNSTATE=$(synclient -l | grep TouchpadOff | awk '{ print $3}')
    # change state
    if [ $SYNSTATE = 0 ]; then
      synclient touchpadoff=1
    elif [ $SYNSTATE = 1 ]; then
      synclient touchpadoff=0
    fi

    Method 2, I use /usr/bin/syndaemon to disable my clickpad only when I am typing. The steps:
    1. Make ~/.xprofile
      #!/bin/sh
      # Customize X environment
      #
      # Activate syndaemon for monitoring keyboard activity and disabling # the touchpad when the keyboard is being used.
      /usr/bin/syndaemon -td
    2. Add these lines on the top of /usr/bin/startkde (if you use KDE as the default desktop manager) in order to make X server executes ~/.xprofile when it starts.
      if [ -r /etc/xprofile ]; then
              source /etc/xprofile
      fi
      if [ -r $HOME/.xprofile ]; then
              source $HOME/.xprofile
      fi
    3. Restart X server.
    Currently, I use method 2 because I only disable my clickpad temporarily when syndaemon detects keyboard action and resume my clickpad function within 2 seconds after the last key pressed. For more information about syndaemon, type: man syndaemon on your console.

    Thursday, March 24, 2011

    Synaptics-1.4.0 patch for activating right-click function on clickpad

    Last month, I have written about how to activate right-click function on clickpad by patching synaptics-1.3.0. In this page, I will show you how to patch synaptics-1.4.0 so that you can use right-click function (also, middle-click). The patch is patch for synaptics-1.3.0 with a few changes. For the modified patch, you can download it from here (gzip compressed). You can follow the instructions from my last note; just change the step 3 with this: copy this file to path-to/x11/patch/ (in my case, copy it to /home/henry/rsync/x11/patch/). The rest will be same. I also put my clickpad.conf on google docs so that you can download it and place it in /etc/X11/xorg.conf.d/ then restart the X server.

    Tuesday, March 22, 2011

    ATI Catalyst Proprietary Display Driver 10.12 & kernel-2.6.38

    If you want to use ATI Catalyst Proprietary Display Driver 10.12 on your PC/Laptop that running kernel 2.6.38, you will get error because the installer cannot create fglrx kernel module. You need to patch ATI Catalyst kernel module before you compile it manually. Here is the patch:

    --- ./firegl_public.c   2010-12-02 22:28:43.000000000 +0100
    +++ ./firegl_public.c.new       2011-01-09 17:40:22.000000000 +0100
    @@ -320,7 +320,7 @@
         return firegl_release((KCL_IO_FILE_Handle)filp);
     }

    -int ip_firegl_ioctl(struct inode* inode, struct file* filp, unsigned int cmd, unsigned long arg)
    +int ip_firegl_ioctl(struct file* filp, unsigned int cmd, unsigned long arg)
     {
         return firegl_ioctl((KCL_IO_FILE_Handle)filp, cmd, arg);
     }
    @@ -407,7 +407,7 @@
     #endif
         open:    ip_firegl_open,
         release: ip_firegl_release,
    -    ioctl:   ip_firegl_ioctl,
    +    unlocked_ioctl:   ip_firegl_ioctl,
         mmap:    ip_firegl_mmap,

         write:   ip_firegl_write,
    @@ -840,7 +840,12 @@ static int fglrx_pci_suspend(struct pci_
          * happen much less frequent then without this workaround.
          */
         if (state == PM_EVENT_SUSPEND)
    +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
    +        console_lock();
    +#else
             acquire_console_sem();
    +#endif
    +

         if (firegl_cail_powerdown(privdev, state))
             ret = -EIO;
    @@ -862,7 +867,11 @@ static int fglrx_pci_suspend(struct pci_
         }

         if (state == PM_EVENT_SUSPEND)
    +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
    +        console_unlock();
    +#else
             release_console_sem();
    +#endif

         KCL_DEBUG_TRACEOUT(FN_FIREGL_ACPI, ret, NULL); 
        
    @@ -886,7 +895,11 @@ static int fglrx_pci_resume(struct pci_d
         if (PMSG_EVENT(pdev->dev.power.power_state) == 0) return 0;

         if (PMSG_EVENT(pdev->dev.power.power_state) == PM_EVENT_SUSPEND)
    +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
    +        console_lock();
    +#else
             acquire_console_sem();
    +#endif

     #ifdef FIREGL_USWC_SUPPORT
         // Restore the PAT after resuming from S3 or S4.
    @@ -911,7 +924,11 @@ static int fglrx_pci_resume(struct pci_d
         firegl_cail_powerup(privdev);

         if (PMSG_EVENT(pdev->dev.power.power_state) == PM_EVENT_SUSPEND)
    +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
    +        console_unlock();
    +#else
             release_console_sem();
    +#endif

         PMSG_EVENT(pdev->dev.power.power_state) = 0;
         KCL_DEBUG_TRACEOUT(FN_FIREGL_ACPI, 0, NULL); 

    @@ -5107,7 +5107,7 @@
     unsigned int ATI_API_CALL KAS_Mutex_Initialize(void* hMutex)
     {
         kasMutex_t* mutex_obj = (kasMutex_t*)hMutex;
    -    init_MUTEX(&(mutex_obj->mutex));
    +    sema_init(&(mutex_obj->mutex),1);
         return 1;
     }

    --- ./kcl_ioctl.c       2010-12-02 22:28:43.000000000 +0100
    +++ ./kcl_ioctl.c.new   2011-01-09 17:40:22.000000000 +0100
    @@ -193,7 +193,7 @@
      */
     void* ATI_API_CALL KCL_IOCTL_AllocUserSpace32(long size)
     {
    -    void __user *ret = COMPAT_ALLOC_USER_SPACE(size);
    +    void __user *ret = arch_compat_alloc_user_space(size);

         /* prevent stack overflow */
         if (!access_ok(VERIFY_WRITE, ret, size))

    Save this patch to file and follow the instructions that I have written on http://henryhermawan.blogspot.com/2011/02/problem-when-using-ati-catalyst.html.

    Reference: http://groups.google.com/group/linux.debian.bugs.dist/browse_thread/thread/3b716dfe326fef23?pli=1

    Saturday, March 12, 2011

    dmesg: operation not permitted as user


    After upgrading to Slackware64 13.37, I cannot access the kernel syslog (dmesg) as user. This problem is caused by kernel (2.6.37.3) setting in Slackware (see pictures below).



    There are 2 solutions, you are freely to choose one of them.

    Solution 1: add these lines on your rc.local:
    if [ -r /proc/sys/kernel/dmesg_restrict ]; then
        if [ $(cat /proc/sys/kernel/dmesg_restrict) = 1 ]; then
            echo 0 > /proc/sys/kernel/dmesg_restrict
        fi
    fi

    Solution 2: change the correspond kernel setting (restrict unprivileged access to the kernel syslog) to "N" then recompile the kernel.