Перейти к содержанию
    

Драйвер под линукс

Случилась у меня неприятность, отломалась ножка SDA на процесоре AT91SAM9260. Пришлось использовать драйвер i2c_gpio и свободный вывод.

 

Теперь такая ситуация: все микросхемы на шине i2c работают (RTC, цифровой потенциометр, расширитель портов), не работает только ics1523, которая у меня отвечает за раздачу частот разверток на видеоконтроллер epson. Посмотрел я код драйвера ics1523, но он жестко завязан на аппаратный twi at91.

 

Вопрос, реально ли переписать на использование драйвера i2c_gpio?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного мыслей вслух.

1. Вызов функции at91_ics1523_SetTWIClock(60000). Можно не использовать, если частота фиксирована - 100кГц?

2. Вместо функций чтения и записи можно использовать i2c_smbus_read_byte() i2c_smbus_write_byte()?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного мыслей вслух.

1. Вызов функции at91_ics1523_SetTWIClock(60000). Можно не использовать, если частота фиксирована - 100кГц?

2. Вместо функций чтения и записи можно использовать i2c_smbus_read_byte() i2c_smbus_write_byte()?

 

можно, только

похоже что наличие аппаратного(прямого) доступа к иис в этом драйвере

обусловлено тем что он вызывается ранее системного иис. Посему убедитесь

что инит видео будет происходить позже системного иис.

ics1523 - будет уверенно работать на 100кГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал на основе pcf8574 драйвер для ics1523, как для i2c chip.

Получаю ошибку, не могу понять почему

i2c-gpio i2c-gpio: using pins 55 (SDA) and 38 (SCL)                                                                               
ICS1523 Probe Run                                                                                                                 
ICS1523 Init Run                                                                                                                  
ICS1523 Inititialisatio START                                                                                                     
Unable to handle kernel NULL pointer dereference at virtual address 00000028                                                      
pgd = c0004000                                                                                                                    
[00000028] *pgd=00000000                                                                                                          
Internal error: Oops: 5 [#1]                                                                                                      
Modules linked in:                                                                                                                
CPU: 0    Not tainted  (2.6.27 #705)                                                                                              
PC is at i2c_smbus_write_byte_data+0x10/0x4c                                                                                      
LR is at ics1523_probe+0x64/0x1c4                                                                                                 
pc : [<c0163f98>]    lr : [<c01677f4>]    psr: 60000013                                                                           
sp : c3819dc8  ip : c3819e10  fp : c3819e0c                                                                                       
r10: 00000000  r9 : 00000000  r8 : 00000000                                                                                       
r7 : c0291888  r6 : c0167790  r5 : c394f2c0  r4 : c395d200                                                                        
r3 : c0284480  r2 : 00000000  r1 : 00000000  r0 : 00000026                                                                        
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel                                                               
Control: 0005317f  Table: 20004000  DAC: 00000017                                                                                 
Process swapper (pid: 1, stack limit = 0xc3818268)                                                                                
Stack: (0xc3819dc8 to 0xc381a000)                                                                                                 
9dc0:                   c0291888 00000000 00000000 00000000 c3819dfc c3819de8                                                     
9de0: c01fa3a8 c0033f28 c395d200 c3819e04 c3819e34 c3819e10 c01677e4 c01fa394                                                     
9e00: c3819e34 c3819e10 c01677f4 c0163f98 00000008 c395d220 c395d200 c0167790                                                     
9e20: c0291888 00000000 c3819e54 c3819e38 c0163574 c01677a0 00000001 c395d220                                                     
9e40: c02918b4 c02918b4 c3819e74 c3819e58 c0121cf4 c0163500 c395d220 c395d2cc                                                     
9e60: c02918b4 00000000 c3819e94 c3819e78 c0121df0 c0121c30 c3834298 c02918b4                                                     
9e80: c0121da4 00000000 c3819ec4 c3819e98 c012157c c0121db4 c3920ae0 c3834298                                                     
9ea0: c3834298 c395d268 c00f5a0c c02918b4 c3920ae0 c0291154 c3819ed4 c3819ec8                                                     
9ec0: c0121b38 c012153c c3819f04 c3819ed8 c0120e58 c0121b28 c02614c6 c0015a60                                                     
9ee0: c0291888 c02918b4 c0015a60 c0291888 00000000 00000000 c3819f2c c3819f08                                                     
9f00: c0121fe4 c0120dc0 00000000 c0291154 c0015a60 c0291888 00000000 00000000                                                     
9f20: c3819f4c c3819f30 c0164940 c0121f5c c3818000 c001a140 c0015a60 00000000                                                     
9f40: c3819f5c c3819f50 c0015a78 c01648d0 c3819fd4 c3819f60 c001e284 c0015a70                                                     
9f60: c3819f8c c3819f70 c00abcb0 c00aba28 c3819f00 c3832260 c00abdb4 0000007f                                                     
9f80: c3819fbc c3819f90 c00553b8 c00abc40 c3819fac 00373231 00000000 c0010000                                                     
9fa0: 000000c0 c0019f30 00000000 00000000 c3819fd4 c001a140 c0019f30 00000000                                                     
9fc0: 00000000 00000000 c3819ff4 c3819fd8 c0008410 c001e240 00000000 00000001                                                     
9fe0: 00000000 00000000 00000000 c3819ff8 c0035c34 c00083a4 ffffffff bfbfffbf                                                     
Backtrace:                                                                                                                        
[<c0163f88>] (i2c_smbus_write_byte_data+0x0/0x4c) from [<c01677f4>] (ics1523_probe+0x64/0x1c4)                                    
[<c0167790>] (ics1523_probe+0x0/0x1c4) from [<c0163574>] (i2c_device_probe+0x84/0xa0)                                             
r8:00000000 r7:c0291888 r6:c0167790 r5:c395d200 r4:c395d220                                                                      
r3:00000008                                                                                                                       
[<c01634f0>] (i2c_device_probe+0x0/0xa0) from [<c0121cf4>] (driver_probe_device+0xd4/0x184)                                       
r7:c02918b4 r6:c02918b4 r5:c395d220 r4:00000001                                                                                  
[<c0121c20>] (driver_probe_device+0x0/0x184) from [<c0121df0>] (__driver_attach+0x4c/0x70)                                        
r7:00000000 r6:c02918b4 r5:c395d2cc r4:c395d220                                                                                  
[<c0121da4>] (__driver_attach+0x0/0x70) from [<c012157c>] (bus_for_each_dev+0x50/0x80)                                            
r6:00000000 r5:c0121da4 r4:c02918b4 r3:c3834298                                                                                  
[<c012152c>] (bus_for_each_dev+0x0/0x80) from [<c0121b38>] (driver_attach+0x20/0x28)                                              
r6:c0291154 r5:c3920ae0 r4:c02918b4                                                                                              
[<c0121b18>] (driver_attach+0x0/0x28) from [<c0120e58>] (bus_add_driver+0xa8/0x210)                                               
[<c0120db0>] (bus_add_driver+0x0/0x210) from [<c0121fe4>] (driver_register+0x98/0x124)                                            
r8:00000000 r7:00000000 r6:c0291888 r5:c0015a60 r4:c02918b4                                                                      
[<c0121f4c>] (driver_register+0x0/0x124) from [<c0164940>] (i2c_register_driver+0x80/0xdc)                                        
r8:00000000 r7:00000000 r6:c0291888 r5:c0015a60 r4:c0291154                                                                      
r3:00000000                                                                                                                       
[<c01648c0>] (i2c_register_driver+0x0/0xdc) from [<c0015a78>] (ics1523_init+0x18/0x20)                                            
r6:00000000 r5:c0015a60 r4:c001a140 r3:c3818000                                                                                  
[<c0015a60>] (ics1523_init+0x0/0x20) from [<c001e284>] (do_one_initcall+0x54/0x184)                                               
[<c001e230>] (do_one_initcall+0x0/0x184) from [<c0008410>] (kernel_init+0x7c/0xf0)                                                
r8:00000000 r7:00000000 r6:00000000 r5:c0019f30 r4:c001a140                                                                      
[<c0008394>] (kernel_init+0x0/0xf0) from [<c0035c34>] (do_exit+0x0/0x6e0)                                                         
r5:00000000 r4:00000000                                                                                                          
Code: e1a0c00d e92dd800 e24cb004 e24dd038 (e1d0e0b2)                                                                              
---[ end trace 3c912652fab3ebf6 ]---                                                                                              
Kernel panic - not syncing: Attempted to kill init!

 

Вылетает на строке

i2c_smbus_write_byte_data (ICS_ADDR, ICS_ICR, 0);

 

Что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вылетает на строке

i2c_smbus_write_byte_data (ICS_ADDR, ICS_ICR, 0);

 

Что я делаю не так?

 

Судя по заглавным буквам ICS_ADDR - это какая-то константа а должен передаваться указатель на структуру i2c_client

s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)

а вообще - как искать ошибку в коде которого в глаза никто не видел - непонятно... хотя по такой ошибке можно сказать что все довольно печально там :)

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по заглавным буквам ICS_ADDR - это какая-то константа а должен передаваться указатель на структуру i2c_client

s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)

а вообще - как искать ошибку в коде которого в глаза никто не видел - непонятно... хотя по такой ошибке можно сказать что все довольно печально там :)

За пинок в правильном направлении спасибо, помогло, поставил вместо ICS_ADDR client, все стало намного веселей.

P.S. У меня ICS_ADDR 0x26 // ICS1523 address

 

Теперь лог выглядит так

...

ICS1523 Probe Run

ICS1523 Init Run

ICS1523 Inititialisatio START

ICS1523 Initialisation STOP

=======> nb_trial:1,ack:0,status:0xfe

...

 

Вопрос к тем у кого такая-же плата (Siberia). Какие частоты должны выдаваться микросхемой? Какое значение переменной status у вас?

 

Посему убедитесь

что инит видео будет происходить позже системного иис.

Как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За пинок в правильном направлении спасибо

Пожалуйста :)

Как?

Например я вижу это так - инициализировать синтезатор не в момент выполнения board-файла а позднее при загрузке модуля s1d13xxxfb.c, и тут два варианта:

В1 делать динамические модули и явно указывать порядок загрузки

В2 для статически слинкованых модулей - изменить порядок линковки в соответствующем Makefile в дереве исходников ядра.

При этом я бы попробовал так:

1 переместить код инициализации в board-файле в радел драйвера платформы. Например см. board-yl-9200.c

#if defined(CONFIG_FB_S1D135XX) || defined(CONFIG_FB_S1D13XXX_MODULE)
#include <video/s1d13xxxfb.h>

static void __init yl9200_init_video(void)
{
   /* здесь инициализируем что нам нужно в том числе синтезатор частоты */ 
}
......

static struct s1d13xxxfb_pdata yl9200_s1dfb_pdata = {
    .initregs        = yl9200_s1dfb_initregs,
    .initregssize        = ARRAY_SIZE(yl9200_s1dfb_initregs),
    .platform_init_video    = yl9200_init_video,
};
......
#endif

 

platform_init_video - вызывается в драйвере s1d13xxxfb.c в ф-ции probe, соответственно нужно что бы к этому моменту подсистема i2c должна быть проинициализирована, чего мы и добивались в В1 и В2.

Для В2 правим файл drivers/Makefile чтобы строка

obj-y += i2c/ media/

оказалась перед

obj-y += video/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например я вижу это так - инициализировать синтезатор не в момент выполнения board-файла а позднее при загрузке модуля s1d13xxxfb.c, и тут два варианта:

В1 делать динамические модули и явно указывать порядок загрузки

В2 для статически слинкованых модулей - изменить порядок линковки в соответствующем Makefile в дереве исходников ядра.

 

Заработал вариант 2, первый не пробовал. Большое спасибо, теперь я снова с графикой. :biggrin:

 

Есть у меня TFT дисплей 3.8"(320x480). Для дисплея я разработал плату, цепляеться к Siberia через разъем для TFT. На данный момент подсветка работает, управляеться яркость (из консоли). На данном этапе я получил белый экран и все.

Осталось разобраться с иницализацией в linux.

Можете расказать как его прикрутить. Хотя бы в общих чертах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть у меня TFT дисплей 3.8"(320x480). Для дисплея я разработал плату, цепляеться к Siberia через разъем для TFT.

Можете расказать как его прикрутить. Хотя бы в общих чертах.

 

Начну с того что не видел никогда ни сиберии ни контроллера ни вашего tft но глянув раз на исходник драйвера s1d13xxxfb.c можно заметить что в s1d13xxxfb_probe устанавливаются при желании значения регистров

           /* perform "manual" chip initialization, if needed */                                                                  
           if (pdata && pdata->initregs)                                                                                          
                      s1d13xxxfb_runinit(info->par, pdata->initregs, pdata->initregssize);

 

если pdata->initregs имеет ненулевое значение ну и дело техники заглянуть снова в board-yl-9200.c

static struct s1d13xxxfb_regval yl9200_s1dfb_initregs[] =
{
    {S1DREG_MISC,            0x00},    /* Miscellaneous Register*/
    {S1DREG_COM_DISP_MODE,        0x01},    /* Display Mode Register, LCD only*/
.....

здесь описаны все регисты и присвоены начальные значения. Как минимум нужно LCD включить я так думаю в S1DREG_COM_DISP_MODE ну и в соответствии с даташитом на вашу стекляшку задать значения остальных регистров для подбора режима.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати - вполне возможно и влоб все заработает с теми параметрами что в YL-9200, погуглил - не нашел что это за плата и какое стекло они туда ставят. Ну и еще интересно что драйвер поддерживает

* TODO: - handle dual screen display (CRT and LCD at the same time).

одновременную работу и crt и lcd.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати - вполне возможно и влоб все заработает с теми параметрами что в YL-9200, погуглил - не нашел что это за плата и какое стекло они туда ставят. Ну и еще интересно что драйвер поддерживает

* TODO: - handle dual screen display (CRT and LCD at the same time).

одновременную работу и crt и lcd.

Плата http://electronix.ru/forum/index.php?showforum=196

Плата для TFT http://electronix.ru/forum/index.php?showtopic=67365

TFT http://www.lcd88.com/Panel/Download.asp?Model=TD038STEC1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...