diff --git a/docs/Linux_based_host/SDIO_setup.md b/docs/Linux_based_host/SDIO_setup.md index b975201dd0..1943113db9 100644 --- a/docs/Linux_based_host/SDIO_setup.md +++ b/docs/Linux_based_host/SDIO_setup.md @@ -35,7 +35,7 @@ Please reboot Raspberry-Pi after changing this file. $ cd host/linux/host_control/ $ ./rpi_init.sh sdio ``` -* This script compiles and loads host driver on Raspberry-Pi. It also creates virtual serial interface `/dev/esps0` which is used as a control interface for Wi-Fi on ESP peripheral +* This script compiles and loads host driver on Raspberry-Pi. The driver creates virtual serial interface `/dev/esps0` which is used as a control interface for Wi-Fi on ESP peripheral. ### 2.2 ESP Peripheral Firmware One can load pre-built release binaries on ESP peripheral or compile those from source. Below subsection explains both these methods. diff --git a/docs/Linux_based_host/SPI_setup.md b/docs/Linux_based_host/SPI_setup.md index ae40e33197..360275e6c8 100644 --- a/docs/Linux_based_host/SPI_setup.md +++ b/docs/Linux_based_host/SPI_setup.md @@ -69,7 +69,7 @@ Please reboot Raspberry-Pi after changing this file. $ cd host/linux/host_control/ $ ./rpi_init.sh spi ``` -* This script compiles and loads host driver on Raspberry-Pi. It also creates virtual serial interface `/dev/esps0` which is used as a control interface for Wi-Fi on ESP peripheral +* This script compiles and loads host driver on Raspberry-Pi. The driver creates virtual serial interface `/dev/esps0` which is used as a control interface for Wi-Fi on ESP peripheral ### 2.2 ESP Peripheral Firmware One can load pre-built release binaries on ESP peripheral or compile those from source. Below subsection explains both these methods. diff --git a/host/linux/host_control/rpi_init.sh b/host/linux/host_control/rpi_init.sh index 24323d4bf5..8e2979f50c 100755 --- a/host/linux/host_control/rpi_init.sh +++ b/host/linux/host_control/rpi_init.sh @@ -33,7 +33,6 @@ wlan_init() cd ../host_driver/esp32/ if [ `lsmod | grep esp32 | wc -l` != "0" ]; then - sudo rm /dev/esps0 if [ `lsmod | grep esp32_sdio | wc -l` != "0" ]; then sudo rmmod esp32_sdio &> /dev/null else @@ -56,7 +55,6 @@ wlan_init() fi if [ `lsmod | grep esp32 | wc -l` != "0" ]; then echo "esp32 module inserted " - sudo mknod /dev/esps0 c 221 0 sudo chmod 666 /dev/esps0 echo "/dev/esps0 device created" echo "RPi init successfully completed" diff --git a/host/linux/host_driver/esp32/esp_serial.c b/host/linux/host_driver/esp32/esp_serial.c index e8ace8a982..826d07d5d5 100644 --- a/host/linux/host_driver/esp32/esp_serial.c +++ b/host/linux/host_driver/esp32/esp_serial.c @@ -39,6 +39,7 @@ //#define ESP_SERIAL_TEST static struct esp_serial_devs { + struct device* dev; struct cdev cdev; int dev_index; esp_rb_t rb; @@ -220,20 +221,30 @@ static int thread_fn(void *unused) } #endif -int esp_serial_init(void *priv) -{ - int err = 0, i = 0; +static dev_t dev_first; +static struct class *cl; + +int esp_serial_init(void* priv) { + int err, i; - err = register_chrdev_region(MKDEV(ESP_SERIAL_MAJOR, 0), ESP_SERIAL_MINOR_MAX, "esp_serial_driver"); + err = alloc_chrdev_region(&dev_first, 0, ESP_SERIAL_MINOR_MAX, "esp_serial_driver"); if (err) { printk(KERN_ERR "%s, Error registering chrdev region %d\n", __func__, err); - return -1; + goto err; + } + + cl = class_create(THIS_MODULE, "esp_serial_chardrv"); + if (IS_ERR(cl)) { + err = PTR_ERR(cl); + goto err_class_create; } for (i = 0; i < ESP_SERIAL_MINOR_MAX; i++) { - cdev_init(&devs[i].cdev, &esp_serial_fops); + dev_t dev_num = dev_first + i; devs[i].dev_index = i; - cdev_add(&devs[i].cdev, MKDEV(ESP_SERIAL_MAJOR, i), 1); + devs[i].dev = device_create(cl, NULL, dev_num, NULL, "esps%d", i); + cdev_init(&devs[i].cdev, &esp_serial_fops); + cdev_add(&devs[i].cdev, dev_num, 1); esp_rb_init(&devs[i].rb, ESP_RX_RB_SIZE); devs[i].priv = priv; mutex_init(&devs[i].lock); @@ -243,16 +254,23 @@ int esp_serial_init(void *priv) kthread_run(thread_fn, NULL, "esptest-thread"); #endif return 0; +err_class_create: + unregister_chrdev_region(dev_first, ESP_SERIAL_MINOR_MAX); + +err: + return err; } -void esp_serial_cleanup(void) -{ - int i = 0; +void esp_serial_cleanup(void) { + int i; + for (i = 0; i < ESP_SERIAL_MINOR_MAX; i++) { + dev_t dev_num = dev_first + i; + device_destroy(cl, dev_num); cdev_del(&devs[i].cdev); esp_rb_cleanup(&devs[i].rb); mutex_destroy(&devs[i].lock); } - unregister_chrdev_region(MKDEV(ESP_SERIAL_MAJOR, 0), ESP_SERIAL_MINOR_MAX); - return; + class_destroy(cl); + unregister_chrdev_region(dev_first, ESP_SERIAL_MINOR_MAX); }