日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux显卡内核修改,iTOP-4412开发板-驱动-linux显卡驱动的修改方法

發布時間:2023/12/10 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux显卡内核修改,iTOP-4412开发板-驱动-linux显卡驱动的修改方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文檔介紹迅為4412開發板的顯卡分辨率修改方法。

iTOP-4412 開發板支持 4.3 寸、7?寸和 9.7 寸等 lcd 顯示屏。其中 4.3 寸屏是用的 cpu

直接出來的 RGB 信號,7?寸屏和 9.7 寸屏是用的 LVDS 信號,硬件上使用了一個 RGB 轉

LVDS?的芯片實現的。我們來看下顯示驅動,顯示驅動在內核的“drivers/video/samsung”

目錄下面,這個驅動是三星提供好的,只講下需要修改的幾個文件。

首先是關于屏幕的分辨率的修改,因為不同的屏幕分辨率,頻率以及其他一些硬件參數是

不同的,所以我們需要根據這些參數去配置 cpu 的顯示控制器,關于這些參數是在

“driversvideo/samsung/s3cfb_wa101s.c”這個文件,打開這個文件我們可以看到這個文

件主要就是定義了一個類型是 s3cfb_lcd 的變量 wa101,屏幕的硬件參數(分辨率,時鐘頻

率以及其它)就是保存在這個變量里面,現在我們來看下這個變量結構類型的定義:

struct s3cfb_lcd {

int width;

int height;

int bpp;

int freq;

struct s3cfb_lcd_timing timing;

struct s3cfb_lcd_polarity polarity;

void (*init_ldi)(void);

void?(*deinit_ldi)(void);

};

其中的 width 和 height 指屏幕的分辨率,freq?是時鐘頻率,bpp?是數據位。timing?是

屏幕的其他一些參數,timing?的類型定義如下:

struct s3cfb_lcd_timing {

int h_fp;

int h_bp;

int h_sw;

int v_fp;

int v_fpe;

int v_bp;

int v_bpe;

int v_sw;

};

這個結構代表屏幕的左間距,右間距,水平同步信號寬度,垂直同步信號的有效行數等屏

幕的硬件參數,這些參數可以通過查看屏幕的數據手冊獲得。

下面是 polarity 變量,他的定義如下:

struct s3cfb_lcd_polarity {

int rise_vclk;

int inv_hsync;

int inv_vsync;

int inv_vden;

};

這個變量代表時鐘行場的極性。

通過修改這個文件里面的這些參數就可以設置 cpu 的顯示控制器來支持我們使用的 lcd

屏幕了。

下面我們來看一下 lcd 的控制文件:arch/arm/mach-exynos/setup-fb-s5p.c?在這個文

件的 s3cfb_cfg_gpio 函數完成 LCD 數據引腳初始化,?驅動能力設為最高

S5P_GPIO_DRVSTR_LV4;管腳驅動能力,S5P_GPIO_DRVSTR_LV1-4?四個等級選擇,并且

設置 LVDS 芯片的使能引腳輸出高:

void s3cfb_cfg_gpio(struct platform_device *pdev)

{

int err;

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF0(0), 8, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF1(0), 8, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF2(0), 8, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF3(0), 4, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

#if 1 // TC4

//LVDS_PWDN

err = gpio_request(EXYNOS4_GPL1(0),?"GPL1_0");

if (err)?{

printk(KERN_ERR?"failed to request GPL1 for "

"lcd power control\n");

return err;

}

gpio_direction_output(EXYNOS4_GPL1(0), 1);

s3c_gpio_cfgpin(EXYNOS4_GPL1(0), S3C_GPIO_OUTPUT);

gpio_free(EXYNOS4_GPL1(0));

#endif

}

然后是時鐘控制函數,完成時鐘的使能和關閉:

int s3cfb_clk_on(struct platform_device *pdev, struct clk **s3cfb_clk)

{

struct clk *sclk?= NULL;

struct clk *mout_mpll?= NULL;

struct clk *lcd_clk?= NULL;

u32 rate = 0;

int ret = 0;

lcd_clk = clk_get(&pdev->dev,?"lcd");

if (IS_ERR(lcd_clk))?{

dev_err(&pdev->dev,?"failed to get operation clk for fimd\n");

goto err_clk0;

}

ret = clk_enable(lcd_clk);

if (ret?< 0)?{

dev_err(&pdev->dev,?"failed to clk_enable of lcd clk for fimd\n");

goto err_clk0;

}

clk_put(lcd_clk);

sclk = clk_get(&pdev->dev,?"sclk_fimd");

if (IS_ERR(sclk))?{

dev_err(&pdev->dev,?"failed to get sclk for fimd\n");

goto err_clk1;

}

if (soc_is_exynos4210())

mout_mpll?= clk_get(&pdev->dev,?"mout_mpll");

else

mout_mpll = clk_get(&pdev->dev,?"mout_mpll_user");

if (IS_ERR(mout_mpll))?{

dev_err(&pdev->dev,?"failed to get mout_mpll for fimd\n");

goto err_clk2;

}

ret = clk_set_parent(sclk, mout_mpll);

if (ret?< 0)?{

dev_err(&pdev->dev,?"failed to clk_set_parent for fimd\n");

goto err_clk2;

}

ret = clk_set_rate(sclk, 800000000);

if (ret?< 0)?{

dev_err(&pdev->dev,?"failed to clk_set_rate of sclk for fimd\n");

goto err_clk2;

}

dev_dbg(&pdev->dev,?"set fimd sclk rate to %d\n", rate);

clk_put(mout_mpll);

ret = clk_enable(sclk);

if (ret?< 0)?{

dev_err(&pdev->dev,?"failed to clk_enable of sclk for fimd\n");

goto err_clk2;

}

*s3cfb_clk = sclk;

return 0;

err_clk2:

clk_put(mout_mpll);

err_clk1:

clk_put(sclk);

err_clk0:

clk_put(lcd_clk);

return -EINVAL;

}

int s3cfb_clk_off(struct platform_device *pdev, struct clk **clk)

{

struct clk *lcd_clk?= NULL;

lcd_clk = clk_get(&pdev->dev,?"lcd");

if (IS_ERR(lcd_clk))?{

printk(KERN_ERR?"failed to get ip clk for fimd0\n");

goto err_clk0;

}

clk_disable(lcd_clk);

clk_put(lcd_clk);

clk_disable(*clk);

clk_put(*clk);

*clk = NULL;

return 0;

err_clk0:

clk_put(lcd_clk);

return -EINVAL;

}

void s3cfb_get_clk_name(char *clk_name)

{

strcpy(clk_name,?"sclk_fimd");

}

然后是 s3cfb_backlight_on 函數,這個是使能屏幕顯示,s3cfb_backlight_off?關閉屏幕顯示。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的linux显卡内核修改,iTOP-4412开发板-驱动-linux显卡驱动的修改方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。