Controlos de E/S (ioctls)
Este tópico abrange os ioctls do Linux que fazem parte dos ficheiros de cabeçalho enviados com o SDK do Azure Sphere. Os ioctls do Linux são expostos para periféricos de conversor analógico-digital (ADC) e modulação de largura do pulso (PWM), E/S (gpio), transmissores recetores assíncronos universais (UARTs) e dimensionamento do desempenho da CPU (CPUFreq).
Se preferir não utilizar ioctls do Linux, utilize as APIs disponíveis nas bibliotecas de runtime do Azure Sphere.
Os seguintes caminhos de ficheiro são suportados na chamada open() do Linux para criar ficheiros e descritores de ficheiros para funções de E/S:
/dev/gpiochip<number>
/dev/tty<affix><number>
/dev/pwm<number>
/dev/adc<number>
CPUFreq
O comportamento deste ioctl é equivalente a definir o atributo de política de governador de dimensionamento em sysfs. Veja scaling_governor.
A azure_sphere_cpufreq_dev_scaling_governor_for_cpu
definição de estrutura pode ser encontrada em 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)
Parâmetros
-
Fd
o descritor de ficheiros a abrir -
CPUFREQ_SET_SCALING_GOVERNOR_FOR_CPU
o pedido -
&Sgn
detalhes da estrutura
Código de exemplo
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
Os seguintes ioctls industriais de E/S (IIO) expõem o ADC no Azure Sphere e são definidos em 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)
Para obter mais informações, veja Utilizar ADCs em aplicações de alto nível.
PWM
Os seguintes ioctls são expostos para PWM no ficheiro de cabeçalho Sysroots/ApiSet/usr/include/linux/pwm.h (SO Linux):
#define PWM_APPLY_STATE _IOW(0xf7, 0x01, struct pwm_chardev_params)
#define PWM_GET_STATE _IOWR(0xf7, 0x02, struct pwm_chardev_params)
Para obter mais informações sobre como configurar o manifesto da aplicação para obter acesso a estes ioctls, veja Application manifest settings (Definições do manifesto da aplicação) e Use PWMs in high-level applications (Utilizar PWMs em aplicações de alto nível).
GPIO
Os seguintes ioctls são expostos para GPIO no ficheiro de cabeçalho 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)
Para obter mais informações sobre como configurar o manifesto da aplicação para obter acesso a estes ioctls para GPIOs, veja Definições do manifesto da aplicação e Utilizar GPIOs em aplicações de alto nível.
UART
Para obter a lista de ioctls expostos para terminais e linhas de série que dependem de transmissores recetores assíncronos universais (UARTs), veja os ioctls do Linux para terminais e linhas de série.
Para obter mais informações sobre como configurar o manifesto da aplicação para obter acesso a estes ioctls para UARTs, veja Definições de manifesto de aplicação e Utilizar UARTs em aplicações de alto nível.