diff --git a/Documentation/reference/user/10_filesystem.rst b/Documentation/reference/user/10_filesystem.rst index acbf64b0b5f..d567797dc62 100644 --- a/Documentation/reference/user/10_filesystem.rst +++ b/Documentation/reference/user/10_filesystem.rst @@ -458,12 +458,11 @@ are two conditions where ``mmap()`` can be supported: 1. ``mmap()`` can be used to support *eXecute In Place* (XIP) on random access media under the following very restrictive conditions: - a. The file-system supports the ``FIOC_MMAP`` ioctl command. Any file - system that maps files contiguously on the media should support - this ``ioctl`` command. By comparison, most file system scatter - files over the media in non-contiguous sectors. As of this - writing, ROMFS is the only file system that meets this - requirement. + a. Any file system that maps files contiguously on the media + should implement the mmap file operation. By comparison, most + file system scatter files over the media in non-contiguous + sectors. As of this writing, ROMFS is the only file system + that meets this requirement. b. The underlying block driver supports the ``BIOC_XIPBASE`` ``ioctl`` command that maps the underlying media to a randomly diff --git a/arch/arm/src/cxd56xx/cxd56_geofence.c b/arch/arm/src/cxd56xx/cxd56_geofence.c index 0dc32b65cdc..ad040534f0b 100644 --- a/arch/arm/src/cxd56xx/cxd56_geofence.c +++ b/arch/arm/src/cxd56xx/cxd56_geofence.c @@ -107,6 +107,7 @@ static const struct file_operations g_geofencefops = NULL, /* seek */ cxd56_geofence_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ cxd56_geofence_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/arch/arm/src/cxd56xx/cxd56_gnss.c b/arch/arm/src/cxd56xx/cxd56_gnss.c index 04270f14775..9f9683a35c5 100644 --- a/arch/arm/src/cxd56xx/cxd56_gnss.c +++ b/arch/arm/src/cxd56xx/cxd56_gnss.c @@ -318,6 +318,7 @@ static const struct file_operations g_gnssfops = NULL, /* seek */ cxd56_gnss_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ cxd56_gnss_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/arch/arm/src/cxd56xx/cxd56_hostif.c b/arch/arm/src/cxd56xx/cxd56_hostif.c index 905c1baf682..790506052c3 100644 --- a/arch/arm/src/cxd56xx/cxd56_hostif.c +++ b/arch/arm/src/cxd56xx/cxd56_hostif.c @@ -146,6 +146,7 @@ static const struct file_operations g_hif_fops = hif_seek, /* seek */ hif_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ hif_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , hif_unlink /* unlink */ diff --git a/arch/arm/src/sama5/sam_tsd.c b/arch/arm/src/sama5/sam_tsd.c index 3e2adab4dbd..888d4a34e69 100644 --- a/arch/arm/src/sama5/sam_tsd.c +++ b/arch/arm/src/sama5/sam_tsd.c @@ -250,6 +250,7 @@ static const struct file_operations g_tsdops = NULL, /* seek */ sam_tsd_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ sam_tsd_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c b/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c index c612ab8c54c..0002e3ca6fb 100644 --- a/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c +++ b/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c @@ -297,6 +297,7 @@ static const struct file_operations g_slcdops = NULL, /* seek */ slcd_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ slcd_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c b/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c index 0a9b57e28da..b22be31a6ed 100644 --- a/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c +++ b/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c @@ -269,6 +269,7 @@ static const struct file_operations tc_fops = NULL, /* seek */ tc_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ tc_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c b/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c index 5778631ff0c..e8c8bf90fed 100644 --- a/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c +++ b/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c @@ -347,6 +347,7 @@ static const struct file_operations g_slcdops = NULL, /* seek */ slcd_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ slcd_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c b/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c index 9ae2554986d..04786a968a1 100644 --- a/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c +++ b/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c @@ -250,6 +250,7 @@ static const struct file_operations tc_fops = NULL, /* seek */ tc_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ tc_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c b/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c index 50cb3f99e98..9fe29b59baa 100644 --- a/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c +++ b/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c @@ -182,6 +182,7 @@ static const struct file_operations g_lcdops = NULL, /* seek */ lcd_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ lcd_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/crypto/cryptodev.c b/crypto/cryptodev.c index 44eb9410e87..749e2c0120c 100644 --- a/crypto/cryptodev.c +++ b/crypto/cryptodev.c @@ -126,6 +126,7 @@ static const struct file_operations g_cryptofops = NULL, /* seek */ cryptof_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ cryptof_poll /* poll */ }; @@ -138,6 +139,7 @@ static const struct file_operations g_cryptoops = NULL, /* seek */ cryptoioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ }; diff --git a/drivers/analog/adc.c b/drivers/analog/adc.c index 099e7b4d172..f8df2343a68 100644 --- a/drivers/analog/adc.c +++ b/drivers/analog/adc.c @@ -73,6 +73,7 @@ static const struct file_operations g_adc_fops = NULL, /* seek */ adc_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ adc_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/analog/comp.c b/drivers/analog/comp.c index 1fb32f18de6..0fc956d6c0f 100644 --- a/drivers/analog/comp.c +++ b/drivers/analog/comp.c @@ -66,6 +66,7 @@ static const struct file_operations comp_fops = NULL, /* seek */ comp_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ comp_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/bch/bchdev_driver.c b/drivers/bch/bchdev_driver.c index 83fc4250d38..9069d935963 100644 --- a/drivers/bch/bchdev_driver.c +++ b/drivers/bch/bchdev_driver.c @@ -79,6 +79,7 @@ const struct file_operations bch_fops = bch_seek, /* seek */ bch_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ bch_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , bch_unlink /* unlink */ diff --git a/drivers/can/can.c b/drivers/can/can.c index b19cb36f26f..78a72255ffd 100644 --- a/drivers/can/can.c +++ b/drivers/can/can.c @@ -136,6 +136,7 @@ static const struct file_operations g_canops = NULL, /* seek */ can_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ can_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/crypto/dev_urandom.c b/drivers/crypto/dev_urandom.c index 8796f7445b6..5496ab60d96 100644 --- a/drivers/crypto/dev_urandom.c +++ b/drivers/crypto/dev_urandom.c @@ -101,6 +101,7 @@ static const struct file_operations g_urand_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ devurand_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/i2c/i2c_driver.c b/drivers/i2c/i2c_driver.c index b7836b73274..57fedcb2a6f 100644 --- a/drivers/i2c/i2c_driver.c +++ b/drivers/i2c/i2c_driver.c @@ -100,6 +100,7 @@ static const struct file_operations i2cdrvr_fops = NULL, /* seek */ i2cdrvr_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , i2cdrvr_unlink /* unlink */ diff --git a/drivers/input/ads7843e.c b/drivers/input/ads7843e.c index 19126b3b6b4..f7602f2b426 100644 --- a/drivers/input/ads7843e.c +++ b/drivers/input/ads7843e.c @@ -123,6 +123,7 @@ static const struct file_operations ads7843e_fops = NULL, /* seek */ ads7843e_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ ads7843e_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/ajoystick.c b/drivers/input/ajoystick.c index 072d90615ee..e9acb482669 100644 --- a/drivers/input/ajoystick.c +++ b/drivers/input/ajoystick.c @@ -136,6 +136,7 @@ static const struct file_operations ajoy_fops = NULL, /* seek */ ajoy_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ ajoy_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/button_upper.c b/drivers/input/button_upper.c index 16b578bbf99..007a9ffc302 100644 --- a/drivers/input/button_upper.c +++ b/drivers/input/button_upper.c @@ -134,6 +134,7 @@ static const struct file_operations btn_fops = NULL, /* seek */ btn_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ btn_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/cypress_mbr3108.c b/drivers/input/cypress_mbr3108.c index 39189b9329c..107bd814b3f 100644 --- a/drivers/input/cypress_mbr3108.c +++ b/drivers/input/cypress_mbr3108.c @@ -225,6 +225,7 @@ static const struct file_operations g_mbr3108_fileops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ mbr3108_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/djoystick.c b/drivers/input/djoystick.c index 13365fd7a50..06a8d828903 100644 --- a/drivers/input/djoystick.c +++ b/drivers/input/djoystick.c @@ -136,6 +136,7 @@ static const struct file_operations djoy_fops = NULL, /* seek */ djoy_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ djoy_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/ft5x06.c b/drivers/input/ft5x06.c index 8898f8e5d4b..59f94b9a7ad 100644 --- a/drivers/input/ft5x06.c +++ b/drivers/input/ft5x06.c @@ -177,6 +177,7 @@ static const struct file_operations ft5x06_fops = NULL, /* seek */ ft5x06_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ ft5x06_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/keyboard_upper.c b/drivers/input/keyboard_upper.c index c874a3a04f3..4ab770288db 100644 --- a/drivers/input/keyboard_upper.c +++ b/drivers/input/keyboard_upper.c @@ -89,6 +89,7 @@ static const struct file_operations g_keyboard_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ keyboard_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/max11802.c b/drivers/input/max11802.c index b0d69eb3903..0713c61d569 100644 --- a/drivers/input/max11802.c +++ b/drivers/input/max11802.c @@ -116,6 +116,7 @@ static const struct file_operations max11802_fops = NULL, /* seek */ max11802_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ max11802_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/mxt.c b/drivers/input/mxt.c index 5050bcda50e..50426a9646b 100644 --- a/drivers/input/mxt.c +++ b/drivers/input/mxt.c @@ -281,6 +281,7 @@ static const struct file_operations mxt_fops = NULL, /* seek */ mxt_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ mxt_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/spq10kbd.c b/drivers/input/spq10kbd.c index 91597439cd2..427925f4d90 100644 --- a/drivers/input/spq10kbd.c +++ b/drivers/input/spq10kbd.c @@ -256,6 +256,7 @@ static const struct file_operations g_hidkbd_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ spq10kbd_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/stmpe811_tsc.c b/drivers/input/stmpe811_tsc.c index 6e82fed382f..efc73437d2b 100644 --- a/drivers/input/stmpe811_tsc.c +++ b/drivers/input/stmpe811_tsc.c @@ -125,6 +125,7 @@ static const struct file_operations g_stmpe811fops = NULL, /* seek */ stmpe811_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ stmpe811_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/touchscreen_upper.c b/drivers/input/touchscreen_upper.c index 48dc7038a68..0f3a6c6c83a 100644 --- a/drivers/input/touchscreen_upper.c +++ b/drivers/input/touchscreen_upper.c @@ -91,6 +91,7 @@ static const struct file_operations g_touch_fops = NULL, /* seek */ touch_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ touch_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/input/tsc2007.c b/drivers/input/tsc2007.c index 5a1afd55afd..5932578c074 100644 --- a/drivers/input/tsc2007.c +++ b/drivers/input/tsc2007.c @@ -210,6 +210,7 @@ static const struct file_operations tsc2007_fops = NULL, /* seek */ tsc2007_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ tsc2007_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/lcd/ft80x.c b/drivers/lcd/ft80x.c index 6950b39c7fe..c75aaeea4b0 100644 --- a/drivers/lcd/ft80x.c +++ b/drivers/lcd/ft80x.c @@ -135,6 +135,7 @@ static const struct file_operations g_ft80x_fops = NULL, /* seek */ ft80x_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , ft80x_unlink /* unlink */ diff --git a/drivers/lcd/pcf8574_lcd_backpack.c b/drivers/lcd/pcf8574_lcd_backpack.c index a27179386a8..0a0ec4dbf2c 100644 --- a/drivers/lcd/pcf8574_lcd_backpack.c +++ b/drivers/lcd/pcf8574_lcd_backpack.c @@ -118,6 +118,7 @@ static const struct file_operations g_pcf8574_lcd_fops = pcf8574_lcd_seek, /* seek */ pcf8574_lcd_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ pcf8574_lcd_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , pcf8574_lcd_unlink /* unlink */ diff --git a/drivers/lcd/tda19988.c b/drivers/lcd/tda19988.c index f8e0b06eb68..16a00010895 100644 --- a/drivers/lcd/tda19988.c +++ b/drivers/lcd/tda19988.c @@ -171,6 +171,7 @@ static const struct file_operations tda19988_fops = tda19988_seek, /* seek */ tda19988_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ tda19988_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , tda19988_unlink /* unlink */ diff --git a/drivers/leds/ws2812.c b/drivers/leds/ws2812.c index b239ba56596..235df171f13 100644 --- a/drivers/leds/ws2812.c +++ b/drivers/leds/ws2812.c @@ -182,8 +182,8 @@ static const struct file_operations g_ws2812fops = /**************************************************************************** * #### TODO #### * - * Consider supporting mmap by returning memory buffer using... - * file_ioctl(filep, FIOC_MMAP, (unsigned long)((uintptr_t)&addr)); + * Consider supporting mmap by returning memory buffer using file_operations' + * mmap * Code using this would be non-portable across architectures as the format * of the buffer can be different. * diff --git a/drivers/misc/dev_null.c b/drivers/misc/dev_null.c index 5b84c8a436f..80670112753 100644 --- a/drivers/misc/dev_null.c +++ b/drivers/misc/dev_null.c @@ -58,6 +58,7 @@ static const struct file_operations devnull_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ devnull_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/misc/dev_zero.c b/drivers/misc/dev_zero.c index b02ba215596..998aaa394fc 100644 --- a/drivers/misc/dev_zero.c +++ b/drivers/misc/dev_zero.c @@ -58,6 +58,7 @@ static const struct file_operations devzero_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ devzero_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/misc/rpmsgdev.c b/drivers/misc/rpmsgdev.c index 96eb5934112..3be631336f8 100644 --- a/drivers/misc/rpmsgdev.c +++ b/drivers/misc/rpmsgdev.c @@ -166,6 +166,7 @@ const struct file_operations g_rpmsgdev_ops = rpmsgdev_seek, /* seek */ rpmsgdev_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ rpmsgdev_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/modem/alt1250/alt1250.c b/drivers/modem/alt1250/alt1250.c index 6978432a531..7e76bd199fb 100644 --- a/drivers/modem/alt1250/alt1250.c +++ b/drivers/modem/alt1250/alt1250.c @@ -78,6 +78,7 @@ static const struct file_operations g_alt1250fops = NULL, /* seek */ alt1250_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ alt1250_poll, /* poll */ }; static uint8_t g_recvbuff[ALTCOM_RX_PKT_SIZE_MAX]; diff --git a/drivers/modem/u-blox.c b/drivers/modem/u-blox.c index fbd3d38ad35..86cb243909d 100644 --- a/drivers/modem/u-blox.c +++ b/drivers/modem/u-blox.c @@ -115,6 +115,7 @@ static const struct file_operations ubxmdm_fops = NULL, /* seek */ ubxmdm_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ ubxmdm_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/mtd/mtd_config.c b/drivers/mtd/mtd_config.c index 4e74433a598..e2f0f765366 100644 --- a/drivers/mtd/mtd_config.c +++ b/drivers/mtd/mtd_config.c @@ -120,6 +120,7 @@ static const struct file_operations mtdconfig_fops = NULL, /* seek */ mtdconfig_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ mtdconfig_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/mtd/mtd_config_fs.c b/drivers/mtd/mtd_config_fs.c index cb6153e2488..254a8ccbe9c 100644 --- a/drivers/mtd/mtd_config_fs.c +++ b/drivers/mtd/mtd_config_fs.c @@ -142,6 +142,7 @@ static const struct file_operations g_mtdnvs_fops = NULL, /* Seek */ mtdconfig_ioctl, /* Ioctl */ NULL, /* Truncate */ + NULL, /* Mmap */ mtdconfig_poll /* Poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* Unlink */ diff --git a/drivers/net/telnet.c b/drivers/net/telnet.c index 2b922a08d60..fabbe815142 100644 --- a/drivers/net/telnet.c +++ b/drivers/net/telnet.c @@ -191,6 +191,7 @@ static const struct file_operations g_telnet_fops = NULL, /* seek */ telnet_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ telnet_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ @@ -206,6 +207,7 @@ static const struct file_operations g_factory_fops = NULL, /* seek */ factory_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/net/tun.c b/drivers/net/tun.c index cab2d1f325c..43d43ade799 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -220,6 +220,7 @@ static const struct file_operations g_tun_file_ops = NULL, /* seek */ tun_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ tun_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/pipes/fifo.c b/drivers/pipes/fifo.c index 7ad5c4358cb..283f1614ff8 100644 --- a/drivers/pipes/fifo.c +++ b/drivers/pipes/fifo.c @@ -48,6 +48,7 @@ static const struct file_operations g_fifo_fops = NULL, /* seek */ pipecommon_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ pipecommon_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , pipecommon_unlink /* unlink */ diff --git a/drivers/pipes/pipe.c b/drivers/pipes/pipe.c index 67050f9176f..5bc8716d5bf 100644 --- a/drivers/pipes/pipe.c +++ b/drivers/pipes/pipe.c @@ -62,6 +62,7 @@ static const struct file_operations g_pipe_fops = NULL, /* seek */ pipecommon_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ pipecommon_poll /* poll */ }; diff --git a/drivers/power/battery/battery_charger.c b/drivers/power/battery/battery_charger.c index edfc8c4c29e..0316a5d47e3 100644 --- a/drivers/power/battery/battery_charger.c +++ b/drivers/power/battery/battery_charger.c @@ -92,6 +92,7 @@ static const struct file_operations g_batteryops = NULL, /* seek */ bat_charger_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ bat_charger_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/power/battery/battery_gauge.c b/drivers/power/battery/battery_gauge.c index 37b01cb9c48..0b24303e274 100644 --- a/drivers/power/battery/battery_gauge.c +++ b/drivers/power/battery/battery_gauge.c @@ -94,6 +94,7 @@ static const struct file_operations g_batteryops = NULL, /* seek */ bat_gauge_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ bat_gauge_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/power/battery/battery_monitor.c b/drivers/power/battery/battery_monitor.c index 77e19808689..4f1c2ff5d5e 100644 --- a/drivers/power/battery/battery_monitor.c +++ b/drivers/power/battery/battery_monitor.c @@ -93,6 +93,7 @@ static const struct file_operations g_batteryops = NULL, /* seek */ bat_monitor_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ bat_monitor_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/rc/lirc_dev.c b/drivers/rc/lirc_dev.c index d4911fae41e..57a0d5e6b2b 100644 --- a/drivers/rc/lirc_dev.c +++ b/drivers/rc/lirc_dev.c @@ -104,6 +104,7 @@ static const struct file_operations g_lirc_fops = NULL, /* seek */ lirc_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ lirc_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/sensors/aht10.c b/drivers/sensors/aht10.c index 529ce0140ea..514e0c96eb2 100644 --- a/drivers/sensors/aht10.c +++ b/drivers/sensors/aht10.c @@ -117,6 +117,7 @@ static const struct file_operations g_aht10fops = NULL, /* seek */ aht10_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , aht10_unlink /* unlink */ diff --git a/drivers/sensors/hc_sr04.c b/drivers/sensors/hc_sr04.c index f4cfd377261..2b956b91401 100644 --- a/drivers/sensors/hc_sr04.c +++ b/drivers/sensors/hc_sr04.c @@ -91,6 +91,7 @@ static const struct file_operations g_hcsr04ops = NULL, /* seek */ hcsr04_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ hcsr04_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/sensors/hdc1008.c b/drivers/sensors/hdc1008.c index 612011ebb2d..44f83ed33b8 100644 --- a/drivers/sensors/hdc1008.c +++ b/drivers/sensors/hdc1008.c @@ -162,6 +162,7 @@ static const struct file_operations g_hdc1008fops = NULL, /* seek */ hdc1008_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , hdc1008_unlink /* unlink */ diff --git a/drivers/sensors/hts221.c b/drivers/sensors/hts221.c index 9e02fbe00f0..18b6ee31b10 100644 --- a/drivers/sensors/hts221.c +++ b/drivers/sensors/hts221.c @@ -158,6 +158,7 @@ static const struct file_operations g_humidityops = NULL, /* seek */ hts221_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ hts221_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/sensors/lis2dh.c b/drivers/sensors/lis2dh.c index efdd81e5358..445f9b9f426 100644 --- a/drivers/sensors/lis2dh.c +++ b/drivers/sensors/lis2dh.c @@ -155,6 +155,7 @@ static const struct file_operations g_lis2dhops = NULL, /* seek */ lis2dh_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ lis2dh_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/sensors/max44009.c b/drivers/sensors/max44009.c index 45a6fb6bae0..840c4bdcb85 100644 --- a/drivers/sensors/max44009.c +++ b/drivers/sensors/max44009.c @@ -113,6 +113,7 @@ static const struct file_operations g_alsops = NULL, /* seek */ max44009_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ max44009_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/sensors/scd30.c b/drivers/sensors/scd30.c index 063a346b35b..54317a85f0c 100644 --- a/drivers/sensors/scd30.c +++ b/drivers/sensors/scd30.c @@ -183,6 +183,7 @@ static const struct file_operations g_scd30fops = NULL, /* seek */ scd30_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , scd30_unlink /* unlink */ diff --git a/drivers/sensors/scd41.c b/drivers/sensors/scd41.c index 272f37f5af8..74288c4f5b6 100644 --- a/drivers/sensors/scd41.c +++ b/drivers/sensors/scd41.c @@ -191,6 +191,7 @@ static const struct file_operations g_scd41fops = NULL, /* seek */ scd41_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , scd41_unlink /* unlink */ diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c index 4a93b4f11a0..417554f0635 100644 --- a/drivers/sensors/sensor.c +++ b/drivers/sensors/sensor.c @@ -168,6 +168,7 @@ static const struct file_operations g_sensor_fops = NULL, /* seek */ sensor_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ sensor_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/sensors/sgp30.c b/drivers/sensors/sgp30.c index 493a0af4d74..e9ad20336e1 100644 --- a/drivers/sensors/sgp30.c +++ b/drivers/sensors/sgp30.c @@ -160,6 +160,7 @@ static const struct file_operations g_sgp30fops = NULL, /* seek */ sgp30_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , sgp30_unlink /* unlink */ diff --git a/drivers/sensors/sht21.c b/drivers/sensors/sht21.c index a23b58ebfca..e3146638135 100644 --- a/drivers/sensors/sht21.c +++ b/drivers/sensors/sht21.c @@ -132,6 +132,7 @@ static const struct file_operations g_sht21fops = NULL, /* seek */ sht21_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , sht21_unlink /* unlink */ diff --git a/drivers/sensors/sht3x.c b/drivers/sensors/sht3x.c index 11dd183480e..ffcb146ce2a 100644 --- a/drivers/sensors/sht3x.c +++ b/drivers/sensors/sht3x.c @@ -171,6 +171,7 @@ static const struct file_operations g_sht3xfops = NULL, /* seek */ sht3x_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , sht3x_unlink /* unlink */ diff --git a/drivers/sensors/sps30.c b/drivers/sensors/sps30.c index ad176cbe11f..37f7f010c0e 100644 --- a/drivers/sensors/sps30.c +++ b/drivers/sensors/sps30.c @@ -176,6 +176,7 @@ static const struct file_operations g_sps30fops = NULL, /* seek */ sps30_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , sps30_unlink /* unlink */ diff --git a/drivers/sensors/usensor.c b/drivers/sensors/usensor.c index 08fd9f791f7..e0d1dda2a51 100644 --- a/drivers/sensors/usensor.c +++ b/drivers/sensors/usensor.c @@ -82,6 +82,7 @@ static const struct file_operations g_usensor_fops = NULL, /* seek */ usensor_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL, /* poll */ }; diff --git a/drivers/serial/pty.c b/drivers/serial/pty.c index 39a182cdd79..c06cb6fd26e 100644 --- a/drivers/serial/pty.c +++ b/drivers/serial/pty.c @@ -128,6 +128,7 @@ static const struct file_operations g_pty_fops = NULL, /* seek */ pty_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ pty_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , pty_unlink /* unlink */ diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index ed7299b8aad..48c8dc069a7 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -127,6 +127,7 @@ static const struct file_operations g_serialops = NULL, /* seek */ uart_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ uart_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/serial/uart_bth4.c b/drivers/serial/uart_bth4.c index e01a27331ff..08421df006b 100644 --- a/drivers/serial/uart_bth4.c +++ b/drivers/serial/uart_bth4.c @@ -91,6 +91,7 @@ static const struct file_operations g_uart_bth4_ops = NULL, /* seek */ uart_bth4_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ uart_bth4_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/spi/spi_driver.c b/drivers/spi/spi_driver.c index ae3a09726d6..583344d72d4 100644 --- a/drivers/spi/spi_driver.c +++ b/drivers/spi/spi_driver.c @@ -100,6 +100,7 @@ static const struct file_operations spidrvr_fops = NULL, /* seek */ spidrvr_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , spidrvr_unlink /* unlink */ diff --git a/drivers/spi/spi_slave_driver.c b/drivers/spi/spi_slave_driver.c index 54b4f5ac20d..c2eaff76723 100644 --- a/drivers/spi/spi_slave_driver.c +++ b/drivers/spi/spi_slave_driver.c @@ -128,6 +128,7 @@ static const struct file_operations g_spislavefops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , spi_slave_unlink /* unlink */ diff --git a/drivers/syslog/ramlog.c b/drivers/syslog/ramlog.c index a47c7347422..5019cf231fd 100644 --- a/drivers/syslog/ramlog.c +++ b/drivers/syslog/ramlog.c @@ -115,6 +115,7 @@ static const struct file_operations g_ramlogfops = NULL, /* seek */ ramlog_file_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ ramlog_file_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/timers/rtc.c b/drivers/timers/rtc.c index c0055c12f0d..b77405bd1ad 100644 --- a/drivers/timers/rtc.c +++ b/drivers/timers/rtc.c @@ -130,6 +130,7 @@ static const struct file_operations rtc_fops = NULL, /* seek */ rtc_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , rtc_unlink /* unlink */ diff --git a/drivers/usbdev/adb.c b/drivers/usbdev/adb.c index 3fdf8f082b5..42ec3d5a2e5 100755 --- a/drivers/usbdev/adb.c +++ b/drivers/usbdev/adb.c @@ -255,6 +255,7 @@ static const struct file_operations g_adb_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ adb_char_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/usbhost/usbhost_cdcmbim.c b/drivers/usbhost/usbhost_cdcmbim.c index c4f7540edba..fb63be65883 100644 --- a/drivers/usbhost/usbhost_cdcmbim.c +++ b/drivers/usbhost/usbhost_cdcmbim.c @@ -348,6 +348,7 @@ static const struct file_operations cdcwdm_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ cdcwdm_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/usbhost/usbhost_hidkbd.c b/drivers/usbhost/usbhost_hidkbd.c index be1f8e3ce5c..53690b986bd 100644 --- a/drivers/usbhost/usbhost_hidkbd.c +++ b/drivers/usbhost/usbhost_hidkbd.c @@ -342,6 +342,7 @@ static const struct file_operations g_hidkbd_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ usbhost_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/usbhost/usbhost_hidmouse.c b/drivers/usbhost/usbhost_hidmouse.c index c44574fc210..a7b430e8462 100644 --- a/drivers/usbhost/usbhost_hidmouse.c +++ b/drivers/usbhost/usbhost_hidmouse.c @@ -392,6 +392,7 @@ static const struct file_operations g_hidmouse_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ usbhost_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/usbhost/usbhost_xboxcontroller.c b/drivers/usbhost/usbhost_xboxcontroller.c index 0531f38f396..0a467f58fd6 100644 --- a/drivers/usbhost/usbhost_xboxcontroller.c +++ b/drivers/usbhost/usbhost_xboxcontroller.c @@ -297,6 +297,7 @@ static const struct file_operations g_xboxcontroller_fops = NULL, /* seek */ usbhost_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ usbhost_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/usbmisc/fusb301.c b/drivers/usbmisc/fusb301.c index 565a9ae8d62..a64d77d3d65 100644 --- a/drivers/usbmisc/fusb301.c +++ b/drivers/usbmisc/fusb301.c @@ -95,6 +95,7 @@ static const struct file_operations g_fusb301ops = NULL, /* seek */ fusb301_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ fusb301_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/usbmisc/fusb303.c b/drivers/usbmisc/fusb303.c index 19bb9ae7101..d64b5055c38 100644 --- a/drivers/usbmisc/fusb303.c +++ b/drivers/usbmisc/fusb303.c @@ -129,6 +129,7 @@ static const struct file_operations g_fusb303ops = NULL, /* seek */ fusb303_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ fusb303_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/usrsock/usrsock_dev.c b/drivers/usrsock/usrsock_dev.c index 30d46b58ccd..9bf410a24c2 100644 --- a/drivers/usrsock/usrsock_dev.c +++ b/drivers/usrsock/usrsock_dev.c @@ -104,6 +104,7 @@ static const struct file_operations g_usrsockdevops = usrsockdev_seek, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ usrsockdev_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/video/fb.c b/drivers/video/fb.c index b401599432a..6edc13dc17e 100644 --- a/drivers/video/fb.c +++ b/drivers/video/fb.c @@ -39,6 +39,7 @@ #include #include #include +#include /**************************************************************************** * Private Types @@ -70,6 +71,8 @@ static ssize_t fb_write(FAR struct file *filep, FAR const char *buffer, size_t buflen); static off_t fb_seek(FAR struct file *filep, off_t offset, int whence); static int fb_ioctl(FAR struct file *filep, int cmd, unsigned long arg); +static int fb_mmap(FAR struct file *filep, + FAR struct mm_map_entry_s *map); static int fb_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); @@ -86,6 +89,7 @@ static const struct file_operations fb_fops = fb_seek, /* seek */ fb_ioctl, /* ioctl */ NULL, /* truncate */ + fb_mmap, /* mmap */ fb_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ @@ -282,18 +286,6 @@ static int fb_ioctl(FAR struct file *filep, int cmd, unsigned long arg) switch (cmd) { - case FIOC_MMAP: /* Get color plane info */ - { - FAR void **ppv = (FAR void **)((uintptr_t)arg); - - /* Return the address corresponding to the start of frame buffer. */ - - DEBUGASSERT(ppv != NULL); - *ppv = fb->fbmem; - ret = OK; - } - break; - case FBIOGET_VIDEOINFO: /* Get color plane info */ { FAR struct fb_videoinfo_s *vinfo = @@ -683,6 +675,29 @@ static int fb_ioctl(FAR struct file *filep, int cmd, unsigned long arg) return ret; } +static int fb_mmap(FAR struct file *filep, FAR struct mm_map_entry_s *map) +{ + FAR struct inode *inode; + FAR struct fb_chardev_s *fb; + int ret = -EINVAL; + + /* Get the framebuffer instance */ + + DEBUGASSERT(filep != NULL && filep->f_inode != NULL); + inode = filep->f_inode; + fb = (FAR struct fb_chardev_s *)inode->i_private; + + /* Return the address corresponding to the start of frame buffer. */ + + if (map->offset + map->length <= fb->fblen) + { + map->vaddr = (FAR char *)fb->fbmem + map->offset; + ret = OK; + } + + return ret; +} + /**************************************************************************** * Name: fb_poll * diff --git a/drivers/video/video.c b/drivers/video/video.c index 94f894aa100..f6d07e99982 100644 --- a/drivers/video/video.c +++ b/drivers/video/video.c @@ -38,6 +38,7 @@ #include #include +#include #include "video_framebuff.h" @@ -197,6 +198,8 @@ static ssize_t video_read(FAR struct file *filep, static ssize_t video_write(FAR struct file *filep, FAR const char *buffer, size_t buflen); static int video_ioctl(FAR struct file *filep, int cmd, unsigned long arg); +static int video_mmap(FAR struct file *filep, + FAR struct mm_map_entry_s *map); /* Common function */ @@ -285,6 +288,7 @@ static const struct file_operations g_video_fops = NULL, /* seek */ video_ioctl, /* ioctl */ NULL, /* truncate */ + video_mmap, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ @@ -3185,13 +3189,6 @@ static int video_ioctl(FAR struct file *filep, int cmd, unsigned long arg) (FAR struct v4s_ext_controls_scene *)arg); break; - case FIOC_MMAP: - DEBUGASSERT((FAR void **)(uintptr_t)arg != NULL); - *(FAR void **)((uintptr_t)arg) = priv->video_inf.bufheap; - ret = OK; - - break; - default: verr("Unrecognized cmd: %d\n", cmd); ret = - ENOTTY; @@ -3201,6 +3198,21 @@ static int video_ioctl(FAR struct file *filep, int cmd, unsigned long arg) return ret; } +static int video_mmap(FAR struct file *filep, FAR struct mm_map_entry_s *map) +{ + FAR struct inode *inode = filep->f_inode; + FAR video_mng_t *priv = (FAR video_mng_t *)inode->i_private; + int ret = -EINVAL; + + if (map) + { + map->vaddr = priv->video_inf.bufheap + map->offset; + ret = OK; + } + + return ret; +} + static FAR void *video_register(FAR const char *devpath) { FAR video_mng_t *priv; diff --git a/drivers/wireless/cc1101.c b/drivers/wireless/cc1101.c index 9b0633c77ce..496f9b4dd1e 100644 --- a/drivers/wireless/cc1101.c +++ b/drivers/wireless/cc1101.c @@ -306,6 +306,7 @@ static const struct file_operations g_cc1101ops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ cc1101_file_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/wireless/gs2200m.c b/drivers/wireless/gs2200m.c index 25c3400e73e..8c1dc3647d5 100644 --- a/drivers/wireless/gs2200m.c +++ b/drivers/wireless/gs2200m.c @@ -232,6 +232,7 @@ static const struct file_operations g_gs2200m_fops = NULL, /* seek */ gs2200m_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ gs2200m_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/wireless/lpwan/sx127x/sx127x.c b/drivers/wireless/lpwan/sx127x/sx127x.c index 8f00f4e486e..8c2f898c47f 100644 --- a/drivers/wireless/lpwan/sx127x/sx127x.c +++ b/drivers/wireless/lpwan/sx127x/sx127x.c @@ -452,6 +452,7 @@ static const struct file_operations sx127x_fops = NULL, /* seek */ sx127x_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ sx127x_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/drivers/wireless/nrf24l01.c b/drivers/wireless/nrf24l01.c index 383ca7e6589..44973dae657 100644 --- a/drivers/wireless/nrf24l01.c +++ b/drivers/wireless/nrf24l01.c @@ -240,6 +240,7 @@ static const struct file_operations nrf24l01_fops = NULL, /* seek */ nrf24l01_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ nrf24l01_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/fs/binfs/fs_binfs.c b/fs/binfs/fs_binfs.c index abb8647c860..758d8c31f7c 100644 --- a/fs/binfs/fs_binfs.c +++ b/fs/binfs/fs_binfs.c @@ -110,6 +110,7 @@ const struct mountpt_operations binfs_operations = NULL, /* seek */ binfs_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL, /* sync */ binfs_dup, /* dup */ diff --git a/fs/cromfs/fs_cromfs.c b/fs/cromfs/fs_cromfs.c index 84f8184d698..c80584871bf 100644 --- a/fs/cromfs/fs_cromfs.c +++ b/fs/cromfs/fs_cromfs.c @@ -185,6 +185,7 @@ const struct mountpt_operations cromfs_operations = NULL, /* seek */ cromfs_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL, /* sync */ cromfs_dup, /* dup */ diff --git a/fs/fat/fs_fat32.c b/fs/fat/fs_fat32.c index aef7d5856b6..5086868e182 100644 --- a/fs/fat/fs_fat32.c +++ b/fs/fat/fs_fat32.c @@ -116,6 +116,7 @@ const struct mountpt_operations fat_operations = fat_seek, /* seek */ fat_ioctl, /* ioctl */ fat_truncate, /* truncate */ + NULL, /* mmap */ fat_sync, /* sync */ fat_dup, /* dup */ fat_fstat, /* fstat */ diff --git a/fs/hostfs/hostfs.c b/fs/hostfs/hostfs.c index de380b2f35e..1bb795fe545 100644 --- a/fs/hostfs/hostfs.c +++ b/fs/hostfs/hostfs.c @@ -143,6 +143,7 @@ const struct mountpt_operations hostfs_operations = hostfs_seek, /* seek */ hostfs_ioctl, /* ioctl */ hostfs_ftruncate, /* ftruncate */ + NULL, /* mmap */ hostfs_sync, /* sync */ hostfs_dup, /* dup */ diff --git a/fs/littlefs/lfs_vfs.c b/fs/littlefs/lfs_vfs.c index 9022c0c76c0..22b55e50484 100644 --- a/fs/littlefs/lfs_vfs.c +++ b/fs/littlefs/lfs_vfs.c @@ -141,6 +141,7 @@ const struct mountpt_operations littlefs_operations = littlefs_seek, /* seek */ littlefs_ioctl, /* ioctl */ littlefs_truncate, /* truncate */ + NULL, /* mmap */ littlefs_sync, /* sync */ littlefs_dup, /* dup */ diff --git a/fs/mmap/README.txt b/fs/mmap/README.txt index 4f6ba6c3177..59cecd0569d 100644 --- a/fs/mmap/README.txt +++ b/fs/mmap/README.txt @@ -14,7 +14,7 @@ conditions where mmap() can be supported: 1. mmap can be used to support eXecute In Place (XIP) on random access media under the following very restrictive conditions: - a. The filesystem supports the FIOC_MMAP ioctl command. Any file + a. The filesystem implements the mmap file operation. Any file system that maps files contiguously on the media should support this ioctl. (vs. file system that scatter files over the media in non-contiguous sectors). As of this writing, ROMFS is the diff --git a/fs/mmap/fs_mmap.c b/fs/mmap/fs_mmap.c index c99da4c2c05..5717ed1cd96 100644 --- a/fs/mmap/fs_mmap.c +++ b/fs/mmap/fs_mmap.c @@ -23,6 +23,7 @@ ****************************************************************************/ #include +#include #include #include @@ -49,7 +50,6 @@ static int file_mmap_(FAR struct file *filep, FAR void *start, size_t length, int prot, int flags, off_t offset, bool kernel, FAR void **mapped) { - FAR void *addr; int ret; /* Since only a tiny subset of mmap() functionality, we have to verify many @@ -135,14 +135,33 @@ static int file_mmap_(FAR struct file *filep, FAR void *start, #endif } - /* Perform the ioctl to get the base address of the file in 'mapped' - * in memory. (casting to uintptr_t first eliminates complaints on some - * architectures where the sizeof long is different from the size of - * a pointer). + /* Call driver's mmap to get the base address of the file in 'mapped' + * in memory. */ - ret = file_ioctl(filep, FIOC_MMAP, (unsigned long)((uintptr_t)&addr)); - if (ret < 0) + if (filep->f_inode && filep->f_inode->u.i_ops->mmap != NULL) + { + /* Pass the information about the mapping in mm_map_entry_s structure. + * The driver may alter the structure, and if it supports unmap, it + * will also add it to the kernel maintained list of mappings. + */ + + struct mm_map_entry_s map = + { + NULL, /* sq_entry_t */ + start, length, offset, + prot, flags, + NULL, /* priv */ + NULL /* munmap */ + }; + + ret = filep->f_inode->u.i_ops->mmap(filep, &map); + if (ret == OK) + { + *mapped = (void *)map.vaddr; + } + } + else { /* Not directly mappable, probably because the underlying media does * not support random access. @@ -155,15 +174,14 @@ static int file_mmap_(FAR struct file *filep, FAR void *start, return rammap(filep, length, offset, kernel, mapped); #else - ferr("ERROR: file_ioctl(FIOC_MMAP) failed: %d\n", ret); - return ret; + ferr("ERROR: mmap not supported \n"); + return -ENOSYS; #endif } - /* Return the offset address */ + /* Return */ - *mapped = (FAR void *)(((FAR uint8_t *)addr) + offset); - return OK; + return ret; } /**************************************************************************** @@ -197,7 +215,7 @@ int file_mmap(FAR struct file *filep, FAR void *start, size_t length, * 1. mmap() is the API that is used to support direct access to random * access media under the following very restrictive conditions: * - * a. The filesystem supports the FIOC_MMAP ioctl command. Any file + * a. The filesystem implements the mmap file operation. Any file * system that maps files contiguously on the media should support * this ioctl. (vs. file system that scatter files over the media * in non-contiguous sectors). As of this writing, ROMFS is the diff --git a/fs/mmap/fs_munmap.c b/fs/mmap/fs_munmap.c index 2bcef5de3ae..7b8e57d4927 100644 --- a/fs/mmap/fs_munmap.c +++ b/fs/mmap/fs_munmap.c @@ -196,7 +196,7 @@ int file_munmap(FAR void *start, size_t length) * 1. mmap() is the API that is used to support direct access to random * access media under the following very restrictive conditions: * - * a. The filesystem supports the FIOC_MMAP ioctl command. Any file + * a. The filesystem impelements the mmap file operation. Any file * system that maps files contiguously on the media should support * this ioctl. (vs. file system that scatter files over the media * in non-contiguous sectors). As of this writing, ROMFS is the diff --git a/fs/mqueue/mq_open.c b/fs/mqueue/mq_open.c index 74c78e82f36..d6c9647bcf7 100644 --- a/fs/mqueue/mq_open.c +++ b/fs/mqueue/mq_open.c @@ -61,6 +61,7 @@ static const struct file_operations g_nxmq_fileops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ nxmq_file_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/fs/nfs/nfs_vfsops.c b/fs/nfs/nfs_vfsops.c index e75aac5d410..7eae707be20 100644 --- a/fs/nfs/nfs_vfsops.c +++ b/fs/nfs/nfs_vfsops.c @@ -199,6 +199,7 @@ const struct mountpt_operations nfs_operations = NULL, /* seek */ NULL, /* ioctl */ nfs_truncate, /* truncate */ + NULL, /* mmap */ NULL, /* sync */ nfs_dup, /* dup */ diff --git a/fs/nxffs/nxffs_initialize.c b/fs/nxffs/nxffs_initialize.c index 01964038f8a..9b7e124a544 100644 --- a/fs/nxffs/nxffs_initialize.c +++ b/fs/nxffs/nxffs_initialize.c @@ -59,6 +59,7 @@ const struct mountpt_operations nxffs_operations = #else NULL, /* truncate */ #endif + NULL, /* mmap */ NULL, /* sync -- No buffered data */ nxffs_dup, /* dup */ diff --git a/fs/procfs/fs_procfs.c b/fs/procfs/fs_procfs.c index ee5276d00c7..7b446cc12ee 100644 --- a/fs/procfs/fs_procfs.c +++ b/fs/procfs/fs_procfs.c @@ -253,6 +253,7 @@ const struct mountpt_operations procfs_operations = NULL, /* seek */ procfs_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL, /* sync */ procfs_dup, /* dup */ diff --git a/fs/romfs/fs_romfs.c b/fs/romfs/fs_romfs.c index 91fceacf8dc..6d45fc48f6f 100644 --- a/fs/romfs/fs_romfs.c +++ b/fs/romfs/fs_romfs.c @@ -73,6 +73,8 @@ static ssize_t romfs_read(FAR struct file *filep, FAR char *buffer, static off_t romfs_seek(FAR struct file *filep, off_t offset, int whence); static int romfs_ioctl(FAR struct file *filep, int cmd, unsigned long arg); +static int romfs_mmap(FAR struct file *filep, + FAR struct mm_map_entry_s *map); static int romfs_dup(FAR const struct file *oldp, FAR struct file *newp); @@ -120,12 +122,12 @@ const struct mountpt_operations romfs_operations = romfs_seek, /* seek */ romfs_ioctl, /* ioctl */ NULL, /* truncate */ + romfs_mmap, /* mmap */ NULL, /* sync */ romfs_dup, /* dup */ romfs_fstat, /* fstat */ NULL, /* fchstat */ - NULL, /* truncate */ romfs_opendir, /* opendir */ romfs_closedir, /* closedir */ @@ -578,9 +580,7 @@ errout_with_lock: static int romfs_ioctl(FAR struct file *filep, int cmd, unsigned long arg) { - FAR struct romfs_mountpt_s *rm; FAR struct romfs_file_s *rf; - FAR void **ppv = (FAR void**)arg; finfo("cmd: %d arg: %08lx\n", cmd, arg); @@ -591,22 +591,10 @@ static int romfs_ioctl(FAR struct file *filep, int cmd, unsigned long arg) /* Recover our private data from the struct file instance */ rf = filep->f_priv; - rm = filep->f_inode->i_private; - - DEBUGASSERT(rm != NULL); /* Only one ioctl command is supported */ - if (cmd == FIOC_MMAP && rm->rm_xipbase && ppv) - { - /* Return the address on the media corresponding to the start of - * the file. - */ - - *ppv = rm->rm_xipbase + rf->rf_startoffset; - return OK; - } - else if (cmd == FIOC_FILEPATH) + if (cmd == FIOC_FILEPATH) { FAR char *ptr = (FAR char *)((uintptr_t)arg); inode_getpath(filep->f_inode, ptr); @@ -618,6 +606,35 @@ static int romfs_ioctl(FAR struct file *filep, int cmd, unsigned long arg) return -ENOTTY; } +static int romfs_mmap(FAR struct file *filep, FAR struct mm_map_entry_s *map) +{ + FAR struct romfs_mountpt_s *rm; + FAR struct romfs_file_s *rf; + int ret = -EINVAL; + + /* Sanity checks */ + + DEBUGASSERT(filep->f_priv != NULL && filep->f_inode != NULL); + + /* Recover our private data from the struct file instance */ + + rf = filep->f_priv; + rm = filep->f_inode->i_private; + + /* Return the address on the media corresponding to the start of + * the file. + */ + + if (map && rm && rm->rm_xipbase && rf && + map->offset + map->length <= rf->rf_size) + { + map->vaddr = rm->rm_xipbase + rf->rf_startoffset + map->offset; + ret = OK; + } + + return ret; +} + /**************************************************************************** * Name: romfs_dup ****************************************************************************/ diff --git a/fs/rpmsgfs/rpmsgfs.c b/fs/rpmsgfs/rpmsgfs.c index c35984098f0..b56f5662bd6 100644 --- a/fs/rpmsgfs/rpmsgfs.c +++ b/fs/rpmsgfs/rpmsgfs.c @@ -162,6 +162,7 @@ const struct mountpt_operations rpmsgfs_operations = rpmsgfs_seek, /* seek */ rpmsgfs_ioctl, /* ioctl */ rpmsgfs_ftruncate, /* ftruncate */ + NULL, /* mmap */ rpmsgfs_sync, /* sync */ rpmsgfs_dup, /* dup */ diff --git a/fs/smartfs/smartfs_smart.c b/fs/smartfs/smartfs_smart.c index f5735cea05f..93486cedf7f 100644 --- a/fs/smartfs/smartfs_smart.c +++ b/fs/smartfs/smartfs_smart.c @@ -141,6 +141,7 @@ const struct mountpt_operations smartfs_operations = smartfs_seek, /* seek */ smartfs_ioctl, /* ioctl */ smartfs_truncate, /* truncate */ + NULL, /* mmap */ smartfs_sync, /* sync */ smartfs_dup, /* dup */ diff --git a/fs/socket/socket.c b/fs/socket/socket.c index f18bc489631..30c5716b76f 100644 --- a/fs/socket/socket.c +++ b/fs/socket/socket.c @@ -65,6 +65,7 @@ static const struct file_operations g_sock_fileops = NULL, /* seek */ sock_file_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ sock_file_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/fs/spiffs/src/spiffs_vfs.c b/fs/spiffs/src/spiffs_vfs.c index 011f1e53db2..b3c9b77fbd4 100644 --- a/fs/spiffs/src/spiffs_vfs.c +++ b/fs/spiffs/src/spiffs_vfs.c @@ -142,6 +142,7 @@ const struct mountpt_operations spiffs_operations = spiffs_seek, /* seek */ spiffs_ioctl, /* ioctl */ spiffs_truncate, /* truncate */ + NULL, /* mmap */ spiffs_sync, /* sync */ spiffs_dup, /* dup */ diff --git a/fs/tmpfs/fs_tmpfs.c b/fs/tmpfs/fs_tmpfs.c index 4c92eb04a8c..7db062e62a9 100644 --- a/fs/tmpfs/fs_tmpfs.c +++ b/fs/tmpfs/fs_tmpfs.c @@ -134,11 +134,12 @@ static ssize_t tmpfs_read(FAR struct file *filep, FAR char *buffer, static ssize_t tmpfs_write(FAR struct file *filep, FAR const char *buffer, size_t buflen); static off_t tmpfs_seek(FAR struct file *filep, off_t offset, int whence); -static int tmpfs_ioctl(FAR struct file *filep, int cmd, unsigned long arg); static int tmpfs_sync(FAR struct file *filep); static int tmpfs_dup(FAR const struct file *oldp, FAR struct file *newp); static int tmpfs_fstat(FAR const struct file *filep, FAR struct stat *buf); static int tmpfs_truncate(FAR struct file *filep, off_t length); +static int tmpfs_mmap(FAR struct file *filep, + FAR struct mm_map_entry_s *map); static int tmpfs_opendir(FAR struct inode *mountpt, FAR const char *relpath, FAR struct fs_dirent_s **dir); @@ -176,8 +177,9 @@ const struct mountpt_operations tmpfs_operations = tmpfs_read, /* read */ tmpfs_write, /* write */ tmpfs_seek, /* seek */ - tmpfs_ioctl, /* ioctl */ + NULL, /* ioctl */ tmpfs_truncate, /* truncate */ + tmpfs_mmap, /* mmap */ tmpfs_sync, /* sync */ tmpfs_dup, /* dup */ @@ -1640,16 +1642,11 @@ static off_t tmpfs_seek(FAR struct file *filep, off_t offset, int whence) return position; } -/**************************************************************************** - * Name: tmpfs_ioctl - ****************************************************************************/ - -static int tmpfs_ioctl(FAR struct file *filep, int cmd, unsigned long arg) +static int tmpfs_mmap(FAR struct file *filep, FAR struct mm_map_entry_s *map) { FAR struct tmpfs_file_s *tfo; - FAR void **ppv = (FAR void**)arg; + int ret = -EINVAL; - finfo("filep: %p cmd: %d arg: %08lx\n", filep, cmd, arg); DEBUGASSERT(filep->f_priv != NULL && filep->f_inode != NULL); /* Recover our private data from the struct file instance */ @@ -1658,20 +1655,13 @@ static int tmpfs_ioctl(FAR struct file *filep, int cmd, unsigned long arg) DEBUGASSERT(tfo != NULL); - /* Only one ioctl command is supported */ - - if (cmd == FIOC_MMAP && ppv != NULL) + if (map && map->offset + map->length <= tfo->tfo_size) { - /* Return the address on the media corresponding to the start of - * the file. - */ - - *ppv = (FAR void *)tfo->tfo_data; - return OK; + map->vaddr = tfo->tfo_data + map->offset; + ret = OK; } - ferr("ERROR: Invalid cmd: %d\n", cmd); - return -ENOTTY; + return ret; } /**************************************************************************** diff --git a/fs/unionfs/fs_unionfs.c b/fs/unionfs/fs_unionfs.c index 50b2f5ad263..6aa10c83f22 100644 --- a/fs/unionfs/fs_unionfs.c +++ b/fs/unionfs/fs_unionfs.c @@ -223,6 +223,7 @@ const struct mountpt_operations unionfs_operations = unionfs_seek, /* seek */ unionfs_ioctl, /* ioctl */ unionfs_truncate, /* truncate */ + NULL, /* mmap */ unionfs_sync, /* sync */ unionfs_dup, /* dup */ diff --git a/fs/userfs/fs_userfs.c b/fs/userfs/fs_userfs.c index 303a8571af3..fad5276b989 100644 --- a/fs/userfs/fs_userfs.c +++ b/fs/userfs/fs_userfs.c @@ -161,6 +161,7 @@ const struct mountpt_operations userfs_operations = userfs_seek, /* seek */ userfs_ioctl, /* ioctl */ userfs_truncate, /* truncate */ + NULL, /* mmap */ userfs_sync, /* sync */ userfs_dup, /* dup */ diff --git a/fs/vfs/fs_epoll.c b/fs/vfs/fs_epoll.c index c642333b207..18450c2798d 100644 --- a/fs/vfs/fs_epoll.c +++ b/fs/vfs/fs_epoll.c @@ -105,6 +105,7 @@ static const struct file_operations g_epoll_ops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ epoll_do_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/fs/vfs/fs_eventfd.c b/fs/vfs/fs_eventfd.c index 78610a5de74..4b2769d900a 100644 --- a/fs/vfs/fs_eventfd.c +++ b/fs/vfs/fs_eventfd.c @@ -101,6 +101,7 @@ static const struct file_operations g_eventfd_fops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ #ifdef CONFIG_EVENT_FD_POLL eventfd_do_poll /* poll */ #else diff --git a/fs/vfs/fs_signalfd.c b/fs/vfs/fs_signalfd.c index 6ffa8b1671d..8c26ba8481f 100644 --- a/fs/vfs/fs_signalfd.c +++ b/fs/vfs/fs_signalfd.c @@ -80,6 +80,7 @@ static const struct file_operations g_signalfd_fileops = NULL, /* seek */ NULL, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ signalfd_file_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , NULL /* unlink */ diff --git a/graphics/nxterm/nxterm_driver.c b/graphics/nxterm/nxterm_driver.c index 594dc975192..7fd79f7bc28 100644 --- a/graphics/nxterm/nxterm_driver.c +++ b/graphics/nxterm/nxterm_driver.c @@ -67,6 +67,7 @@ const struct file_operations g_nxterm_drvrops = NULL, /* seek */ nxterm_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ nxterm_poll /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , nxterm_unlink /* unlink */ @@ -84,6 +85,7 @@ const struct file_operations g_nxterm_drvrops = NULL, /* seek */ nxterm_ioctl, /* ioctl */ NULL, /* truncate */ + NULL, /* mmap */ NULL /* poll */ #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS , nxterm_unlink /* unlink */ diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h index cf011428f66..21e31adf03e 100644 --- a/include/nuttx/fs/fs.h +++ b/include/nuttx/fs/fs.h @@ -37,6 +37,7 @@ #include #include +#include /**************************************************************************** * Pre-processor Definitions @@ -213,6 +214,7 @@ struct file_operations off_t (*seek)(FAR struct file *filep, off_t offset, int whence); int (*ioctl)(FAR struct file *filep, int cmd, unsigned long arg); int (*truncate)(FAR struct file *filep, off_t length); + int (*mmap)(FAR struct file *filep, FAR struct mm_map_entry_s *map); /* The two structures need not be common after this point */ @@ -300,6 +302,7 @@ struct mountpt_operations off_t (*seek)(FAR struct file *filep, off_t offset, int whence); int (*ioctl)(FAR struct file *filep, int cmd, unsigned long arg); int (*truncate)(FAR struct file *filep, off_t length); + int (*mmap)(FAR struct file *filep, FAR struct mm_map_entry_s *map); /* The two structures need not be common after this point. The following * are extended methods needed to deal with the unique needs of mounted diff --git a/include/nuttx/fs/ioctl.h b/include/nuttx/fs/ioctl.h index f356002eff3..a231e85f82d 100644 --- a/include/nuttx/fs/ioctl.h +++ b/include/nuttx/fs/ioctl.h @@ -134,55 +134,50 @@ #define _FIOCVALID(c) (_IOC_TYPE(c)==_FIOCBASE) #define _FIOC(nr) _IOC(_FIOCBASE,nr) -#define FIOC_MMAP _FIOC(0x0001) /* IN: Location to return address (void **) - * OUT: If media is directly accessible, - * return (void*) base address - * of file - */ -#define FIOC_REFORMAT _FIOC(0x0002) /* IN: None +#define FIOC_REFORMAT _FIOC(0x0001) /* IN: None * OUT: None */ -#define FIOC_OPTIMIZE _FIOC(0x0003) /* IN: The number of bytes to recover +#define FIOC_OPTIMIZE _FIOC(0x0002) /* IN: The number of bytes to recover * (ignored on most file systems) * OUT: None */ -#define FIOC_FILEPATH _FIOC(0x0004) /* IN: FAR char *(length >= PATH_MAX) +#define FIOC_FILEPATH _FIOC(0x0003) /* IN: FAR char *(length >= PATH_MAX) * OUT: The full file path */ -#define FIOC_INTEGRITY _FIOC(0x0005) /* Run a consistency check on the +#define FIOC_INTEGRITY _FIOC(0x0004) /* Run a consistency check on the * file system media. * IN: None * OUT: None */ -#define FIOC_DUMP _FIOC(0x0006) /* Dump logical content of media. +#define FIOC_DUMP _FIOC(0x0005) /* Dump logical content of media. * IN: None * OUT: None */ -#define FIONREAD _FIOC(0x0007) /* IN: Location to return value (int *) +#define FIONREAD _FIOC(0x0006) /* IN: Location to return value (int *) * OUT: Bytes readable from this fd */ -#define FIONWRITE _FIOC(0x0008) /* IN: Location to return value (int *) +#define FIONWRITE _FIOC(0x0007) /* IN: Location to return value (int *) * OUT: Number bytes in send queue */ -#define FIONSPACE _FIOC(0x0009) /* IN: Location to return value (int *) +#define FIONSPACE _FIOC(0x0008) /* IN: Location to return value (int *) * OUT: Free space in send queue. */ -#define FIONUSERFS _FIOC(0x000a) /* IN: Pointer to struct usefs_config_s +#define FIONUSERFS _FIOC(0x0009) /* IN: Pointer to struct usefs_config_s * holding userfs configuration. * OUT: Instance number is returned on * success. */ -#define FIONBIO _FIOC(0x000b) /* IN: Boolean option takes an +#define FIONBIO _FIOC(0x000a) /* IN: Boolean option takes an * int value. * OUT: Origin option. */ -#define FIOCLEX _FIOC(0x000c) /* IN: None +#define FIOCLEX _FIOC(0x000b) /* IN: None * OUT: None */ -#define FIONCLEX _FIOC(0x000d) /* IN: None +#define FIONCLEX _FIOC(0x000c) /* IN: None * OUT: None */ -#define FIOC_NOTIFY _FIOC(0x000e) /* IN: Pointer to struct automount_notify_s +#define FIOC_NOTIFY _FIOC(0x000d) /* IN: Pointer to struct automount_notify_s * holding automount notification * configuration * OUT: None diff --git a/include/nuttx/mm/map.h b/include/nuttx/mm/map.h new file mode 100644 index 00000000000..cf1d38f0474 --- /dev/null +++ b/include/nuttx/mm/map.h @@ -0,0 +1,73 @@ +/**************************************************************************** + * include/nuttx/mm/map.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __INCLUDE_NUTTX_MM_MAP_H +#define __INCLUDE_NUTTX_MM_MAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/* A memory mapping list item */ + +struct mm_map_entry_s +{ + FAR struct mm_map_entry *flink; /* this is used as sq_entry_t */ + FAR const void *vaddr; + size_t length; + off_t offset; + int prot; + int flags; + FAR void *priv; + + /* Drivers which register mappings may also + * implement the unmap function to undo anything done in mmap. + * Nb. Implementation must NOT use "this_task()->group" since + * this is not valid during process exit. The argument "group" will be + * NULL in this case. + */ + + int (*munmap)(FAR struct task_group_s *group, + FAR struct mm_map_entry_s *map, + FAR void *start, + size_t length); +}; + +/* A structure for the task group */ + +struct mm_map_s +{ + sq_queue_t mm_map_sq; + mutex_t mm_map_mutex; +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#endif /* __INCLUDE_NUTTX_MM_MM_MAP_H */