Jump to content

    

Портирование ядра. Написал драйвер UART как корректно его подключить.

а зачем тебе свой конфиг, выбери в дефолтном нужный soc, отключи суспенд а остальное ненужное отключай по мере поступления ошибок, я так и сделал когда дошёл у себя до ошибок с отсутствием макросов

 

 

 

Share this post


Link to post
Share on other sites

Удалось собрать ядро. В данный момент запускается до Uncompres Linux kernel ....

Целиком исходники выложить?

Как думаете может стоит создать публичный GIT ? Мало ли кому ещё пригодится.

Share this post


Link to post
Share on other sites

Удалось запустить ядро.

Прежде всего хочу поблагодарить всех кто помогал советом.

Я создал проек на гулокоде и написал там пару статей по неочевидным, на мой взгляд, момментам. Вот ссылка

https://code.google.com/p/linux-on-spmp8000/w/list

 

Сейчас мучаюсь с запуском экрана. Дисплей совместимый с PSP (пробовали перекидывать). По этому логично предположить что драйвер нужно использовать "Epson S1D13XXX FB Driver". Если верить DTS файлу, а так же данныйм в дизасемблированной родной прошивке, то адресом framebuffer должен быть 0x93000000

я пытался запустить дисплей инициализируя драйвер на этот адрес, но всегда получал сообщение

probe called: device is c01d51a8
Epson S1D13XXX FB Driver
s1d13xxxfb: unknown chip production id 0, revision 0
s1d13xxxfb: please contant maintainer

 

Добавил дополнительные отладочные строки в цикле сравнения увидел вот это

probe called: device is c01d51a8
Epson S1D13XXX FB Driver
s1d13xxxfb: prod_id = 0, s1d13xxxfb_prod_ids = 3
s1d13xxxfb: prod_id = 0, s1d13xxxfb_prod_ids = 4
s1d13xxxfb: prod_id = 0, s1d13xxxfb_prod_ids = 7
s1d13xxxfb: unknown chip production id 0, revision 0
s1d13xxxfb: please contant maintainer

 

Прот этом значение переменной prod_id берется как:

<------>/* production id is top 6 bits */
prod_id = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) >> 2;
<------>/* revision id is lower 2 bits */
revision = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) & 0x3;

 

где S1DREG_REV_CODE имеет смещение ноль, относительно адреса начала фрейм буферра.

 

Я пробовал задать руками значения prod_id равные 3,4,7 в этом случае ядро пытается делить на ноль и уходит в панику.

Подскажите пожалуйста в какую сторону копать дальше.

Share this post


Link to post
Share on other sites

Я могу ошибаться, но как мне кажется, драйвер ничего не знает о том, как и куда у вас подключен контроллер экрана. Вы когда посылаете команды контроллеру, у вас какая-то активность на шине есть?

Share this post


Link to post
Share on other sites

Спасибо за наводку. Активность на шине посмотрю.

Расскажите пожалуйста, в общих чертах, как сделать, что бы драйвер знал о том как и куда подключен дисплей.

В данный моммент я провожу инит дисплея так

#define EPSONREGSTART   0x93000000
#define EPSONREGLEN     0x00100000
#define EPSONFBSTART    0x93200000
/* 512kB framebuffer */
#define EPSONFBLEN      512*1024


static struct s1d13xxxfb_regval s1d13xxxfb_initregs[] = {
       /* line 344 of HP's doc */
       {0x0000,0x04},  //  Prod + Rev Code Register
       {0x0001,0x00},  // Miscellaneous Register
       {0x01FC,0x00},  // Display Mode Register
       {0x0004,0x00},  // General IO Pins Configuration Register 0
       {0x0005,0x00},  // General IO Pins Configuration Register 1
       {0x0008,0x00},  // General IO Pins Control Register 0
       {0x0009,0x00},  // General IO Pins Control Register 1
       {0x0010,0x01},  // Memory Clock Configuration Register
       {0x0014,0x11},  // LCD Pixel Clock Configuration Register
       {0x0018,0x01},  // CRT/TV Pixel Clock Configuration Register
       {0x001C,0x01},  // MediaPlug Clock Configuration Register
       {0x001E,0x01},  // CPU To Memory Wait State Select Register
       {0x0020,0x00},  // Memory Configuration Register
       {0x0021,0x45},  // DRAM Refresh Rate Register
       {0x002A,0x01},  // DRAM Timings Control Register 0
       {0x002B,0x03},  // DRAM Timings Control Register 1
       {0x0030,0x1c},  // Panel Type Register
       {0x0031,0x00},  // MOD Rate Register
       {0x0032,0x4F},  // LCD Horizontal Display Width Register
       {0x0034,0x07},  // LCD Horizontal Non-Display Period Register
       {0x0035,0x01},  // TFT FPLINE Start Position Register
       {0x0036,0x0B},  // TFT FPLINE Pulse Width Register
       {0x0038,0xEF},  // LCD Vertical Display Height Register 0
       {0x0039,0x00},  // LCD Vertical Display Height Register 1
       {0x003A,0x13},  // LCD Vertical Non-Display Period Register
       {0x003B,0x0B},  // TFT FPFRAME Start Position Register
       {0x003C,0x01},  // TFT FPFRAME Pulse Width Register
       {0x0040,0x05},  // LCD Display Mode Register (2:4bpp,3:8bpp,5:16bpp)
       {0x0041,0x00},  // LCD Miscellaneous Register
       {0x0042,0x00},  // LCD Display Start Address Register 0
       {0x0043,0x00},  // LCD Display Start Address Register 1
       {0x0044,0x00},  // LCD Display Start Address Register 2
       {0x0046,0x80},  // LCD Memory Address Offset Register 0
       {0x0047,0x02},  // LCD Memory Address Offset Register 1
       {0x0048,0x00},  // LCD Pixel Panning Register
       {0x004A,0x00},  // LCD Display FIFO High Threshold Control Register
       {0x004B,0x00},  // LCD Display FIFO Low Threshold Control Register
       {0x0050,0x4F},  // CRT/TV Horizontal Display Width Register
       {0x0052,0x13},  // CRT/TV Horizontal Non-Display Period Register
       {0x0053,0x01},  // CRT/TV HRTC Start Position Register
       {0x0054,0x0B},  // CRT/TV HRTC Pulse Width Register
       {0x0056,0xDF},  // CRT/TV Vertical Display Height Register 0
       {0x0057,0x01},  // CRT/TV Vertical Display Height Register 1
       {0x0058,0x2B},  // CRT/TV Vertical Non-Display Period Register
       {0x0059,0x09},  // CRT/TV VRTC Start Position Register
       {0x005A,0x01},  // CRT/TV VRTC Pulse Width Register
       {0x005B,0x10},  // TV Output Control Register
       {0x0060,0x03},  // CRT/TV Display Mode Register (2:4bpp,3:8bpp,5:16bpp)
       {0x0062,0x00},  // CRT/TV Display Start Address Register 0
       {0x0063,0x00},  // CRT/TV Display Start Address Register 1
       {0x0064,0x00},  // CRT/TV Display Start Address Register 2
       {0x0066,0x40},  // CRT/TV Memory Address Offset Register 0
       {0x0067,0x01},  // CRT/TV Memory Address Offset Register 1
       {0x0068,0x00},  // CRT/TV Pixel Panning Register
       {0x006A,0x00},  // CRT/TV Display FIFO High Threshold Control Register
       {0x006B,0x00},  // CRT/TV Display FIFO Low Threshold Control Register
       {0x0070,0x00},  // LCD Ink/Cursor Control Register
       {0x0071,0x01},  // LCD Ink/Cursor Start Address Register
       {0x0072,0x00},  // LCD Cursor X Position Register 0
       {0x0073,0x00},  // LCD Cursor X Position Register 1
       {0x0074,0x00},  // LCD Cursor Y Position Register 0
       {0x0075,0x00},  // LCD Cursor Y Position Register 1
       {0x0076,0x00},  // LCD Ink/Cursor Blue Color 0 Register
       {0x0077,0x00},  // LCD Ink/Cursor Green Color 0 Register
       {0x0078,0x00},  // LCD Ink/Cursor Red Color 0 Register
       {0x007A,0x1F},  // LCD Ink/Cursor Blue Color 1 Register
       {0x007B,0x3F},  // LCD Ink/Cursor Green Color 1 Register
       {0x007C,0x1F},  // LCD Ink/Cursor Red Color 1 Register
       {0x007E,0x00},  // LCD Ink/Cursor FIFO Threshold Register
       {0x0080,0x00},  // CRT/TV Ink/Cursor Control Register
       {0x0081,0x01},  // CRT/TV Ink/Cursor Start Address Register
       {0x0082,0x00},  // CRT/TV Cursor X Position Register 0
       {0x0083,0x00},  // CRT/TV Cursor X Position Register 1
       {0x0084,0x00},  // CRT/TV Cursor Y Position Register 0
       {0x0085,0x00},  // CRT/TV Cursor Y Position Register 1
       {0x0086,0x00},  // CRT/TV Ink/Cursor Blue Color 0 Register
       {0x0087,0x00},  // CRT/TV Ink/Cursor Green Color 0 Register
       {0x0088,0x00},  // CRT/TV Ink/Cursor Red Color 0 Register
       {0x008A,0x1F},  // CRT/TV Ink/Cursor Blue Color 1 Register
       {0x008B,0x3F},  // CRT/TV Ink/Cursor Green Color 1 Register
       {0x008C,0x1F},  // CRT/TV Ink/Cursor Red Color 1 Register
       {0x008E,0x00},  // CRT/TV Ink/Cursor FIFO Threshold Register
       {0x0100,0x00},  // BitBlt Control Register 0
       {0x0101,0x00},  // BitBlt Control Register 1
       {0x0102,0x00},  // BitBlt ROP Code/Color Expansion Register
       {0x0103,0x00},  // BitBlt Operation Register
       {0x0104,0x00},  // BitBlt Source Start Address Register 0
       {0x0105,0x00},  // BitBlt Source Start Address Register 1
       {0x0106,0x00},  // BitBlt Source Start Address Register 2
       {0x0108,0x00},  // BitBlt Destination Start Address Register 0
       {0x0109,0x00},  // BitBlt Destination Start Address Register 1
       {0x010A,0x00},  // BitBlt Destination Start Address Register 2
       {0x010C,0x00},  // BitBlt Memory Address Offset Register 0
       {0x010D,0x00},  // BitBlt Memory Address Offset Register 1
       {0x0110,0x00},  // BitBlt Width Register 0
       {0x0111,0x00},  // BitBlt Width Register 1
       {0x0112,0x00},  // BitBlt Height Register 0
       {0x0113,0x00},  // BitBlt Height Register 1
       {0x0114,0x00},  // BitBlt Background Color Register 0
       {0x0115,0x00},  // BitBlt Background Color Register 1
       {0x0118,0x00},  // BitBlt Foreground Color Register 0
       {0x0119,0x00},  // BitBlt Foreground Color Register 1
       {0x01E0,0x00},  // Look-Up Table Mode Register
       {0x01E2,0x00},  // Look-Up Table Address Register
       /* not sure, wouldn't like to mess with the driver */
       {0x01E4,0x00},  // Look-Up Table Data Register
       /* jornada doc says 0x00, but I trust the driver */
       {0x01F0,0x10},  // Power Save Configuration Register
       {0x01F1,0x00},  // Power Save Status Register
       {0x01F4,0x00},  // CPU-to-Memory Access Watchdog Timer Register
       {0x01FC,0x01},  // Display Mode Register(0x01:LCD, 0x02:CRT, 0x03:LCD&CRT)
};


static struct s1d13xxxfb_pdata s1d13xxxfb_data = {
       .initregs               = s1d13xxxfb_initregs,
       .initregssize           = ARRAY_SIZE(s1d13xxxfb_initregs),
       .platform_init_video    = NULL
};

static struct resource s1d13xxxfb_resources[] = {
       [0] = {
               .start  = EPSONFBSTART,
               .end    = EPSONFBSTART + EPSONFBLEN,
               .flags  = IORESOURCE_MEM,
       },
       [1] = {
               .start  = EPSONREGSTART,
               .end    = EPSONREGSTART + EPSONREGLEN,
               .flags  = IORESOURCE_MEM,
       }
};

static struct platform_device s1d13xxxfb_device = {
       .name           = S1D_DEVICENAME,
       .id             = 0,
       .dev            = {
               .platform_data  = &s1d13xxxfb_data,
       },
       .num_resources  = ARRAY_SIZE(s1d13xxxfb_resources),
       .resource       = s1d13xxxfb_resources,
};

static struct platform_device *devices[] __initdata = {
       &s1d13xxxfb_device,
};


static int __init spmp_displ_init(void)
{


       int ret = -ENODEV;
       ret = platform_add_devices(devices, ARRAY_SIZE(devices));
       return ret;
}

arch_initcall(spmp_displ_init);




Share this post


Link to post
Share on other sites

Я бегло глянул драйвер s1d13xxxfb.c, там походу пространство ввода-вывода экрана транслируется в основную область памяти. Нужно посмотреть в документации на процессор, куда он транслирует различную периферию, может вы просто с адресом ошиблись.

 

что бы драйвер знал о том как и куда подключен дисплей.

В вашем случае все должно происходить прозрачно, т.к. все должно работать через память. Но, например, в драйвере есть такой код

 835         if (pdata && pdata->platform_init_video)
836                 pdata->platform_init_video();

где вызывается platform_init_video(), которое может делать что-то очень важно. Например, первое что приходит в голову, это правильно сконфигурировать пины процессора для работы с внешнем контроллером экрана.

 

 

У вас platform_add_devices(devices, ARRAY_SIZE(devices)) выполняется без ошибок?

Может ваша область памяти уже кем-то занята?

Share this post


Link to post
Share on other sites
Нужно посмотреть в документации на процессор, куда он транслирует различную периферию, может вы просто с адресом ошиблись.

soc закрытый, документации нет, у него только некие исходинки под ecos

Share this post


Link to post
Share on other sites

Как уже сказали документации нет.

Исходников под eCos мало и большинство фейк.

Данные для сборки ядра брал дизасемблируя прошивку, а так же опирался на патч который обсуждался выше.

Память сейчас не занята, когда эта память была занята было сообщение :

Epson S1D13XXX FB Driver
Trying to free nonexistent resource <0000000093000000-0000000093100000>

что бы убрать это сообщение я вырезал из патча который брал за основу Следующие вещи:

/arch/arm/boot/dts/spmp8000.dtsi

<------>axi {
<------><------>compatible = "simple-bus";
<------><------>#address-cells = <1>;
<------><------>#size-cells = <1>;
<------><------>ranges = <0x93000000 0x93000000 0x800000>;

<------><------>fb@93000000 {
<------><------><------>compatible = "sunplus,spmp8000-lcd";
<------><------><------>reg = <0x93000000 0x1000>;
<------><------><------>interrupt-parent = <&vic0>;
<------><------><------>interrupts = <23>;
<------><------>};

<------><------>axi-apb {
<------><------><------>compatible = "simple-bus";
<------><------><------>#address-cells = <1>;
<------><------><------>#size-cells = <1>;
<------><------><------>ranges = <0x93010000 0x93010000 0x10000>;

<------><------><------>dma@93010000 {
<------><------><------><------>compatible = "sunplus,spmp8000-apbdma-a";
<------><------><------><------>reg = <0x93010000 0x1000>;
<------><------><------><------>interrupt-parent = <&vic0>;
<------><------><------><------>interrupts = <24 25 26 27>;
<------><------><------>};

<------><------><------>i2s@93012000 {
<------><------><------><------>compatible = "sunplus,spmp8000-i2s-tx";
<------><------><------><------>reg = <0x93012000 0x1000>;
<------><------><------><------>interrupt-parent = <&vic0>;
<------><------><------><------>interrupts = <13>;
<------><------><------>};

<------><------><------>i2s@9301D000 {
<------><------><------><------>compatible = "sunplus,spmp8000-i2s-rx";
<------><------><------><------>reg = <0x9301D000 0x1000>;
<------><------><------><------>interrupt-parent = <&vic0>;
<------><------><------><------>interrupts = <14>;
<------><------><------>};

<------><------><------>adc@9301F000 {
<------><------><------><------>compatible = "sunplus,spmp8000-adc";
<------><------><------><------>reg = <0x9301F000 0x20>;
<------><------><------><------>interrupt-parent = <&vic1>;
<------><------><------><------>interrupts = <27>;
<------><------><------>};

<------><------><------>codec@9301F020 {
<------><------><------><------>compatible = "sunplus,spmp8000-codec";
<------><------><------><------>reg = <0x9301F020 0x20>;
<------><------><------>};
<------><------>};
<------>};

 

и файла борды убрал

<------>OF_DEV_AUXDATA("pwm-backlight", 0, "pwm-backlight",
<------><------><------>&backlight_letcool),
<------>OF_DEV_AUXDATA("sunplus,spmp8000-lcd", 0x93000000, "93000000.fb",
<------><------><------>&spmp8000fb_letcool),

 

 

Буду дальше копать исходную прошивку на проц. Попытаюсь найти есть ли там конфигурация ножек процессора.

 

Вот АСМ код инита дисплея из родной прошивки

// SPMP8000 LCD controller

typedef lcd_info_ctx {
  uint32_t   flags;      // 0x00
  uint16_t   width;      // 0x04
  uint16_t   height;      // 0x06
  uint16_t      // 0x08
  uint16_t      // 0x0A
  uint32_t   frm_buff;   // 0x0c
  uint16_t   osd_width;   // 0x10
  uint16_t   osd_height;   // 0x12

  uint32_t   osd_buff;   // 0x18
  uint8_t      // 0x1c
  uint8_t      // 0x1d
}

setLCDFrameBuffer:
  LDR     R3, =lcd_info_ctx
  STR     R0, [R3,#0xC]
  MOVL    R3, 0x93000054
  STR     R0, [R3]
  LDR     R3, =lcd_direct_update
  LDR     R3, [R3]
  CMP     R3, #0
  MOVLNE  R3, 0x93000078
  MOVNE   R2, #1
  STRNE   R2, [R3]
  BX      LR

// void cyg_interrupt_create(cyg_vector_t vector, cyg_priority_t priority, cyg_addrword_t data, cyg_ISR_t* isr,
//   cyg_DSR_t* dsr, cyg_handle_t* handle, cyg_interrupt* intr);

0029965C lcd_gen_init

  00298CFC lcd_init2(width, height)
     cyg_interrupt_create(0x17, 10, ???, lcd_isr_default)
        -> 00297AF4 lcd_isr_default

     002978C8 LCDC_S110_init
        002972A8 hal_lcd_init
           00292A74 scu_lcd_enable(freq_div_factor)

        002995D0 lcd_suspend
        00299514 lcd_resume

  00298E68 osd_init2
     00297870 OSDC_S110_init


LCDC_BASE   0x93000000

#define   LCDC_CTRL      (LCDC_BASE + 0x00)      // write 0x10000
#define   LCDC_UNK1      (LCDC_BASE + 0x04)
#define   LCDC_UNK2      (LCDC_BASE + 0x08)      // lcd_info_ctx[10]
#define   LCDC_HOR_FBLK   (LCDC_BASE + 0x0c)
#define   LCDC_HOR_BBLK   (LCDC_BASE + 0x14)
#define   LCDC_HOR_SYNCW   (LCDC_BASE + 0x28)
#define   LCDC_VER_FBLK   (LCDC_BASE + 0x18)
#define   LCDC_VER_BBLK   (LCDC_BASE + 0x1c)
#define   LCDC_VER_SYNCW   (LCDC_BASE + 0x2c)

.text:002D30B4                 LDR     R3, =gFrameBufferMgr ; param_R2
.text:002D30B8                 LDR     R2, =set_lcd_fb_format
.text:002D30BC                 STR     R2, [R3]
.text:002D30C0                 LDR     R2, =getLCDBuffFormat
.text:002D30C4                 STR     R2, [R3,#4]
.text:002D30C8                 LDR     R2, =getLCDWidth
.text:002D30CC                 STR     R2, [R3,#8]
.text:002D30D0                 LDR     R2, =getLCDHeight
.text:002D30D4                 STR     R2, [R3,#0xC]
.text:002D30D8                 LDR     R2, =getLCDShadowBuffer
.text:002D30DC                 STR     R2, [R3,#0x10]
.text:002D30E0                 LDR     R2, =getLCDFrameBuffer
.text:002D30E4                 STR     R2, [R3,#0x14]
.text:002D30E8                 LDR     R2, =setLCDFrameBuffer
.text:002D30EC                 STR     R2, [R3,#0x18]
.text:002D30F0                 LDR     R2, =lcd_flip
.text:002D30F4                 STR     R2, [R3,#0x1C]
.text:002D30F8                 LDR     R2, =lcd_gen_init
.text:002D30FC                 STR     R2, [R3,#0x20]
.text:002D3100                 LDR     R2, =lcd_clear
.text:002D3104                 STR     R2, [R3,#0x24]
.text:002D3108                 LDR     R2, =wait_lcd_frame_end
.text:002D310C                 STR     R2, [R3,#0x28]
.text:002D3110                 LDR     R2, =setLCDShadowBuffer
.text:002D3114                 STR     R2, [R3,#0x2C]
.text:002D3118                 LDR     R2, =lcd_suspend
.text:002D311C                 STR     R2, [R3,#0x30]
.text:002D3120                 LDR     R2, =lcd_resume
.text:002D3124                 STR     R2, [R3,#0x34]
.text:002D3128                 LDR     R2, =lcd_enable_layer_no_osd
.text:002D312C                 STR     R2, [R3,#0x38]
.text:002D3130                 LDR     R2, =lcd_set_bright_level ; param_R1
.text:002D3134                 STR     R2, [R3,#0x3C]
.text:002D3138                 B       loc_2D3264
.text:002D313C ; ---------------------------------------------------------------------------
.text:002D313C
.text:002D313C loc_2D313C                              ; CODE XREF: setFrameBufferMgr+4Cj
.text:002D313C                 LDR     R0, =aSetframebuff_1 ; int
.text:002D3140                 BL      diag_printf
.text:002D3144                 LDR     R3, =gFrameBufferMgr ; param_R2
.text:002D3148                 LDR     R2, =set_osd_fb_format
.text:002D314C                 STR     R2, [R3]
.text:002D3150                 LDR     R2, =getOSDBuffFormat
.text:002D3154                 STR     R2, [R3,#4]
.text:002D3158                 LDR     R2, =getOSDWidth
.text:002D315C                 STR     R2, [R3,#8]
.text:002D3160                 LDR     R2, =getOSDHeight
.text:002D3164                 STR     R2, [R3,#0xC]
.text:002D3168                 LDR     R2, =getOSDShadowBuffer
.text:002D316C                 STR     R2, [R3,#0x10]
.text:002D3170                 LDR     R2, =getOSDFrameBuffer
.text:002D3174                 STR     R2, [R3,#0x14]
.text:002D3178                 LDR     R2, =setOSDFrameBuffer
.text:002D317C                 STR     R2, [R3,#0x18]
.text:002D3180                 LDR     R2, =lcd_osd_flip
.text:002D3184                 STR     R2, [R3,#0x1C]
.text:002D3188                 LDR     R2, =lcd_gen_init
.text:002D318C                 STR     R2, [R3,#0x20]
.text:002D3190                 LDR     R2, =lcd_osd_clear
.text:002D3194                 STR     R2, [R3,#0x24]
.text:002D3198                 LDR     R2, =wait_lcd_frame_end
.text:002D319C                 STR     R2, [R3,#0x28]
.text:002D31A0                 LDR     R2, =setOSDShadowBuffer
.text:002D31A4                 STR     R2, [R3,#0x2C]
.text:002D31A8                 LDR     R2, =lcd_suspend
.text:002D31AC                 STR     R2, [R3,#0x30]
.text:002D31B0                 LDR     R2, =lcd_resume
.text:002D31B4                 STR     R2, [R3,#0x34]
.text:002D31B8                 LDR     R2, =lcd_enable_layer
.text:002D31BC                 STR     R2, [R3,#0x38]
.text:002D31C0                 LDR     R2, =lcd_set_bright_level ; param_R1
.text:002D31C4                 STR     R2, [R3,#0x3C]
.text:002D31C8                 B       loc_2D3264
.text:002D31CC ; ---------------------------------------------------------------------------
.text:002D31CC
.text:002D31CC loc_2D31CC                              ; CODE XREF: setFrameBufferMgr+40j
.text:002D31CC                 LDR     R0, =aSetframebuff_2 ; int
.text:002D31D0                 BL      diag_printf
.text:002D31D4                 MOV     R2, #2
.text:002D31D8                 LDR     R3, =g_FrameBuffDev
.text:002D31DC                 STR     R2, [R3]
.text:002D31E0                 LDR     R3, =gFrameBufferMgr
.text:002D31E4                 LDR     R2, =set_tv_osd_fb_format
.text:002D31E8                 STR     R2, [R3]
.text:002D31EC                 LDR     R2, =get_tv_osd_BuffFormat
.text:002D31F0                 STR     R2, [R3,#4]
.text:002D31F4                 LDR     R2, =get_tv_osd_width
.text:002D31F8                 STR     R2, [R3,#8]
.text:002D31FC                 LDR     R2, =get_tv_osd_height
.text:002D3200                 STR     R2, [R3,#0xC]
.text:002D3204                 LDR     R2, =get_tv_osd_ShadowBuffer
.text:002D3208                 STR     R2, [R3,#0x10]
.text:002D320C                 LDR     R2, =get_tv_osd_FrameBuffer
.text:002D3210                 STR     R2, [R3,#0x14]
.text:002D3214                 LDR     R2, =set_tv_osd_FrameBuffer
.text:002D3218                 STR     R2, [R3,#0x18]
.text:002D321C                 LDR     R2, =tv_osd_flip
.text:002D3220                 STR     R2, [R3,#0x1C]
.text:002D3224                 LDR     R2, =tv_gen_init
.text:002D3228                 STR     R2, [R3,#0x20]
.text:002D322C                 LDR     R2, =tv_osd_clear
.text:002D3230                 STR     R2, [R3,#0x24]
.text:002D3234                 LDR     R2, =tv_out_wait_frame_end
.text:002D3238                 STR     R2, [R3,#0x28]
.text:002D323C                 LDR     R2, =set_tv_osd_ShadowBuffer
.text:002D3240                 STR     R2, [R3,#0x2C]
.text:002D3244                 LDR     R2, =tv_suspend
.text:002D3248                 STR     R2, [R3,#0x30]
.text:002D324C                 LDR     R2, =tv_resume
.text:002D3250                 STR     R2, [R3,#0x34]
.text:002D3254                 LDR     R2, =tv_enable_layer
.text:002D3258                 STR     R2, [R3,#0x38]
.text:002D325C                 LDR     R2, =tv_set_bright_level
.text:002D3260                 STR     R2, [R3,#0x3C]
.text:002D3264
.text:002D3264 loc_2D3264                              ; CODE XREF: setFrameBufferMgr+50j
.text:002D3264                                         ; setFrameBufferMgr+58j ...
.text:002D3264                 BL      cyg_scheduler_unlock
.text:002D3268                 LDR     R0, =aSetframebuff_3 ; int
.text:002D326C                 BL      diag_printf
.text:002D3270                 LDMFD   SP, {R4,R11,SP,PC}
.text:002D3270 ; End of function setFrameBufferMgr

 

 

Посмотрел активность на шинах. На дисплей не подаётся клок. Копаю в эту сторону.

Edited by Sanoend

Share this post


Link to post
Share on other sites

Новости и вопросы с полей.

На контроллер ЛСД не поступают тактовые импульсы.

Я обнаружил что в родной прошивке данный "клок" включается так:

EXPORT scu_set_disp_clk
scu_set_disp_clk
; CODE XREF: scu_lcm_enable+10^Yp
; scu_lcd_enable+4^Yp ...
               LDR     R2, =0x93007000 ;задать регистру Р2 адрес 0x93007000
               LDR     R3, [R2,#0x80] ;косвенно считать в регистр Р3 содержимое памяти по адресу Р2+смещение 0x80
               BIC     R3, R3, #0x100
               STR     R3, [R2,#0x80]
               BIC     R3, R3, #0xFF
               SUB     R0, R0, #1
               ORR     R0, R0, R3
               STR     R0, [R2,#0x80]
               ORR     R0, R0, #0x100
               STR     R0, [R2,#0x80]
               BX      LR
; End of function scu_set_disp_clk

 

Получается, что в ядре просто нужно создать таймер, который бы записывал по адресу 0x93007080 значение FF для включения и 00 для выключения.

Но я не как не могу найти в поисковике как писать драйвера таймеров, я попробовал решить проблему "в лоб" и сделать записть регистра вот так

writeb(0xFF, SPMP8000_SCU_A_BASE + SCU_A_LCD_CLK_CFG);

и вот так

__raw_writeb(0xFF, SPMP8000_SCU_A_BASE + SCU_A_LCD_CLK_CFG);

Соответсвенно задав в заголовочных файлах значения

#define SPMP8000_SCU_A_BASE 0x93007000
#define SCU_A_LCD_CLK_CFG 0x80

 

И естественно получил ошибки типа

Unable to handle kernel NULL pointer dereference at virtual address 93007080

и

g request at virtual address 93007080

т.к. ядро естественно пытается обращатся к виртуальным адресам.

 

Подскажите пожалуйста как правильно написать драйвер clock и что можно взять за основу. За ранее спасибо.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this