Bagikan melalui


Kontrol I/O (ioctls)

Topik ini membahas ioctl Linux yang merupakan bagian dari file header yang dikirim dengan Azure Sphere SDK. Ioctls Linux diekspos untuk konverter analog-ke-digital (ADC) dan periferal pulse-width modulation (PWM), tujuan umum I/O (gpio), universal asynchronous receiver-transmitters (UART), dan penskalaan kinerja CPU (CPUFreq).

Jika Anda memilih untuk tidak menggunakan ioctls Linux, gunakan API yang tersedia di pustaka runtime Azure Sphere.

Jalur file berikut didukung dalam panggilan Linux open() untuk membuat file dan deskriptor file untuk fungsi I/O:

  /dev/gpiochip<number>
  /dev/tty<affix><number>
  /dev/pwm<number>
  /dev/adc<number>

CPUFreq

Perilaku ioctl ini setara dengan mengatur atribut kebijakan gubernur penskalaan dalam sysfs. Lihat scaling_governor. Definisi azure_sphere_cpufreq_dev_scaling_governor_for_cpu struct dapat ditemukan di usr/include/linux/cpufreq_dev.h

#define CPUFREQ_SET_SCALING_GOVERNOR_FOR_CPU _IOW('p', 0x0A, struct azure_sphere_cpufreq_dev_scaling_governor_for_cpu)

Parameter

  • Fd deskriptor file untuk dibuka
  • CPUFREQ_SET_SCALING_GOVERNOR_FOR_CPU permintaan
  • &Sgn buat detail

Contoh kode

int fd = open("/dev/cpufreq", O_WRONLY | O_CLOEXEC, 0);
if (fd >= 0) {
    struct azure_sphere_cpufreq_dev_scaling_governor_for_cpu sgn;
    sgn.cpu = 0;
    sgn.governor_name = "ondemand" //allowed values are conservative, ondemand, and performance
    int res = ioctl(fd, CPUFREQ_SET_SCALING_GOVERNOR_FOR_CPU, &sgn);
}

ADC

Ioctls I/O (IIO) industri berikut mengekspos ADC di Azure Sphere, dan didefinisikan dalam usr/include/linux/iio/ioctl.h:

  #define IIO_GET_DEVICE_INFO_BUFFER_TOTAL_SIZE_IOCTL _IOR('i', 0xD0, unsigned int)
  #define IIO_GET_DEVICE_INFO_BUFFER_IOCTL _IOWR('i', 0xD1, struct iio_ioctl_dev_info_buffer)
  #define IIO_GET_CHANNEL_SPEC_BUFFER_TOTAL_SIZE_IOCTL _IOWR('i', 0xD2, struct iio_ioctl_chan_spec_buffer_size)
  #define IIO_GET_CHANNEL_SPEC_BUFFER_IOCTL _IOWR('i', 0xD3, struct iio_ioctl_chan_spec_buffer)
  #define IIO_READ_RAW_CHANNEL_INFO_IOCTL _IOWR('i', 0xD4, struct iio_ioctl_raw_channel_info)
  #define IIO_WRITE_RAW_CHANNEL_INFO_IOCTL _IOWR('i', 0xD5, struct iio_ioctl_raw_channel_info)
  #define IIO_READ_CHANNEL_EXT_INFO_IOCTL _IOWR('i', 0xD6, struct iio_ioctl_read_chan_ext_info)
  #define IIO_WRITE_CHANNEL_EXT_INFO_IOCTL _IOWR('i', 0xD7, struct iio_ioctl_write_chan_ext_info)
  #define IIO_SCAN_MASK_QUERY_BIT_IOCTL _IOW('i', 0xD8, unsigned int)
  #define IIO_SCAN_MASK_SET_BIT_IOCTL_IOW('i', 0xD9, unsigned int)
  #define IIO_SCAN_MASK_CLEAR_BIT_IOCTL _IOW('i', 0xDA, unsigned int)
  #define IIO_BUFFER_GET_ENABLE_IOCTL _IO('i', 0xDB)
  #define IIO_BUFFER_SET_ENABLE_IOCTL _IOW('i', 0xDC, unsigned int)
  #define IIO_BUFFER_GET_LENGTH_IOCTL_IO('i', 0xDD)
  #define IIO_BUFFER_SET_LENGTH_IOCTL _IOW('i', 0xDE, unsigned int)
  #define IIO_BUFFER_GET_WATERMARK_IOCTL _IO('i', 0xDF)
  #define IIO_BUFFER_SET_WATERMARK_IOCTL _IOW('i', 0xE0, unsigned int)

Untuk informasi selengkapnya, lihat Menggunakan ADC dalam aplikasi tingkat tinggi.

PWM

Ioctls berikut ini diekspos untuk PWM dalam file header Sysroots/ApiSet/usr/include/linux/pwm.h (Linux OS):

 #define PWM_APPLY_STATE _IOW(0xf7, 0x01, struct pwm_chardev_params)
 #define PWM_GET_STATE _IOWR(0xf7, 0x02, struct pwm_chardev_params)

Untuk informasi selengkapnya tentang menyiapkan manifes aplikasi untuk mendapatkan akses ke ioctls ini, lihat Pengaturan manifes aplikasi dan Menggunakan PWM dalam aplikasi tingkat tinggi.

GPIO

Ioctls berikut ini diekspos untuk GPIO dalam file header usr/include/linux/gpio.h:

  #define GPIOHANDLE_GET_LINE_VALUES_IOCTL _IOWR(0xB4, 0x08, struct gpiohandle_data)
  #define GPIOHANDLE_SET_LINE_VALUES_IOCTL _IOWR(0xB4, 0x09, struct gpiohandle_data)

  #define GPIO_GET_CHIPINFO_IOCTL _IOR(0xB4, 0x01, struct gpiochip_info)
  #define GPIO_GET_LINEINFO_IOCTL _IOWR(0xB4, 0x02, struct gpioline_info)
  #define GPIO_GET_LINEHANDLE_IOCTL _IOWR(0xB4, 0x03, struct gpiohandle_request)
  #define GPIO_GET_LINEEVENT_IOCTL _IOWR(0xB4, 0x04, struct gpioevent_request)

Untuk informasi selengkapnya tentang menyiapkan manifes aplikasi untuk mendapatkan akses ke ioctls ini untuk GPIO, lihat Pengaturan manifes aplikasi, dan Menggunakan GPIO dalam aplikasi tingkat tinggi.

UART

Untuk daftar ioctls yang diekspos untuk terminal dan garis seri mengandalkan universal asynchronous receiver-transmitters (UART), lihat ioctls Linux untuk terminal dan garis seri.

Untuk informasi selengkapnya tentang menyiapkan manifes aplikasi untuk mendapatkan akses ke ioctl ini untuk UART, lihat Pengaturan manifes aplikasi dan Menggunakan UART dalam aplikasi tingkat tinggi.