Skip to content

Commit 240688f

Browse files
SohKamYung-Espressift123yhljgabcdrosen-taranawirelessmantriyogesh
committed
feature/char_driver Changed kernel module
- create and maintain serial driver /dev/esps0 from kernel module - removed serial creation and destroy from rpi_init.sh - closes PR #71 - closes PR #81 - closes PR #180 Co-authored-by: Yunhao Tian <[email protected]> Co-authored-by: ljgabc <[email protected]> Co-authored-by: David Rosen <[email protected]> Co-authored-by: Yogesh Mantri <[email protected]>
1 parent 490d2c3 commit 240688f

File tree

6 files changed

+49
-19
lines changed

6 files changed

+49
-19
lines changed

esp_hosted_fg/host/linux/host_control/rpi_init.sh

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ wlan_init()
6666
{
6767
cd ../host_driver/esp32/
6868
if [ `lsmod | grep esp32 | wc -l` != "0" ]; then
69-
sudo rm /dev/esps0
7069
if [ `lsmod | grep esp32_sdio | wc -l` != "0" ]; then
7170
sudo rmmod esp32_sdio &> /dev/null
7271
else
@@ -114,9 +113,6 @@ wlan_init()
114113
fi
115114
if [ `lsmod | grep esp32 | wc -l` != "0" ]; then
116115
echo "esp32 module inserted "
117-
sudo mknod /dev/esps0 c 221 0
118-
sudo chmod 666 /dev/esps0
119-
echo "/dev/esps0 device created"
120116
echo "RPi init successfully completed"
121117
fi
122118
}

esp_hosted_fg/host/linux/host_driver/esp32/esp_rb.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
int esp_rb_init(esp_rb_t *rb, size_t sz)
2020
{
21+
esp_dbg("%u\n", __LINE__);
2122
init_waitqueue_head(&(rb->wq));
2223

2324
rb->buf = kmalloc(sz, GFP_KERNEL);
@@ -40,18 +41,22 @@ int esp_rb_read_by_user(esp_rb_t *rb, const char __user *buf, size_t sz, int blo
4041
int read_len = 0, temp_len = 0;
4142

4243
if (down_interruptible(&rb->sem)) {
44+
esp_verbose("%u interrupted by signal\n", __LINE__);
4345
return -ERESTARTSYS; /* Signal interruption */
4446
}
4547

4648
while (rb->rp == rb->wp) {
4749
up(&rb->sem);
4850
if (block == 0) {
51+
esp_verbose("%u EAGAIN\n", __LINE__);
4952
return -EAGAIN;
5053
}
5154
if (wait_event_interruptible(rb->wq, (rb->rp != rb->wp))) {
55+
esp_verbose("%u Interrupted2 by signal\n", __LINE__);
5256
return -ERESTARTSYS; /* Signal interruption */
5357
}
5458
if (down_interruptible(&rb->sem)) {
59+
esp_verbose("%u Interrupted3 by signal\n", __LINE__);
5560
return -ERESTARTSYS;
5661
}
5762
}
@@ -93,6 +98,7 @@ int esp_rb_read_by_user(esp_rb_t *rb, const char __user *buf, size_t sz, int blo
9398
int get_free_space(esp_rb_t *rb)
9499
{
95100
if (!rb || !rb->rp || !rb->wp) {
101+
esp_err("%u Err fault\n", __LINE__);
96102
return -EFAULT;
97103
}
98104
if (rb->rp == rb->wp) {
@@ -112,6 +118,7 @@ int esp_rb_write_by_kernel(esp_rb_t *rb, const char *buf, size_t sz)
112118
}
113119

114120
if (down_interruptible(&rb->sem)) {
121+
esp_verbose("%u intr by sig\n", __LINE__);
115122
return -ERESTARTSYS;
116123
}
117124

esp_hosted_fg/host/linux/host_driver/esp32/esp_serial.c

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@
3434
#include "esp_api.h"
3535

3636
#define ESP_SERIAL_MAJOR 221
37-
#define ESP_SERIAL_MINOR_MAX 2
37+
#define ESP_SERIAL_MINOR_MAX 1
3838
#define ESP_RX_RB_SIZE 4096
3939
#define ESP_SERIAL_MAX_TX 4096
4040

4141
static struct esp_serial_devs {
42+
struct device* dev;
4243
struct cdev cdev;
4344
int dev_index;
4445
esp_rb_t rb;
@@ -55,6 +56,7 @@ static ssize_t esp_serial_read(struct file *file, char __user *user_buffer, size
5556
dev = (struct esp_serial_devs *) file->private_data;
5657
ret_size = esp_rb_read_by_user(&dev->rb, user_buffer, size, !(file->f_flags & O_NONBLOCK));
5758
if (ret_size == 0) {
59+
esp_verbose("%u err: EAGAIN\n", __LINE__);
5860
return -EAGAIN;
5961
}
6062
return ret_size;
@@ -188,6 +190,8 @@ int esp_serial_data_received(int dev_index, const char *data, size_t len)
188190
{
189191
int ret = 0, ret_len = 0;
190192
if (dev_index >= ESP_SERIAL_MINOR_MAX) {
193+
esp_err("%u ERR: serial_dev_idx[%d] >= minor_max[%d]\n",
194+
__LINE__, dev_index, ESP_SERIAL_MINOR_MAX);
191195
return -EINVAL;
192196
}
193197

@@ -209,25 +213,41 @@ int esp_serial_data_received(int dev_index, const char *data, size_t len)
209213
return ret_len;
210214
}
211215

216+
static dev_t dev_first;
217+
static struct class *cl;
218+
212219
int esp_serial_init(void *priv)
213220
{
214-
int err = 0, i = 0;
221+
int err = -EINVAL, i = 0;
215222

216223
if (!priv) {
217224
esp_err("failed. NULL adapter\n");
218-
return -1;
225+
goto err;
219226
}
220227

221-
err = register_chrdev_region(MKDEV(ESP_SERIAL_MAJOR, 0), ESP_SERIAL_MINOR_MAX, "esp_serial_driver");
228+
/* already in correct state, ignore */
229+
if (serial_init_done)
230+
return 0;
231+
232+
err = alloc_chrdev_region(&dev_first, 0, ESP_SERIAL_MINOR_MAX, "esp_serial_driver");
222233
if (err) {
223-
esp_err("Error registering chrdev region %d\n", err);
224-
return -1;
234+
esp_err("Error alloc chrdev region %d\n", err);
235+
goto err;
236+
}
237+
238+
cl = class_create(THIS_MODULE, "esp_serial_chardrv");
239+
if (IS_ERR(cl)) {
240+
esp_err("Class create err[%d]\n", err);
241+
err = PTR_ERR(cl);
242+
goto err_class_create;
225243
}
226244

227245
for (i = 0; i < ESP_SERIAL_MINOR_MAX; i++) {
228-
cdev_init(&devs[i].cdev, &esp_serial_fops);
246+
dev_t dev_num = dev_first + i;
229247
devs[i].dev_index = i;
230-
cdev_add(&devs[i].cdev, MKDEV(ESP_SERIAL_MAJOR, i), 1);
248+
devs[i].dev = device_create(cl, NULL, dev_num, NULL, "esps%d", i);
249+
cdev_init(&devs[i].cdev, &esp_serial_fops);
250+
cdev_add(&devs[i].cdev, dev_num, 1);
231251
esp_rb_init(&devs[i].rb, ESP_RX_RB_SIZE);
232252
devs[i].priv = priv;
233253
mutex_init(&devs[i].lock);
@@ -236,32 +256,40 @@ int esp_serial_init(void *priv)
236256
serial_init_done = 1;
237257
esp_verbose("\n");
238258
return 0;
259+
260+
err_class_create:
261+
unregister_chrdev_region(dev_first, ESP_SERIAL_MINOR_MAX);
262+
err:
263+
return err;
239264
}
240265

241266
void esp_serial_cleanup(void)
242267
{
243268
int i = 0;
244269

245270
for (i = 0; serial_init_done && i < ESP_SERIAL_MINOR_MAX; i++) {
271+
dev_t dev_num = dev_first + i;
272+
device_destroy(cl, dev_num);
246273
if (!devs[i].cdev.ops)
247274
cdev_del(&devs[i].cdev);
248275

249276
esp_rb_cleanup(&devs[i].rb);
250277
mutex_destroy(&devs[i].lock);
251278
}
252279

253-
unregister_chrdev_region(MKDEV(ESP_SERIAL_MAJOR, 0), ESP_SERIAL_MINOR_MAX);
280+
class_destroy(cl);
281+
unregister_chrdev_region(dev_first, ESP_SERIAL_MINOR_MAX);
254282

255283
serial_init_done = 0;
256-
esp_verbose("\n");
284+
esp_info("\n");
257285
return;
258286
}
259287

260288
int esp_serial_reinit(void *priv)
261289
{
262-
esp_verbose("\n");
263-
if (serial_init_done)
264-
esp_serial_cleanup();
290+
if (serial_init_done) {
291+
return 0;
292+
}
265293

266294
return esp_serial_init(priv);
267295
}

esp_hosted_fg/host/linux/host_driver/esp32/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,7 @@ static void __exit esp_exit(void)
856856
#if TEST_RAW_TP
857857
test_raw_tp_cleanup();
858858
#endif
859+
esp_serial_cleanup();
859860
esp_deinit_interface_layer();
860861
deinit_adapter();
861862

esp_hosted_fg/host/linux/host_driver/esp32/sdio/esp_sdio.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@ static void esp_remove(struct sdio_func *func)
282282

283283
esp_info("-> Remove card\n");
284284

285-
esp_serial_cleanup();
286285

287286

288287
for (prio_q_idx=0; prio_q_idx<MAX_PRIORITY_QUEUES; prio_q_idx++) {

esp_hosted_fg/host/linux/host_driver/esp32/spi/esp_spi.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,6 @@ static void spi_exit(void)
652652
spi_thread = NULL;
653653
}
654654

655-
esp_serial_cleanup();
656655
esp_remove_card(spi_context.adapter);
657656

658657
if (test_bit(ESP_SPI_GPIO_HS_IRQ_DONE, &spi_context.spi_flags)) {

0 commit comments

Comments
 (0)