Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
устройство по I2C
and73y
Добавлено 19.02.2010 15:42 Редактировалось 19.02.2010 15:57
0
Сообщение: 1
and73y
5

Пункты: 1154
Регистрация: 25.11.2009
Есть задача - подключить по I2C устройство (микросхема PCF8574).
К контроллеру подключил. Но в /dev устройства i2c нету(согласно мане /Documentation/i2c/dev-interface).

Надо пересобирать ядро с поддержкой именно этого девайса (PCF8574)? но ведь по идее I2C это стандартный интерфейс и ядру должно быть пофиг какое там конкретное железо сидит...
или я копаю не там?

P.S.
плата SAM9260
система дефолтная
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 19.02.2010 16:08 Сообщение: 2
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
допустим в системе есть драйвер подержки pcf8574..
в ядре взведены необходимые галочки и ядро пересобрано с учетом подключенного драйвера или драйвер собран отдельно в виде модуля..
не худо бы прописать в
\arch\arm\mach-at91\board-sam9260ek.c
в этой структуре свое устройство:
static struct i2c_board_info __initdata ek_i2c_devices[]

Цитата
ядру должно быть пофиг какое там конкретное железо

imho, ядру вообще все пофиг :)
человеку надо - человек суетится :))

если не срастется, то лог загрузки сюда, хотя бы типа
dmesg | grep i2c

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Kuzemko
Добавлено 19.02.2010 19:23 Сообщение: 3
Kuzemko
0

Пункты: 370
Регистрация: 26.09.2009
Пол: Мужчина
Например для ядра 2.6.33-rc8 у меня в \arch\arm\mach-at91\board-sam9260ek.c


static struct pcf857x_platform_data pcf857x_data[] = {
{
.gpio_base = 4 * 32,
.setup = ek_led_setup,
.teardown = ek_led_teardown,

}, {
.gpio_base = 4 * 32 + 8,
}
};

static struct i2c_board_info __initdata ek_i2c_devices[] = {
{
I2C_BOARD_INFO("24c02", 0x50),
},
{
I2C_BOARD_INFO("ics1523", 0x26),
},
{
I2C_BOARD_INFO("ds1338", 0x68),
},
{
I2C_BOARD_INFO("pcf857x",0x38),
.type = "pcf8574a",
.platform_data = &pcf857x_data[1],
},
{
I2C_BOARD_INFO("pcf857x", 0x39),
.type = "pcf8574a",
.platform_data = &pcf857x_data[0],
},
{
I2C_BOARD_INFO("ad5263",0x2c)
},
/* more devices can be added using expansion connectors */
};
Спуститься к концу Подняться к началу
Персональная информация
and73y
Добавлено 24.02.2010 15:20 Редактировалось 24.02.2010 15:25 Сообщение: 4
and73y
5

Пункты: 1154
Регистрация: 25.11.2009
Спасибо за ответы.

Я так понял, что в строке:
I2C_BOARD_INFO("pcf857x",0x38),
0x38 - это адрес чипа на шине I2C

Возник вопрос про gpio_base
В исходниках написана загадочная фраза:
@gpio_base: number of the chip's first GPIO

подскажите, что значит эта строка:
.gpio_base = 4 * 32

P.S.
Поковырялся в исходниках и нашел:
#define I2C_BOARD_INFO(dev_type, dev_addr) \
.type = dev_type, .addr = (dev_addr)

поэтому можно сразу писать:
I2C_BOARD_INFO("pcf8574a",0x38),
.platform_data = &pcf857x_data[1],
},
{
I2C_BOARD_INFO("pcf8574a", 0x39),
.platform_data = &pcf857x_data[0],
},
Спуститься к концу Подняться к началу
Персональная информация
Kuzemko
Добавлено 24.02.2010 20:07 Редактировалось 24.02.2010 20:08 Сообщение: 5
Kuzemko
0

Пункты: 370
Регистрация: 26.09.2009
Пол: Мужчина
.gpio_base = 4 * 32

Значит, что для ядра порты расширителя будут под номерами 128..135.
Появится также /sys/class/gpio/gpiochip128/device/ и /sys/class/gpio/gpiochip136/ (для моего случая).

У меня на этом порту отладочные светодиоды (включаються 0 на выходе).
В боард файле есть такое определение
Код

static struct gpio_led ek_leds[] = {
{ .name = "DS8", .active_low = 1, },
{ .name = "DS7", .active_low = 1, },
{ .name = "DS6", .active_low = 1, },
{ .name = "DS5", .active_low = 1, },
{ .name = "DS4", .active_low = 1, },
{ .name = "DS3", .active_low = 1, },
{ .name = "DS2", .active_low = 1, },
{ .name = "DS1", .active_low = 1, },
};

static const struct gpio_led_platform_data ek_led_data = {
.num_leds = ARRAY_SIZE(ek_leds),
.leds = ek_leds,
};

static struct platform_device *ek_led_dev;

static int ek_led_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
{
struct gpio_led *leds = ek_leds;
int status;

while (ngpio--) {
leds->gpio = gpio++;
leds++;
}

/* what an extremely annoying way to be forced to handle
* device unregistration ...
*/
ek_led_dev = platform_device_alloc("leds-gpio", 0);
platform_device_add_data(ek_led_dev,
&ek_led_data, sizeof ek_led_data);

ek_led_dev->dev.parent = &client->dev;
status = platform_device_add(ek_led_dev);
if (status < 0) {
platform_device_put(ek_led_dev);
ek_led_dev = NULL;
}
return status;
}

static int ek_led_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
{
if (ek_led_dev) {
platform_device_unregister(ek_led_dev);
ek_led_dev = NULL;
}
return 0;
}


С такими настройками у меня в /sys/class/leds/ восемь папочек DS1-DS8 (светодиоды). В каждой папочке есть фалик trigger. Через него можно светодиод включить, заставить моргать по разному. Я например включаю сетодиод при запуске ssh сервера (через скрипт запуска). Сразу видно когда к плате уже можно обращаться по ssh.
Спуститься к концу Подняться к началу
Персональная информация
and73y
Добавлено 25.02.2010 12:35 Редактировалось 25.02.2010 12:42 Сообщение: 6
and73y
5

Пункты: 1154
Регистрация: 25.11.2009
Сделал так:
Код
static struct pcf857x_platform_data pcf857x_data[] = {
{
.gpio_base = 4 * 32,
}
};

static struct i2c_board_info __initdata ek_i2c_devices[] = {

{

I2C_BOARD_INFO("pcf8574",0x20),

.platform_data = &pcf857x_data[0],

}

/* more devices can be added using expansion connectors */

};

static void __init ek_board_init(void)
{
//stuff
/* I2C */
at91_add_device_i2c(ek_i2c_devices, 1);

//stuff
}


Собрал ядро, загрузился. В /dev/ нету ожидаемого i2c(
Где может быть ошибка?
Лог загрузки тут.

P.S.
/sys/class/gpio также отсутствует.
Спуститься к концу Подняться к началу
Персональная информация
Kuzemko
Добавлено 25.02.2010 19:35 Сообщение: 7
Kuzemko
0

Пункты: 370
Регистрация: 26.09.2009
Пол: Мужчина
В конфиге включено ?
GPIO_SYSFS
GPIO_PCF857x
Я описал ситуацию для ядра 2.6.33-rc8. Для ядра 2.6.28 надо посмотреть есть ли драйвер pcf857x (не помну начиная с какого убрали из исходников pcf8574.c а добавили универсальный драйвер pcf857x.c для 8-ми и 16-ти битных расширителей портов). Если есть то можно попробовать
{
I2C_BOARD_INFO("pcf857x", 0x20),
.type = "pcf8574",
.platform_data = &pcf857x_data[0],
},
чем черт не шутит, может поможет.
Спуститься к концу Подняться к началу
Персональная информация
Kuzemko
Добавлено 25.02.2010 19:41 Сообщение: 8
Kuzemko
0

Пункты: 370
Регистрация: 26.09.2009
Пол: Мужчина
И не много не по теме. У вас в логох я видел
Advanced Linux Sound Architecture Driver Version 1.0.18rc3.
tlv320aic23b spi1.0: tlv320aic23b: supported bitrate is 47348 (66 divider)
ALSA device list:
#0: AT91SAM9260 external CODEC on irq 14
При возпроизведении звука небольших щелчков не замечали?
Спуститься к концу Подняться к началу
Персональная информация
and73y
Добавлено 26.02.2010 13:10 Сообщение: 9
and73y
5

Пункты: 1154
Регистрация: 25.11.2009
В ядре было отключено:
I2C_GPIO
Включил, появилось устройство /dev/i2c-0.
Драйвер для pcf857x в ядре 2.6.28 есть (/drivers/gpio/pcf857x.c).

Настройки:
GPIO_SYSFS
GPIO_PCF857X
я не нашел ни в menu, ни в .config файле.
Попробую скачать ядро по-новее.

Про щелчки - со звуком не работал, поэтому не знаю=)
Если надо, то могу проверить.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 26.02.2010 15:31 Сообщение: 10
sasamy
4.71

Пункты: 83560
Регистрация: 14.08.2009
Цитата
supported bitrate is 47348 (66 divider)
...
При возпроизведении звука небольших щелчков не замечали?


Естественно вы их будете замечать - частота дискретизации не совпадает да еще такая разница большая. Я для этого специально подбирал частоту plla - чтобы не было ошибки при выбре делителя для ssc.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux