|
Драйвер под линукс, для ics1523 |
|
|
|
 |
Ответов
(1 - 10)
|
Dec 3 2009, 09:03
|

Местный
  
Группа: Свой
Сообщений: 208
Регистрация: 6-10-05
Из: Ukraine, Kiev
Пользователь №: 9 300

|
Цитата(ecos-rtos_in_ua @ Nov 29 2009, 17:38)  Немного мыслей вслух. 1. Вызов функции at91_ics1523_SetTWIClock(60000). Можно не использовать, если частота фиксирована - 100кГц? 2. Вместо функций чтения и записи можно использовать i2c_smbus_read_byte() i2c_smbus_write_byte()? можно, только похоже что наличие аппаратного(прямого) доступа к иис в этом драйвере обусловлено тем что он вызывается ранее системного иис. Посему убедитесь что инит видео будет происходить позже системного иис. ics1523 - будет уверенно работать на 100кГц.
|
|
|
|
|
Dec 12 2009, 17:20
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 15-03-08
Из: Украина, Винница
Пользователь №: 35 931

|
Написал на основе 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); Что я делаю не так?
|
|
|
|
|
Dec 13 2009, 00:15
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(ecos-rtos_in_ua @ Dec 12 2009, 20:20)  Вылетает на строке 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 - Dec 13 2009, 00:27
|
|
|
|
|
Dec 13 2009, 06:53
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 15-03-08
Из: Украина, Винница
Пользователь №: 35 931

|
Цитата(sasamy @ Dec 13 2009, 04:15)  Судя по заглавным буквам 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 у вас? Цитата Посему убедитесь что инит видео будет происходить позже системного иис. Как?
|
|
|
|
|
Dec 13 2009, 16:29
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(ecos-rtos_in_ua @ Dec 13 2009, 10:53)  За пинок в правильном направлении спасибо Пожалуйста  Цитата Как? Например я вижу это так - инициализировать синтезатор не в момент выполнения 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/
|
|
|
|
|
Dec 13 2009, 17:09
|
Местный
  
Группа: Свой
Сообщений: 209
Регистрация: 15-03-08
Из: Украина, Винница
Пользователь №: 35 931

|
Цитата(sasamy @ Dec 13 2009, 20:29)  Например я вижу это так - инициализировать синтезатор не в момент выполнения board-файла а позднее при загрузке модуля s1d13xxxfb.c, и тут два варианта: В1 делать динамические модули и явно указывать порядок загрузки В2 для статически слинкованых модулей - изменить порядок линковки в соответствующем Makefile в дереве исходников ядра. Заработал вариант 2, первый не пробовал. Большое спасибо, теперь я снова с графикой. Есть у меня TFT дисплей 3.8"(320x480). Для дисплея я разработал плату, цепляеться к Siberia через разъем для TFT. На данный момент подсветка работает, управляеться яркость (из консоли). На данном этапе я получил белый экран и все. Осталось разобраться с иницализацией в linux. Можете расказать как его прикрутить. Хотя бы в общих чертах.
|
|
|
|
|
Dec 13 2009, 19:21
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(ecos-rtos_in_ua @ Dec 13 2009, 21:09)  Есть у меня 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 ну и в соответствии с даташитом на вашу стекляшку задать значения остальных регистров для подбора режима.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|