martes, 16 de agosto de 2016

Instalar MySQL server en un servidor linux y configurarlo

Esta guía indica como instalar MySQL server en cualquier servidor basado en la distribución Debian (Ubuntu, Raspi OS, etc)

Primer paso: instalar MySQL server, para esto ejecutamos:

$ sudo apt-get install mysql-server


Posteriormente, para realizar la configuración de MySQL se puede ejecutar el comando:

$ mysql_secure_installation

Seguir los pasos que solicita el script para la configuración de MySQL Server

Segundo paso: necesitamos configurar las opciones para poder conectarnos de forma remota a la base de datos, para esto editamos el archivo mysqld.cnf en las versiones más nuevas:

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf 

comentamos las siguiente línea:

# bind-address 127.0.0.1

y reiniciamos:

$ sudo systemctl restart mysql.service

En las versiones más antiguas de Ubuntu Server, el archivo a editar es:

$ sudo nano /etc/mysql/my.cnf

y comentamos la siguiente línea, de esta forma:

# bind-address 127.0.0.1

reiniciamos el servicio mysql ejecutando:

$ sudo /etc/init.d/mysql restart

Sí no realizamos estos pasos, al querer ingresar a la base de datos de forma remota, aparecerá un mensaje como el siguiente:

Failed to Connect to MySQL at 192.168.0.xxx:3306 with user TU_USUARIO

Can't connect to MySQL server on '192.168.0.xxx' (111)

Tercer paso: ahora configuramos los usuarios permitidos para hacer gestión remota de la base de datos.

Lo mas probable es que ahora al intentar ingresar te aparezca un error como este:

Failed to Connect to MySQL at 192.168.0.xxx:3306 with user TU_USUARIO

Host 'miDispositivo' is not allowed to connect to this MySQL server

Entonces, en la terminal del servidor ejecutamos:

$ mysql -u root -p


Necesitamos ingresar el password del usuario root para realizar esto. Ya una vez adentro de la consola de mysql, creamos un usuario para gestión y le damos permisos de la siguiente forma:

mysql> CREATE USER 'tuUsuario'@'localhost' IDENTIFIED BY 'tuPassword';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'tuUsuario'@'localhost' WITH GRANT OPTION;
mysql> CREATE USER 'tuUsuario'@'%' IDENTIFIED BY 'tuPassword';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'tuUsuario'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

Es muy recomendable crear un usuario diferente de root para la administración de la base de datos, este usuario va a tener todos los permisos de un administrador.

De todas formas, si es necesario dar acceso a root desde cualquier IP, se debe ejecutar los siguientes comando:

mysql> CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'tuPassword';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

Listo, con esto el servidor está listo para ser usado.

martes, 17 de mayo de 2016

Habilitar el bus SPI en Olimex Olinuxino A20 y similares

Saludos

En esta ocasión indicaré los pasos que seguí para habilitar el módulo SPI en el espacio de usuario, en Olinuxino A20 Micro, con un kernel mainline compilado por mi (los detalles para compilar tu propio kernel los daré posteriormente).

IMPORTANTE antes de continuar:
Esta guía requiere que tengas nociones de programación, y experiencia compilando el kernel Linux.

Es necesario que dispongas del código fuente de Linux, descarga el código desde el repositorio de  tu preferencia, recomiendo la última versión estable (a la fecha la 4.9.30, ya que las versiones anteriores tienen problemas con el controlador Ethernet).

Primer paso (Reconocer el hardware): Lo más probable es que hayas comprobado que tu módulo SPI no está disponible en el espacio de usuario, es decir, si ejecutas

ls /dev/spi*

el comando no encontrará ningún dispositivo SPI, caso contrario aparecerá algo similar a esto:

/dev/spidev1.0
/dev/spidev1.1

El driver del kernel asigna los nombres spidevX.Y a los buses SPI que se encuentren configurados, siendo X el numero de puerto (del alias, no del puerto físico, esto será aclarado posteriormente), es decir:
SPI1 = spidev0.Y
SPI2 = spidev1.Y

el valor Y viene a ser el índice del dispositivo colgado al bus, por ejemplo, tenemos dos dispositivos conectados al puerto SPI2, cada uno de ellos con su propia línea de chip select csY, entonces:

dispositivo 1: (cs0) = spidev1.0
dispositivo 2: (cs1) = spidev1.1


La siguiente imagen muestra los puertos disponibles en el Olinuxino A20



Entonces, por ejemplo, mi aplicación utiliza dos dispositivos SPI, los cuales he conectado en el GPIO-3, en los pines

  • SPI2-CS1 -> 24      -  PB13
  • SPI2-CS0 -> 26      -  PB14
  • SPI2-CLK -> 28      -  PB15
  • SPI2-MOSI -> 30    -  PB16
  • SPI2-MISO -> 32    -  PB17
Aprovechando que estos pines CS0 y CS1 son propios del módulo SPI2.

Segundo paso (Definir el hardware):
Ahora vamos a habilitar el módulo dentro del árbol de dispositivos, el cual es un archivo que define la estructura de hardware del dispositivo, el driver usa ésta información para permitir el acceso a los buses tal y como indiqué anteriormente; para esto vamos a sacar una copia de respaldo y a editar el siguiente archivo:

cp RUTA_DEL_CODIGO/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts RUTA_DEL_CODIGO/arch/arm/boot/dts/sun7i-a20-olinuxino-micro-original.dts


Abrimos el archivo sun7i-a20-olinuxino-micro.dts, el cual viene por defecto con la siguiente configuración del SPI:


&spi2 {
    pinctrl-names = "default";
    pinctrl-0 = <&spi2_pins_a>,
         <&spi2_cs0_pins_a>;
    status = "okay";
};

Y hacemos el cambio para configurar nuestros dispositivos:


&spi2 {
    pinctrl-names = "default";
    pinctrl-0 = <&spi2_pins_b>,
         <&spi2_cs0_pins_b>,          <&spi2_cs1_pins_a>;     status = "okay";          spi2_0 {         #address-cells = <1>;         #size-cells = <0>;         compatible = "spidev";
        reg = <0>;         spi-max-frequency = <50000000>;     };
    spi2_1 {         #address-cells = <1>;         #size-cells = <0>;
        compatible = "spidev";
        reg = <1>;         spi-max-frequency = <50000000>;     };
};


El índice del dispositivo será reg = <Y>;

En estas líneas estamos activando los dispositivos para el espacio de usuarios, es decir, ahora podemos abrir el SPI accediendo a su respectivo /dev/spidevX.Y, aquí se crean los alias.

Ahora es necesario también editar el archivo sun7i-a20.dtsi el cual originalmente viene con el siguiente fragmento de código:


spi2_pins_a: spi2@0 {
                allwinner,pins = "PC20", "PC21", "PC22";
                allwinner,function = "spi2";
                allwinner,drive = <SUN4I_PINCTRL_10_MA>;
                allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
            };

            spi2_pins_b: spi2@1 {
                allwinner,pins = "PB15", "PB16", "PB17";
                allwinner,function = "spi2";
                allwinner,drive = <SUN4I_PINCTRL_10_MA>;
                allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
            };

            spi2_cs0_pins_a: spi2_cs0@0 {
                allwinner,pins = "PC19";
                allwinner,function = "spi2";
                allwinner,drive = <SUN4I_PINCTRL_10_MA>;
                allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
            };

            spi2_cs0_pins_b: spi2_cs0@1 {
                allwinner,pins = "PB14";
                allwinner,function = "spi2";
                allwinner,drive = <SUN4I_PINCTRL_10_MA>;
                allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
            };

Analizando este fragmento de código, nos podemos dar cuenta que nuestro dispositivo puede utilizar la configuración spi2_pins_b con spi2_cs0_pins_b, pero no disponemos del segundo chip select que requerimos, el cual está conectado a PB13, entonces necesitamos agregar ésta opción, mediante el siguiente fragmento de código:

            spi2_cs1_pins_a: spi2_cs1@0 {
                allwinner,pins = "PB13";
                allwinner,function = "spi2";
                allwinner,drive = <SUN4I_PINCTRL_10_MA>;
                allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
            };

Con este cambio ahora las opciones de pines son spi2_pins_b, spi2_cs0_pins_b además de spi2_cs1_pins_a (que fue agregado en este último paso), y por ésta razón se seleccionan estos pines en el archivo sun7i-a20-olinuxino-micro.dts.

Ahora, para que todo esto funcione, es necesario que el driver SPI tenga habilitada la opción para uso en el espacio de usuarios, para esto es necesario configurar el código fuente y compilarlo.


Tercer paso (Habilitación del driver en el kernel):

Accedemos al menú de configuración del kernel ejecutando:

make ARCH=arm CROSS_COMPILE=/RUTA/DE/TU/COMPILADOR/arm-linux-gnueabihf- menuconfig


Activar la opción para que sea compilada en el kernel y no como modulo:
  •  Device Drivers --->
  • SPI support --->
  • User mode SPI device driver support

Realizar las configuraciones que se requieran y guardarlas, para luego ejecutar:

make ARCH=arm CROSS_COMPILE=/RUTA/DE/TU/COMPILADOR/arm-linux-gnueabihf- -j4 zImage dtbs


La opción j4 índica el número de núcleos usados para la compilación, depende de tu procesador, donde 4 indica 4 núcleos.


Luego se ejecuta:


make ARCH=arm CROSS_COMPILE=/RUTA/DE/TU/COMPILADOR/arm-linux-gnueabihf- INSTALL_MOD_PATH=output -j4 modules_install


Esto para compilar e instalar los módulos en la ubicación output dentro de la ubicación donde estés compilando el código, y posteriormente copiar los archivos generados en la compilación y sustituirlos por los que tengas en tu dispositivo.