ЗАО «ЗЭО»
Техническая поддержка пользователей => ОС Linux, U-Boot => Тема начата: emc2 от 28 Сентября, 2009, 11:50:29
-
Имеется Тион Про v2 + linux 2.6.20.4
Возможен ли доступ к таймерам из модуля ядра и какие таймеры для этого можно использовать (не использумые ситемой)? Требуется генерация частоты 3400Гц аппаратно. Возможно ли использование аппаратных PWM генераторов и где в ядре они конфигурируются? Заранее спасибо.
-
>Возможен ли доступ к таймерам из модуля ядра и какие таймеры для этого можно использовать (не использумые ситемой)? Требуется >генерация частоты 3400Гц аппаратно. Возможно ли использование аппаратных PWM генераторов и где в ядре они конфигурируются?
Нужна такая частота на выводе? Если речь только об этом и вы хотите использовать ШИМ (PWM), то это делается через регистры процессора (см. EP93xx User's Guide, Ch. 24, Pulse Width Modulator).
Один вывод ШИМ расположен на X20.11 и используется для управления подсветкой дисплеев (EGPIO14), другой на X10.12.
В 2.6.20, насколько я знаю, никакой общей системы для PWM не было.
-
Объявил переменные с адресами регистров. Не подскажите каким макросом можно установить значение регистра из модуля ядра? Пробовал gpio_line_set не получается ???
-
> установить значение регистра из модуля ядра
Обычной записью значения в переменную расположенную по адресу регистра. Можно использовать writel.
См. drivers/video/backlight/ep93xx_bl.c -- использование PWM для подсветки.
PS. gpio_line_set -- функция для управления (задания состояния) GPIO, если вы намерены использовать PWM, то вам она не нужна.
Но можно посмотреть её реализацию.
-
В какой версии ядра появился файл drivers/video/backlight/ep93xx_bl.c? В 2.6.20.4 почему то нет. Я хотел найти общую функцию для записи в любой регистр процессора. Регистры ШИМ объявил так:
#define EP93XX_PWM_BASE (EP93XX_APB_VIRT_BASE + 0x00110000)
#define EP93XX_PWM_REG(x) (EP93XX_PWM_BASE + (x))
#define EP93XX_PWM0_TERM_CNT EP93XX_PWM_REG(0x00)
#define EP93XX_PWM0_DUTY_CYCLE EP93XX_PWM_REG(0x04)
#define EP93XX_PWM0_EN EP93XX_PWM_REG(0x08)
#define EP93XX_PWM0_INVERT EP93XX_PWM_REG(0x0C)
#define EP93XX_PWM1_TERM_CNT EP93XX_PWM_REG(0x20)
#define EP93XX_PWM1_DUTY_CYCLE EP93XX_PWM_REG(0x24)
#define EP93XX_PWM1_EN EP93XX_PWM_REG(0x28)
#define EP93XX_PWM1_INVERT EP93XX_PWM_REG(0x2C)
EP93XX_APB_VIRT_BASE=0xff800000
0xff800000+0x00110000 получается 0чАА910000, а в доках указано 0x80910000 ?
-
> В какой версии ядра появился файл
В патчах позднее svn618,
http://www.zao-zeo.ru/dokuwiki/doku.php/linux#патчи_ядра
> Я хотел найти общую функцию для записи в любой регистр процессора.
writel
> а в доках указано
На то он и VIRT
-
Окончательно запутался ???
Скачал и собрал ядро 2.6.20.21 с последним патчем.
В файле ep93xx_bl.c всего 3 строчки управляют PWM1 по сути:
writel ((BRIGHTNESS_CMP_MASK & (intensity << BRIGHTNESS_CMP_SHIFT))| PWM_CNT, BRIGHTNESS);
writel (RASTER_SWLOCK_VALUE, RASTER_SWLOCK);
writel (readl (SIGCTRL) | VIDSIGCTRL_BRIGHT, SIGCTRL)
По определению переменных получается смещение равно 0x03000 - RASTER_OFFSET
В старом патче было смещение 0x00110000
#define EP93XX_PWM_BASE (EP93XX_APB_VIRT_BASE + 0x00110000)
Так как добраться до регистров PWM правильно через виртуальный адрес?
Еще #define SIGCTRL (RASTER_BASE+0x204)
а в даташит к процессору 0x8091_0028 PWM1En PWM1 Enable Соответсвенно 0x28
-
В ep93xx_bl.c ШИМ для _яркости_ подсветки используется спец. вывод BRIGHT (BGA P4).
Управляется регистром Brightness (0x8003_0020 в документации) и к регистрам PWM отношения не имеет.
> Один вывод ШИМ расположен на X20.11 и используется для управления подсветкой дисплеев (EGPIO14), другой на X10.12.
Еще два ШИМ управляются регистрами PWM:
1. PWMOUT (BGA U16) X10.12 -- не используется
2. PWMOUT1 / EGPIO14 (BGA D15) X10.11, X20.11 -- сейчас используется для управления подсветкой (не яркостью) в режиме EGPIO14 (включ/выключ). Как он переключается между режимами PWM и GPIO не ясно
Код ep93xx_bl.c я предлагал как пример writel.
-
А вот это определение указывает на регистр PWM? В новом патче это определение у Вас отсутствует.
#define EP93XX_PWM_BASE (EP93XX_APB_VIRT_BASE + 0x00110000)
Судя по документации конфигурировать вывод PWMx как выход не нужно. Может быть это не так и ему нужно установить направление вывода?
-
http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=5628/1 (http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=5628/1) у циррусов такой драйвер есть. попытаюсь прикрутить сюда
-
> Судя по документации конфигурировать вывод PWMx как выход не нужно
Речь о PWMOUT1 / EGPIO14 -- это один вывод, по функциональности или PWM, или GPIO, как переключить его функциональность не понятно. Сейчас он используется как GPIO.
> В новом патче это определение у Вас отсутствует.
Оно есть в оригинальном коде, поэтому в патче его нет. После наложения оно будет.
-
Нашел как переключить EGPIO14 - записать бит PonG регистра DeviceCfg
__raw_writel(__raw_readl(EP93XX_SYSCON_DEVICE_CONFIG)|0x00000200,EP93XX_SYSCON_DEVICE_CONFIG);
Однако ШИМ не появился на выводе. В документации указано, что этот регист блокируется программно. Не подскажите в чем может быть проблема?
-
См. регистр SysSWLock
-
Разобрался :)))
__raw_writel( u, EP93XX_PWM0_TERM_CNT );
__raw_writel( 0x401, EP93XX_PWM0_DUTY_CYCLE);
__raw_writel( 0, EP93XX_PWM0_INVERT);
__raw_writel( 0x0001, EP93XX_PWM0_EN );
gpio_line_config(14,0);//порт нужно сконфигурировать как вход
//Включаем альтернативную функцию порта (бит PonG)
SysconSetLocked( EP93XX_SYSCON_DEVICE_CONFIG, __raw_readl(EP93XX_SYSCON_DEVICE_CONFIG)|0x00000200);//#include <asm/hardware.h>
__raw_writel( u, EP93XX_PWM1_TERM_CNT );
__raw_writel( 0x0401, EP93XX_PWM1_DUTY_CYCLE);
__raw_writel( 0, EP93XX_PWM1_INVERT);
__raw_writel( 0x0001, EP93XX_PWM1_EN );
Может кому пригодится. А в названии темы слово "Таймер" нужно поменять на "ШИМ"
-
Backport для драйвера http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=5628/1
в svn792:
http://www.zao-zeo.ru/media/files/linux/2.6.20/patch/linux-2.6.20.21_tion_svn792_200910061928.tar.gz
Управляется через /sys/devices/platform/ep93xx-pwm.0
Если нужен PWM1 (EGPIO14, питание дисплея будет отключено), то придётся
изменить в arch/arm/mach-ep93xx/tion_a8.c
ep93xx_register_pwm(true, false);
на
ep93xx_register_pwm(true, true);