Need info about ACPI - implementing, done ....

Artur Bać artur at ebasoft.com.pl
Sun Jan 27 19:35:01 PST 2008


Saturday 26 of January 2008 23:42:03 Mikael Ikivesi napisał(a):
> I really hope you can make it.
 
Idid it! after 3 days of diging acpi specifications , till i found

http://www.microsoft.com/whdc/system/pnppwr/wmi/wmi-acpi.mspx

I'm so happy becouse this is my first at all kernel module/driver 
in my life i have ever written.

very hot uncleaned code atached bellow.

Short abstract, tomorrow I will write more,
There is no ACPI , there is Microsoft invention combo  of ACPI+WMI+MOF
so we call acpi  method which calls wmi method with code located in bios or 
embbeded as MOF data into acpi ...

  
First Historical output :D
System Information
        Manufacturer: FUJITSU SIEMENS
        Product Name: AMILO A1650G

# /etc/rc.d/netif start
Starting wpa_supplicant.
ath0: no link ..... got link
DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 4
DHCPOFFER from 192.168.0.1
DHCPREQUEST on ath0 to 255.255.255.255 port 67
DHCPACK from 192.168.0.1
bound to 192.168.0.60 -- renewal in 180000 seconds.

ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:02:e3:48:d6:61
        inet 192.168.0.60 netmask 0xffffff00 broadcast 192.168.0.255


# kldstat
Id Refs Address            Size     Name
 1   10 0xffffffff80100000 b10888   kernel
........
 7    1 0xffffffff9f09c000 70c      fujsieko

Makefile place with fujsie.c
-------------------------------
KMOD=   fujsie  
CFLAGS+= -I/usr/src/sys/contrib/dev/acpica
SRCS=   fujsie.c opt_acpi.h acpi_if.h bus_if.h device_if.h opt_ddb.h
.include <bsd.kmod.mk>

file: fujsie.c, place anywhere
-------------------------------------
/*
*  C Implementation: fujsie
*
* Description: Simple module for enablic Wireless Lan module of 
Fujitsu-Siemens Amilo1650G
* Author: Artur_Bac <artur_at_ebasoft.com.pl>, (C) EBASoft 2008
* BSD Licence, see licence atached to FreeBSD OS.
*
*/

#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/sys/dev/acpi_support/acpi_fujsie.c,v 1.00 alpha 
2008/26/01 artbac Exp $");

#include "opt_acpi.h"
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <contrib/dev/acpica/acpi.h>
#include <sys/module.h>
#include <dev/acpica/acpivar.h>
#include <sys/sysctl.h>
#include "acpi_if.h"
#include <sys/sysctl.h>

#define MY_MODULE_NAME "FujitsuSiemens"
ACPI_MODULE_NAME(MY_MODULE_NAME);

#define AMW0_REGISTER_MASK 0x35
#define AMW0_UNNOWN_MAGIC 0x9610

struct acpi_fujsie_softc {
        device_t        dev;
        ACPI_HANDLE     handle;

};

static int      acpi_fujsie_probe(device_t dev);
static int      acpi_fujsie_attach(device_t dev);
static int      acpi_fujsie_detach(device_t dev);

static device_method_t acpi_fujsie_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe, acpi_fujsie_probe),
        DEVMETHOD(device_attach, acpi_fujsie_attach),
        DEVMETHOD(device_detach, acpi_fujsie_detach),
        {0, 0}
};
static driver_t acpi_fujsie_driver = {
        "acpi_fujsie",
        acpi_fujsie_methods,
        sizeof(struct acpi_fujsie_softc),
};

static devclass_t acpi_fujsie_devclass;


DRIVER_MODULE(acpi_fujsie, acpi, acpi_fujsie_driver, acpi_fujsie_devclass, 0, 
0);
MODULE_DEPEND(acpi_fujsie, acpi, 1, 1, 1);
MODULE_VERSION(acpi_fujsie, 1);
ACPI_SERIAL_DECL(fujsie, "Fujitsu-Siemens ACPI");

static int      acpi_fujsie_probe(device_t dev)
{
        char *str;
        static char *fujsie_ids[] = { "pnp0c14",NULL}; //"pnp0c14"

        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);

        str = ACPI_ID_PROBE(device_get_parent(dev), dev, fujsie_ids);
        //device_printf(dev, "%X %X %X\n", 
dev,*(unsigned*)dev,*(unsigned*)device_get_parent(dev));
        if (    acpi_disabled(MY_MODULE_NAME)
                ||      str  == NULL 
                ||      device_get_unit(dev) != 0 )
                return (ENXIO);
        
        device_set_desc(dev, "Fujitsu-Siemens ACPI Wireless Lan Switch Module 
probed");
        //device_printf(dev, "Accepted for Wireless\n");
        return 0;
}

static uint8_t
acpi_fujitsu_check_hardware(struct acpi_fujsie_softc *sc);

static int      acpi_fujsie_attach(device_t dev)
{
        struct acpi_fujsie_softc *sc;
        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);

        sc = device_get_softc(dev);
        sc->dev = dev;
        sc->handle = acpi_get_handle(dev);

        ACPI_SERIAL_BEGIN(fujsie);
        acpi_fujitsu_check_hardware(sc);
        ACPI_SERIAL_END(fujsie);

        return 0;
}
static int      acpi_fujsie_detach(device_t dev)
{
        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
        return 0;
}
typedef struct wmab_args_in_t {
        UINT32 eax;
        UINT32 ebx;
        UINT32 ecx;
        UINT32 edx;
} WMAB_ARGS_IN;
typedef struct wmab_args_out_t {
        UINT32 eax;
        UINT32 ebx;
        UINT32 ecx;
        UINT32 edx;
        UINT32 eex;
} WMAB_ARGS_OUT;
static uint8_t
acpi_fujitsu_check_hardware(struct acpi_fujsie_softc *sc)
{
        WMAB_ARGS_IN wmi_data = { AMW0_UNNOWN_MAGIC, (( 1<<8 ) | 
AMW0_REGISTER_MASK), 
0, 0 };
        ACPI_BUFFER wmi_result;

        //Length of params buffer of arg 2
        static const UINT32 ARG_BUFF_LENGTH = sizeof(WMAB_ARGS_IN);
        //ACPI_BUFFER buff;
        //buff.Length = ARG_BUFF_LENGTH;
        //buff.Pointer = (UINT8 *)wmi_data;
        
        ACPI_OBJECT wmi_args[3] ;
        ACPI_OBJECT_LIST wmi_args_list;

        //Arguments for WMAB
        wmi_args[0].Type = ACPI_TYPE_INTEGER;
        wmi_args[0].Integer.Value = 1;
        wmi_args[1].Type = ACPI_TYPE_INTEGER;
        wmi_args[1].Integer.Value = 1;

        wmi_args[2].Type = ACPI_TYPE_BUFFER;
        wmi_args[2].Buffer.Length = ARG_BUFF_LENGTH;
        wmi_args[2].Buffer.Pointer = (UINT8 *) &wmi_data;
        
        //Prepare list
        wmi_args_list.Count= 3;
        wmi_args_list.Pointer = wmi_args;

        wmi_result.Pointer = NULL;
        wmi_result.Length = ACPI_ALLOCATE_BUFFER;
        
        AcpiEvaluateObject(sc->handle, "WMAB", &wmi_args_list, &wmi_result);
        AcpiOsFree( wmi_result.Pointer );
        device_printf(sc->dev, "Set,works ?\n");

        return TRUE;
}



More information about the freebsd-acpi mailing list