Date: Mon, 28 Jan 2008 04:11:29 +0100 From: Artur =?utf-8?q?Ba=C4=87?= <artur@ebasoft.com.pl> To: freebsd-acpi@freebsd.org Subject: Re: Need info about ACPI - implementing, done .... Message-ID: <200801280411.29358.artur@ebasoft.com.pl> In-Reply-To: <1201387323.7237.2.camel@localhost> References: <200801261837.26708.artur@ebasoft.com.pl> <1201387323.7237.2.camel@localhost>
next in thread | previous in thread | raw e-mail | index | archive | help
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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801280411.29358.artur>
