Pregunta

Tengo un nuevo Pro portátil Toshiba Satellite S300 (Windows XP), que se divierte un acelerómetro 3D para la protección del disco duro. Me gustaría aprovechar los datos enviados por este sensor. Mayor Toshiba portátil / tabletas tenía un DLL que se puede acceder para extraer los datos de aceleración. Por desgracia, el S300 no parecen tener este DLL (DLL El truco se ha documentado en otros lugares, por ejemplo, aquí ).

La aplicación de protección del disco duro (que tiene una visualización linda 3D de un disco duro giratorio que gira en sincronía con la posición del ordenador portátil y de movimiento) no parece depender de cualquier DLL / personalizados "no estándar" (según DependencyWalker) . Parece que se accede a los datos ya sea a través de un servicio y / o por medio de un controlador de dispositivo .sys. Creo que he logrado identificar los archivos pertinentes, pero no tengo ni idea de cómo encontrar, nombre, el acceso, la carga (o "desmontar") las funciones pertinentes.

¿Cómo puedo descubrir y utilizar los datos del acelerómetro?

¿Fue útil?

Solución

He sido capaz de conseguir que funcione con este código (en un Toshiba Satellite Pro S300L-120, Windows 7):

void ReadAccel(float a[3])
{
    HANDLE h = CreateFile(L"\\\\.\\TVALZ", GENERIC_ALL, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    struct dummy
    {
        unsigned long magic1; /* = 0x0000FE00 */
        unsigned long magic2; /* = 0x000000A6 */
        unsigned short x, y;
        unsigned long unknown, z;
        unsigned long direction;
    } d;
    memset(&d, 0, sizeof(d));
    unsigned long retlen;
    d.magic1 = 0x0000FE00;
    d.magic2 = 0xA6;
    d.direction = 0;

    DeviceIoControl(h, 0x222880, &d, sizeof(d), &d, sizeof(d), &retlen, NULL);
    d.magic1 = 0x0000FE00;
    d.direction = 1;
    Sleep(20); /* Doesn't seem to work without the wait */
    DeviceIoControl(h, 0x222880, &d, sizeof(d), &d, sizeof(d), &retlen, NULL);
    signed short x = (d.x & 0x7FFF) * (d.x & 0x8000?-1:1);
    signed short y = (d.y & 0x7FFF) * (d.y & 0x8000?-1:1);
    signed short z = (d.z & 0x7FFF) * (d.z & 0x8000?-1:1);
    a[2] = -(float)z * 9.8 / 205; /* this is just an estimate to go to SI units */
    a[1] = (float)y * 9.8 / 205;
    a[0] = (float)x * 9.8 / 205;
    CloseHandle(h);
}

Puede que no sea muy bonito todavía, pero podemos empezar a jugar:)

He utilizado el TPCHCTL.dll que viene con el monitor de hardware de Toshiba para resolver esto, por cierto.

Otros consejos

En términos generales, las herramientas serán los siguientes:

  • Sysinternals Process Monitor - le puede dar una visión general de ¿qué proceso de Toshiba hace:. qué dispositivos se abre (CreateFile) y que las solicitudes de control de e / S se hace (DeviceIoControl)
  • un desensamblador - mi favorito sería AIF

Es posible tener la suerte de descubrir que el proceso de Toshiba incluye información de depuración extra que la AIF felizmente hacer uso de. Entonces, con toda la información disponible, que tendría que dar sentido a las cosas por su cuenta.

Buena suerte!

Para el registro, acabo presentado una cuestión estrechamente relacionada en Gecko (Firefox et. al. conjunto de aplicaciones) de apoyo acelerómetro, cuyo apoyo a varios dispositivos podrían ser capaces de enviar con la próxima versión principal. : -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top