[tlinux-users:08497] Re: reg:ToshibaA100-139 Fn key

Jaime <[email protected]>
Newsgroups gmane.linux.hardware.toshiba
Message-ID <[email protected]>
I made a small module with reverse engeneering of the Windows driver.
I only tested on my Toshiba Satellite Pro A100 and it works.
To compile:
Edit a Makefile and add:
   obj-m := test.o

then run in the same directory:

  make -C /usr/src/linux SUBDIRS=`pwd` modules

Then make the file for the new device:

  mknod test_file c 181 0

Load de module:

  insmod test.ko

And now, if you are very very lucky, maybe it will work:

   echo 3 > test_file

But I warn: THE MOST PROBABLY THING WILL HAPPEN IS THE FREEZE OF THE
LAPTOP IF YOUR MODEL DOESN'T MATCH EXACTLY WITH THE MODEL I TESTED. If
you don't have a Phoenix BIOS don't try this, and if you have.. well..
it's your election x)

Here is the driver

test.c
=================== CUT HERE ===================
/*
 * Module for Toshiba lcd bright change.
 * I only made it for my Toshiba Satellite Pro A100 with Phoenix BIOS
 * I don't know under which models it works (I suppose very few)
 * The asm code I inserted I took it from a disass of the windows
 * driver provided by Toshiba.
 * WARNING:
 * The driver does NOT make any tests if the model is valid or not
 * so, the MOST probably effect of running this will be the hang of
 * the laptop, or something worse.
 * PLEASE DON'T USE THIS unless you really know what you are doing
 * This module isn't made for give support to any Toshiba model,
 * only for tests purpouses , sorry about it.
 *
 * Jaime F. <[email protected]>
 * License: GNU/GPL
 */


#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>

#define DEVICE_NAME "lcd_bright"
#define MAJOR_NUM 181

char *ptr;

static ssize_t
device_write(struct file *file,
             const char __user * buffer, size_t length, loff_t * offset)
{
  char *addr;
  addr=(char *)__pa(ptr);
  addr+=0x10;

  strcpy(ptr, "INVTOS");
  //ptr+=10;
  *(ptr+16)=(char) buffer[0]-0x30;
  //printk("escribiendo %x\n", *ptr);
/*
  inb( 0x2e);
  inb( 0x2f);
  outb(7, 0x2e);
  outb(9, 0x2f);
  v3=inb(0x2f);
  outb2(0x2e, 0x55);
  outb2(0x2e, 7);
  outb2(0x2f,0x10);
  outb2(0x2e,0xe0);
  v4=inb(0x2f);
  outb2(0x2f,2);
  v5=inb(0x2f);
  outb2(0x2f,3);

  outb2(0x2e, 7);
  outb2(0x2f,9);
  outb2(0x2e,0x60);
  v1=inb(0x2f);
  outb2(0x2e,7);
  outb2(0x2f,0x10);
  outb2(0x2e,0xe0);
  outb2(0x2f,0);
  outb2(0x2e, 7);
  outb2(0x2f, 9);
  outb2 ( 0x2e, 0xaa);
  outb2 ( 0x400, 0xAF);
  v2=inb( 0x401);
  outb2( 0x400, 0xAF);
*/

  __asm__("cli\n"
        /*        "mov $0x01E4, %%eax\n"
                  "mov $0x00b0, %%dx\n"
                  "movb $0x02, 0xEF\n"
                  "out %%eax, %%dx\n"
*/
                "mov %0, %%edx\n"
                "mov %%edx, %%edi\n"
                "mov $0x20, %%ecx\n"
                "mov $0x8000f840, %%eax\n mov $0xcf8, %%edx\n out %%eax, %%dx\n"
                "mov $0xcfc, %%dx\n"
                "in %%dx, %%eax\n"
                "and $0x0000ff80, %%eax\n"
                "add $0x2c, %%eax\n"
                "mov %%ax, %%dx\n"
                "in %%dx, %%eax\n"
                "push %%eax\n"
//              "mov %%ax, %%dx\n"
                "xor %%eax, %%eax\n"
                "out %%eax, %%dx\n"
                "mov $0xA2E4, %%eax\n"
                "mov $0xb2, %%dx\n"
                "out %%eax, %%dx\n"
                "pop %%eax\n"
                "mov $0x102c, %%dx\n"
                "out %%eax, %%dx\n"
/*              "movl $0x10, %%edx\n\t"
                "movl %%edx, %%edi\n\t"
                "movl $0x20, %%ecx\n"
                "movw  $0x00E4, %%ax\n"
                "movb  $0x5, %%ah\n"
                "outw  %%ax, $0xb2\n"
                "movl %%eax, %0\n sti\n"
                */
        :
        :"r"(addr): "%eax", "%edx", "%ecx","%edi", "%esi");
  return length;
}

struct file_operations Fops = {
  .write = device_write,
};

int init_module()
{
  int ret_val;
  ptr=(char *)kmalloc(100, GFP_KERNEL);
  ptr+=10;
  ret_val = register_chrdev(MAJOR_NUM, DEVICE_NAME, &Fops);

  if (ret_val < 0)
  {
    printk(KERN_ALERT "El registro del dispositivo falló (%d)\n", ret_val);
    return ret_val;
  }

return 0;
}

void cleanup_module()
{
  int ret;

  ret = unregister_chrdev(MAJOR_NUM, DEVICE_NAME);

  if (ret < 0)
    printk(KERN_ALERT "Error: unregister_chrdev: %d\n", ret);
}

===================== CUT HERE ====================








On 6/14/07, Mathieu Larose <[email protected]> wrote:
> Hi Atul,
>
>  I know it won't be very useful, but I just want to let you know that I'm in
> the same situation as you. I've tried a lot of "solution", but none of these
> worked. I even contacted Toshiba and Phoenix to get information about this
> BIOS, and they refused to tell me anything. Maybe you should try to contact
> Toshiba you too or start to reverse engineering it on Windows :)
>
>  I know that Mathieu on omnibook has received a lot of request to support
> your model, but without information from Toshiba, he won't do anything.
>
>
>  Mathieu
>
>
> 2007/6/13, atul jain <[email protected]>:
> >
> > Hello  all ,
> >
> >                      i  bought  toshiba A100-139  last week   and
> installed debian etch on it .I found that  the fnfx is not functioning
> >                      so , i am unable to  set  lcd brigthness  and also
> since the bios vendor is pheonix , so  i cannot use
> >                      toshiba utils.
> >
> >
> >                     If anyone   any idea reagarding  this  , please let me
> know.
> >
> >
> >
> > waiting for reply
> >
> >
> > Thanks  in advance
> > --
> >
> > Cheers :)
> > Atul
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.