Я работаю с отладочной платой 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);
И так далее
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
Подскажите, пожалуйста, если кто-либо уже сталкивался с подобными проблемами) Спасибо)