Найти - Пользователи
Полная версия: Доступ к символьному устройству в python
Начало » Python для новичков » Доступ к символьному устройству в python
1
kusmich
Добрый день) Задавала уже данный вопрос в другом разделе, но, возможно, логичнее будет задать его здесь. Итак…
Я работаю с отладочной платой AT91SAM9261-EK (на базе ядра ARM9), на котором использую ядро linux-2.6.30. Скомпилирован python для архитектуры ARM9. Необходимо из python'а управлять портом ввода-вывода. Написаны драйверы для доступа к портам ввода/вывода (конкретно к порту PA4 с заведенным на него диодом, который можно гасить и зажигать).
Текст драйвера для работы с лампой приведен ниже (основные функции):
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <linux/ioctl.h>
#include <asm/gpio.h>

MODULE_LICENSE("GPL");

// Major number
int gpio_major = 70;

// Buffer to store data
char *gpio_buffer;


/* declare local functions */
static int user_gpio_open (struct inode *inode, struct file *filp);
static int user_gpio_release (struct inode *inode, struct file *filp);
static int user_gpio_write_value( struct file *filp, char *buf, size_t count);
static int user_gpio_read_value( struct file *filp, char *buf, size_t count);
static void __exit GIO32_exit(void);
static int __init GIO32_init(void);

/* declare file operation structure */
static struct file_operations user_gpio_fops = {
.owner = THIS_MODULE,
.open = user_gpio_open,
.read = user_gpio_read_value,
.write = user_gpio_write_value,
.release = user_gpio_release,
};
//*****************************************************************************
static int __init GIO32_init(void)
{
int result, result1, result2, result3, result4;
result = register_chrdev(gpio_major, "PA4", &user_gpio_fops);
if (result < 0)
{
return -1;
}
// Allocating memory for the buffer
gpio_buffer = kmalloc(2, GFP_KERNEL);
if (!gpio_buffer)
{
result = -ENOMEM;
goto fail;
}
memset(gpio_buffer, 0, 2);
return 0;
fail:
GIO32_exit();
return result;
return 0;
}

static void __exit GIO32_exit(void)
{
// Freeing the major number
unregister_chrdev(gpio_major, "PA4");
// Freeing buffer memory
if (gpio_buffer)
{
kfree(gpio_buffer);
}
}

/* init and exit functions */
module_init(GIO32_init);
module_exit(GIO32_exit);

/ *****************************************************************************/
static int user_gpio_open (struct inode *inode, struct file *filp)
{
gpio_direction_output(AT91_PIN_PA4,1);
return 0;
}

/******************************************************************************
* user_gpio_release - do nothing
*****************************************************************************/
static int user_gpio_release (struct inode *inode, struct file *filp)
{
return 0;
}
//******************************************************************************
static int user_gpio_write_value( struct file *filp, char *buf, size_t count)

{
char *tmp;
tmp = buf + count - 1;
copy_from_user(gpio_buffer, tmp, 1);
if (gpio_buffer[0] == 0)
{
gpio_set_value(AT91_PIN_PA4, 0);
}
else if (gpio_buffer[0] == 1)
{
gpio_direction_output(AT91_PIN_PA4,1);
gpio_set_value(AT91_PIN_PA4, 1);
}
return 1;
}
//******************************************************************************
static int user_gpio_read_value( struct file *filp, char *buf, size_t count)
{
int val;
gpio_buffer[0] = gpio_get_value(AT91_PIN_PA4);
gpio_buffer[1] = gpio_get_value(AT91_PIN_PA4);
copy_to_user(buf, gpio_buffer, 2);
return val;
}
Последовательность действий следующая:
1)Создаем файл устройства mknod /dev/PA4 c 70 0
2)подключаем наш модуль ядра - insmod lamp.ko
3)Теперь можно писать в порт значение и считывать из него, как из обычного файла, например
fd =  open("/dev/PA4", O_RDWR);
result = read (fd, buf, 2);
И так далее
Проблема возникает при попытке доступа к моему порту из Python'a. Делаю следующее:
import os
dev=os.open('/dev/PA4', os.O_RDONLY) - тут все вроде нормально

byte=os.read(dev,2)
File "<stdin>", line 1, in <module>
OSError: [Errno 0] Error
То есть при попытке считать из устройства /dev/PA4 возникает эта ошибка…Не могу найти ее причину, так как при доступе к порту из обычной С-шной программы все работает нормально)

Подскажите, пожалуйста, если кто-либо уже сталкивался с подобными проблемами) Спасибо)
.Serj.

А если проще:
dev = open('/dev/PA4')
byte = dev.read(2)
С /dev/urandom работает
kusmich
Попробую…но вроде так пыталась уже..не помогло( хотя попробую еще…
Есть вариант использовать еще С-шные функции в питоне..но с этим тоже надо разбираться…
Андрей Светлов
Милая барышня, Питон ничего чудесного не делает. Он только проверял os.read на ошибки (что ваш пример на С не делает).
А вот из user_gpio_read_value нужно возвращать количество прочитанных байтов, а не то что случайно в регистрах будет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB