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