Ник:
Пароль:

Контакты

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

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
Использование выводов PCF8574 в теле другого драйвера (подсветки)
Kuzemko
Добавлено 27.02.2010 20:08
0
Сообщение: 1
Kuzemko
0

Пункты: 370
Регистрация: 26.09.2009
Пол: Мужчина
Ядро 2.6.33. Плата на основе 9260.
Пишу драйвер подсветки для LCD экрана 3.8". Пин, который управляет включением/выключением подсветки у меня подключен в выходу расширителя портов PCF8574 (так, как "нормальные" входа/выхода закончились). Физически управление подсветкой реализовано при помощи 3-х микросхем:
i2c цифрового потенциометра, 555 таймера, включенного в режиме PWM и расширителя портов.

Возникают вопросы:
1. Доступна ли файловая система /sys/ во время загрузки ядра, чтобы можно было через запись 0 или 1 в файл устройства PCF8574 менять лог. состояние на выходе?

Если нет, то вопрос №2:
Как в драйвере подсветки определить, что устройство PCF8574 зарегистировано ядром и с ним можно работать?

Набросал тут кусок драйвера
Код

static int ad5263_and_555_backlight_set(struct backlight_device *bl, int brightness)
{
struct ad5263_and_555_backlight_data *data = bl_get_data(bl);
struct ad5263_and_555_chip *chip = data->chip;
unsigned char value;
int ret;

if (brightness > MAX_BRIGHTNESS)
value = MAX_BRIGHTNESS;
else
value = brightness;

ret = ad5263_and_555_reg_write(chip->i2c, MAX8925_WLED_CNTL, value);
if (ret < 0)
goto out;

if (!data->current_brightness && brightness)
/* enable LED_ON output */


// ЧТО ПИСАТЬ ЗДЕСЬ? Здесь нужно 1 пин PCF8574а перевести в состояние "1"


dev_dbg(chip->dev, "Must be enabled baclight LED \n");
else if (!brightness)
/* disable LED_ON output */


// И ЗДЕСЬ? А здесь нужно 1 пин PCF8574а перевести в состояние "0"


dev_dbg(chip->dev, "Must be disabled baclight LED \n");
if (ret < 0)
goto out;
dev_dbg(chip->dev, "set brightness %d\n", value);
data->current_brightness = value;
return 0;
out:
dev_dbg(chip->dev, "set brightness %d failure with return value:%d\n",
value, ret);
return ret;
}


Никто с таким извратом не сталкивался? Подскажите где можно почитать, примерчики посмотреть.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 27.02.2010 22:33 Сообщение: 2
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
1 файловая система sys вам точно не нужна :) это же для случая обмена kernelspace/userspace да и тем более она монтируется к к rootfs которая монтируется на самом заключительном этапе загрузки ядра.

2 либо загружать динамические модули в той последовательности в какой это нужно, либо в случае статической сборки в Makefile пометисть строчки друг за другом. Например как обсуждалось тут
http://electronix.ru/forum/index.php?showtopic=70126&st=0&p=693381&#entry693381
Спуститься к концу Подняться к началу
Персональная информация
and73y
Добавлено 02.03.2010 14:24 Сообщение: 3
and73y
5

Пункты: 1154
Регистрация: 25.11.2009
>>нужно 1 пин PCF8574а перевести в состояние "1"
я работаю с pfc8574 следующим образом:
открываю девайс
/dev/i2c-0
с помощью ioctl указываю нужный адрес
и выставляю (write) нужное состояние на на портах pfc8574
Спуститься к концу Подняться к началу
Персональная информация
Kuzemko
Добавлено 02.03.2010 20:28 Сообщение: 4
Kuzemko
0

Пункты: 370
Регистрация: 26.09.2009
Пол: Мужчина
А можно кусок кода?
Спуститься к концу Подняться к началу
Персональная информация
and73y
Добавлено 03.03.2010 10:56 Сообщение: 5
and73y
5

Пункты: 1154
Регистрация: 25.11.2009
Код
#include "main.h"

using namespace std;

int open_wrap(int* file)
{
int adapter_nr = 0; /* probably dynamically determined */
char filename[20];

snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);

*file = open(filename, O_RDWR);
if (*file < 0) {
cerr << "Open err: "<< filename << endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

int close_wrap(int file)
{
if (close(file) != 0){
cerr<<"Close err"<<endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

int read_data(int file, unsigned char* buf)
{
if (!read(file, buf, 1)){
cerr<<"Read err"<<endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

int write_data(int file, unsigned char* buf)
{
if (!write(file, buf, 1)){
cerr<<"Write err"<<endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

int main(int argc, char** argv) {
cout.flags(ios::hex | ios::showbase | ios::left);

int addr;/* The I2C address */
int cycle_border;
int file;
int sleep_time;

cout<< "I2C address:";
cin >> addr;

cout<<"Cycle border:";
cin >> cycle_border;

cout<<"Sleep:";
cin>>sleep_time;


cout<<endl;
if (open_wrap(&file) != EXIT_SUCCESS) exit(EXIT_FAILURE);

if (ioctl(file, I2C_SLAVE, addr) < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
cerr << "IOControl err:" << addr << endl;
goto close_exit;
}

unsigned char buf;
for(int i = 0; i < cycle_border; i++){
buf = 0;

if (read_data(file, &buf) !=0)
break;
cout<<addr<<"\t>\t"<<(int)buf<<endl;

buf = buf ^ 1;
if (write_data(file, &buf) !=0)
break;
cout<<addr<<"\t<\t"<<(int)buf<<endl;
usleep(sleep_time);
}

close_exit:
if (close_wrap(file) != EXIT_SUCCESS) exit(EXIT_FAILURE);

exit(EXIT_SUCCESS);
}
Спуститься к концу Подняться к началу
Персональная информация
Kuzemko
Добавлено 03.03.2010 19:33 Сообщение: 6
Kuzemko
0

Пункты: 370
Регистрация: 26.09.2009
Пол: Мужчина
Спасибо, буду разбираться.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux