Archivo

Entradas Etiquetadas ‘modulo’

WiFi USB Conceptronic C150RUSM (RT3070) Editando el módulo para que funcione

Lunes, 7 de Marzo de 2011 Gaspar Fernández 11 comentarios

c150rusm_prodpiczm_1Si habéis adquirido este adaptador Wifi USB, veréis que Linux, al menos hasta la fecha, no lo detecta, es más, pasa de nosotros, y aunque carguemos el driver a mano con modprobe; seguirá sin pasar.

Afortunadamente, no es nada difícil, y es algo que me hace estar un poco más feliz por utilizar software libre, y es que si el driver no reconoce el dispositivo como suyo, voy a presentárselo.

En principio, no sabía qué driver utilizaba el dispositivo. Busqué en los drivers para Windows, y se instalaba el rt2870, por lo que todo el proceso que diré a continuación lo hice con dicho driver, y no conseguí resultados, así que envié un e-mail a Conceptronics, que afortunadamente tardaron menos de 10h en contestar donde me dijeron que el driver era ralink 3070. Así que fui a la página de descarga de drivers para Linux de Ralink. Una vez ahí descargué el driver correspondiente.

Ahora tenemos que descomprimirlo y buscar en qué archivo están la asociación de dispositivos. (Tendremos que buscar la macro USB_DEVICE):

~/temporal/ $ tar xvjf 2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO.tar.bz2
$/temporal/ $ cd 2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO/ # Para qué está el tabulador!
~/temporal/2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO $ egrep -R ‘USB_DEVICE’ *

Vemos que es el archivo common/rtusb_dev_id.c el que tiene todos los dispositivos.

Ahora, con lsusb miramos cuál es el dispositivo USB que tenemos. En algunas versiones no da descripción del dispositivo, o puede que tengamos demasiados dispositivos conectados, podemos probar ejecutar el comando con el dispositivo enchufado y desenchufado, y comparar, así vemos cuál falta.

A mí me detectaba el dispositivo como un Edimax, en la dirección 7392:3734.

En el archivo common/rtusb_dev_id.c, no encontramos ese dispositivo. Tendremos que buscar la línea {USB_DEVICE(0x7392,0x3734)} y dado que no la encontramos, la creamos, al final de todos los dispositivos.

Sólo queda hacer un make && make install y ya tenemos el módulo funcionando. Antes de trabajar con este dispositivo es necesario levantarlo:

$ ifconfig ra0 up

Aunque la mayoría de los gestores de red lo harán bien. El driver no está del todo completo para este dispositivo, pero nos puede hacer el apaño mientras sale un driver mejor. Y así, le vamos perdiendo un poco de miedo al kernel.

Generador de números primos en C

Martes, 15 de Diciembre de 2009 Gaspar Fernández 2 comentarios

Un ejercicio de estos típicos de lenguaje C, es la generación de números primos y la comprobación de éstos. Ni que decir tiene que esta es sólo una de las 13.485,72 maneras (o más) de solucionar este problema. Y es más estamos complicando un poco la cosa, ya que sólo generaremos 10 números, que se almacenarán en un fichero binario, y a la siguiente vez que ejecutamos el programa, se leerá ese último número y seguiremos generando primos a partir de ahí:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <math.h>

// Comprobamos si un número es primo o no
int es_primo(int numero)
{
  int res=0;
  int divs=2;
  int mitad;
  if (numero>2)    // Si el número es mayor a 2, comprobamos si es primo.
    {
      /* Para ahorrar sólo comprobamos si un número es divisible hasta su mitad, ya que 7/2 = 3.xxx, 7/3=2.xxx, 7/4=0.xxx */
      /* cuando empezamos a obtener valores menores que 0, ya no encontraremos más divisores enteros */
      mitad=floor((double)numero/2);
      do
    {
      res=(numero%divs!=0);  /* ¿ El resto es 0 ? */
      //      printf("Divido %d entre %d. Resto %d. Res: %d\n", numero, divs, numero%divs, res);
      divs++;
    } while ((res!=0) && (divs<=mitad));
    }
  else if (numero==2) /* || (numero==1) */ /* ¿1 lo consideramos primo? */
    res=1;

  return res;
}

// Genera primos, los almacenaremos en p, empezamos desde _inicial_ y generamos _cantidad_ de números
void genera_primos (FILE *p, int inicial, int cantidad)
{
  int primos=0;
  int i=inicial;

  printf("INI:%d\n", inicial);
  while (primos<cantidad)
    {
      // Vamos comprobando uno a uno si es primo
      if (es_primo(i))
    {
      fwrite(&i, sizeof(int), 1, p);
      primos++;
      printf("%d\n", i);
    }
      i++;
    }
}


int main()
{
  FILE *p;
  int last_primo;
  // Abrimos el archivo para actualizar
  p = fopen("primos.dat", "a+b");
  if (p)
    {
      fseek(p, -sizeof(int), SEEK_END); /* Nos posicionamos para leer el último entero almacenado. */
      fread(&last_primo, sizeof(int), 1, p); /* Leemos el último */
      fseek(p, 0, SEEK_END); /* Nos posicionamos al final, para seguir escribiendo */
      printf("%d: ",last_primo);
      genera_primos(p, last_primo+1, 10);
      fclose(p);
    }
  else
    printf("No puedo abrir el archivo");
}

De aquí se pueden extraer ideas para hacer muchos ejercicios de este tipo. Eso sí, hay que recordar que para compilar tenemos que incluir la librería matemática. Por ejemplo, con gcc, en el caso de llamar al archivo primos.c, se compilaría:

gcc -lm -o primos primos.c

Visita otras webs de la red