本文來源電子發(fā)燒友社區(qū),作者:cszzlsw, 帖子地址:https://bbs.elecfans.com/jishu_2287667_1_1.html
1.前言
前面兩篇帖子咱們回顧了從頭制作系統(tǒng)并運(yùn)行homeassistant,其中不可謂不辛酸,然后我就在想再做個(gè)啥,找了一下自己庫(kù)存的外設(shè),有一個(gè)tft屏帶觸摸芯片的,一想,這不正好的嘛,可以玩玩圖形編程了,老聽說linux開發(fā)板的qt編程咱也沒見過啊,說干就干,這就開始了.
2.移植驅(qū)動(dòng)并首先嘗試
首先我的屏主控是lil9488的,分辨率320*480,據(jù)說再往上就得上rgb屏了,這咱沒玩過也不懂,把手頭上這個(gè)整明白先.
這個(gè)在git倉(cāng)庫(kù):https://github.com/starfive-tech/freelight-u-sdk,給的linux內(nèi)核里面找了一圈,也沒見,
然后發(fā)現(xiàn)有一個(gè)芯片是ili9486的,跟我這差一位數(shù),一想差不多,這個(gè)開始弄吧,把文件拷過來,然后改吧:
然后把所有涉及9486的地方都改成9488,
然后是設(shè)備樹里面改吧改吧(改了好多次,也是第一次寫設(shè)備樹):
這款tft屏除了常規(guī)的spi線之外,還有BL(背光BackLight),Reset(復(fù)位),DC(Data-Control)線需要接,這里我用的gpio1,2,3腳,
另外最后的那個(gè)debug如果不需要就置0,需要就置1.
然后在linux內(nèi)核里面配置一下,把ili9488加進(jìn)來:
-> Device Drivers │
│ -> Staging drivers (STAGING [=y]) │
│ -> Support for small TFT LCD display modules (FB_TFT [=y])
然后就是編譯內(nèi)核,再刪除rootfs,然后再生成rootfs,這都老熟人了,
這些都整完之后,就把卡插上準(zhǔn)備燒錄,
然后漫長(zhǎng)的等待過程之后,終于燒完了,
緊跟著就把屏接上,按照文檔里介紹的40pin引腳對(duì)應(yīng)接好,
上電,然而,并沒有出現(xiàn)期待中的點(diǎn)亮屏幕,
二.各種解決問題
1.spi沒有設(shè)備id問題:
出現(xiàn)這個(gè)問題的原因是因?yàn)?a target="_blank">sdk的系統(tǒng)是5.15,屬于是很新的系統(tǒng)了,但是linux里面的驅(qū)動(dòng)幾年都不更新,所以過期了,需要在ili9844里這么改:
2.ili支持888顏色而ili9486是565模式
這里需要改好幾個(gè)地方,
首先是ili9488文件里初始化序列里面,把這個(gè)值由0x55改成0x66,
然后在ser_var里面添加上888色彩的信息,
然后是display的值,增加一個(gè)函數(shù)和bbp值:
這里面涉及的這個(gè)函數(shù):fbtft_write_vmem24_bus8就是寫入像素信息的
這個(gè)函數(shù)需要放到fbtft-core.c里,放文件最后也行
fbtft-core.c文件還需要修改fbtft_framebuffer_alloc函數(shù)的幾個(gè)地方:
3.修改fbtft-core.c里面的幾個(gè)函數(shù),
首先是:fbtft_request_one_gpio:
復(fù)制代碼
然后是fbtft_request_gpios:
復(fù)制代碼
最后是fbtft_reset:
復(fù)制代碼
這里主要是那個(gè)復(fù)位腳重啟一下,原來的是把cs腳使能,不知道為什么是這樣
燒錄之后如果不能顯示,可以嘗試把系統(tǒng)原來的顯示去掉(不知道有沒有作用,可以試下,我實(shí)驗(yàn)過程中去掉了):
大概主要碰到的問題就是這些吧,可能有些忘記了,想起來的時(shí)候再添加.
三.顯示logo,
這里需要修改linux配置,配置這個(gè)參數(shù),這個(gè)就是顯示logo的
-> Device Drivers │
│ -> Graphics support │
│ -> Bootup logo (LOGO [=y])
效果看一看(后面有時(shí)間換成咱們賽昉的logo試試):
如果還想把終端的打印信息在屏幕上顯示出來,就配置這個(gè)
│ -> Device Drivers │
│ -> Graphics support │
│ -> Console display driver support
但是這還不夠,還需要把console額外賦個(gè)值,在bootarg那里增加一個(gè)參數(shù)(這個(gè)功能很酷炫,但實(shí)際沒什么用,建議不要搞):
這里我們把固件編譯出來試一下是可以將字符顯示在屏幕上的,在linux終端上輸入:
echo hello >/dev/tty0
可以看到hello字符出現(xiàn)在屏幕上了.
四.總結(jié)
到這里一款LCD屏幕的移植過程大致就完了,整個(gè)步驟其實(shí)不是很繁瑣,其實(shí)最有意義的是這中間找問題的過程,借此機(jī)會(huì)大致弄明白了設(shè)備數(shù)的寫法
也知道了一些驅(qū)動(dòng)方面的知識(shí),后續(xù)等tf卡刷方式速度快點(diǎn)再玩了,準(zhǔn)備的實(shí)驗(yàn)有觸摸,QT寫界面等等,拭目以待吧.
再次吐槽發(fā)燒友的發(fā)帖機(jī)制,太難受,要趕緊把圖片粘貼功能弄出來
1.前言
前面兩篇帖子咱們回顧了從頭制作系統(tǒng)并運(yùn)行homeassistant,其中不可謂不辛酸,然后我就在想再做個(gè)啥,找了一下自己庫(kù)存的外設(shè),有一個(gè)tft屏帶觸摸芯片的,一想,這不正好的嘛,可以玩玩圖形編程了,老聽說linux開發(fā)板的qt編程咱也沒見過啊,說干就干,這就開始了.
2.移植驅(qū)動(dòng)并首先嘗試
首先我的屏主控是lil9488的,分辨率320*480,據(jù)說再往上就得上rgb屏了,這咱沒玩過也不懂,把手頭上這個(gè)整明白先.
這個(gè)在git倉(cāng)庫(kù):https://github.com/starfive-tech/freelight-u-sdk,給的linux內(nèi)核里面找了一圈,也沒見,
然后發(fā)現(xiàn)有一個(gè)芯片是ili9486的,跟我這差一位數(shù),一想差不多,這個(gè)開始弄吧,把文件拷過來,然后改吧:

然后把所有涉及9486的地方都改成9488,
然后是設(shè)備樹里面改吧改吧(改了好多次,也是第一次寫設(shè)備樹):

這款tft屏除了常規(guī)的spi線之外,還有BL(背光BackLight),Reset(復(fù)位),DC(Data-Control)線需要接,這里我用的gpio1,2,3腳,
另外最后的那個(gè)debug如果不需要就置0,需要就置1.
然后在linux內(nèi)核里面配置一下,把ili9488加進(jìn)來:
-> Device Drivers │
│ -> Staging drivers (STAGING [=y]) │
│ -> Support for small TFT LCD display modules (FB_TFT [=y])
然后就是編譯內(nèi)核,再刪除rootfs,然后再生成rootfs,這都老熟人了,
這些都整完之后,就把卡插上準(zhǔn)備燒錄,
然后漫長(zhǎng)的等待過程之后,終于燒完了,
緊跟著就把屏接上,按照文檔里介紹的40pin引腳對(duì)應(yīng)接好,
上電,然而,并沒有出現(xiàn)期待中的點(diǎn)亮屏幕,
二.各種解決問題
1.spi沒有設(shè)備id問題:
出現(xiàn)這個(gè)問題的原因是因?yàn)?a target="_blank">sdk的系統(tǒng)是5.15,屬于是很新的系統(tǒng)了,但是linux里面的驅(qū)動(dòng)幾年都不更新,所以過期了,需要在ili9844里這么改:

2.ili支持888顏色而ili9486是565模式
這里需要改好幾個(gè)地方,
首先是ili9488文件里初始化序列里面,把這個(gè)值由0x55改成0x66,

然后在ser_var里面添加上888色彩的信息,

然后是display的值,增加一個(gè)函數(shù)和bbp值:

這里面涉及的這個(gè)函數(shù):fbtft_write_vmem24_bus8就是寫入像素信息的
這個(gè)函數(shù)需要放到fbtft-core.c里,放文件最后也行
fbtft-core.c文件還需要修改fbtft_framebuffer_alloc函數(shù)的幾個(gè)地方:


3.修改fbtft-core.c里面的幾個(gè)函數(shù),
首先是:fbtft_request_one_gpio:
- #include "linux/gpio.h"
- #include "linux/of_gpio.h"
- static int fbtft_request_one_gpio(struct fbtft_par *par,
- const char *name, int index,
- struct gpio_desc **gpiop)
- {
- struct device *dev = par->info->device;
- struct device_node *node = dev->of_node;
- int gpio, flags, ret = 0;
- enum of_gpio_flags of_flags;
- if (of_find_property(node, name, NULL)) {
- gpio = of_get_named_gpio_flags(node, name, index, &of_flags);
- if (gpio == -ENOENT)
- return 0;
- if (gpio == -EPROBE_DEFER)
- return gpio;
- if (gpio < 0) {
- dev_err(dev,
- "failed to get '%s' from DTn", name);
- return gpio;
- }
- //active low translates to initially low
- flags = (of_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW :
- GPIOF_OUT_INIT_HIGH;
- ret = devm_gpio_request_one(dev, gpio, flags,
- dev->driver->name);
- if (ret) {
- dev_err(dev,
- "gpio_request_one('%s'=%d) failed with %dn",
- name, gpio, ret);
- return ret;
- }
- *gpiop = gpio_to_desc(gpio);
- fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' = GPIO%dn",
- __func__, name, gpio);
- }
- return ret;
- }
然后是fbtft_request_gpios:
- static int fbtft_request_gpios(struct fbtft_par *par)
- {
- int i;
- int ret;
- ret = fbtft_request_one_gpio(par, "reset-gpios", 0, &par->gpio.reset);
- if (ret)
- return ret;
- ret = fbtft_request_one_gpio(par, "dc-gpios", 0, &par->gpio.dc);
- if (ret)
- return ret;
- ret = fbtft_request_one_gpio(par, "rd-gpios", 0, &par->gpio.rd);
- if (ret)
- return ret;
- ret = fbtft_request_one_gpio(par, "wr-gpios", 0, &par->gpio.wr);
- if (ret)
- return ret;
- ret = fbtft_request_one_gpio(par, "cs-gpios", 0, &par->gpio.cs);
- if (ret)
- return ret;
- ret = fbtft_request_one_gpio(par, "latch-gpios", 0, &par->gpio.latch);
- if (ret)
- return ret;
- for (i = 0; i < 16; i++) {
- ret = fbtft_request_one_gpio(par, "db-gpios", i,
- &par->gpio.db[i]);
- if (ret)
- return ret;
- ret = fbtft_request_one_gpio(par, "led-gpios", i,
- &par->gpio.led[i]);
- if (ret)
- return ret;
- ret = fbtft_request_one_gpio(par, "aux-gpios", i,
- &par->gpio.aux[i]);
- if (ret)
- return ret;
- }
- return 0;
- }
最后是fbtft_reset:
- static void fbtft_reset(struct fbtft_par *par)
- {
- if (!par->gpio.reset)
- return;
- fbtft_par_dbg(DEBUG_RESET, par, "%s()n", __func__);
- gpiod_set_value_cansleep(par->gpio.reset, 1);
- usleep_range(20, 40);
- gpiod_set_value_cansleep(par->gpio.reset, 0);
- msleep(120);
- gpiod_set_value_cansleep(par->gpio.reset, 1);
- // gpiod_set_value_cansleep(par->gpio.cs, 1);/* Activate chip */
- }
這里主要是那個(gè)復(fù)位腳重啟一下,原來的是把cs腳使能,不知道為什么是這樣
燒錄之后如果不能顯示,可以嘗試把系統(tǒng)原來的顯示去掉(不知道有沒有作用,可以試下,我實(shí)驗(yàn)過程中去掉了):

大概主要碰到的問題就是這些吧,可能有些忘記了,想起來的時(shí)候再添加.
三.顯示logo,
這里需要修改linux配置,配置這個(gè)參數(shù),這個(gè)就是顯示logo的
-> Device Drivers │
│ -> Graphics support │
│ -> Bootup logo (LOGO [=y])

效果看一看(后面有時(shí)間換成咱們賽昉的logo試試):

如果還想把終端的打印信息在屏幕上顯示出來,就配置這個(gè)
│ -> Device Drivers │
│ -> Graphics support │
│ -> Console display driver support

但是這還不夠,還需要把console額外賦個(gè)值,在bootarg那里增加一個(gè)參數(shù)(這個(gè)功能很酷炫,但實(shí)際沒什么用,建議不要搞):
這里我們把固件編譯出來試一下是可以將字符顯示在屏幕上的,在linux終端上輸入:
echo hello >/dev/tty0
可以看到hello字符出現(xiàn)在屏幕上了.
四.總結(jié)
到這里一款LCD屏幕的移植過程大致就完了,整個(gè)步驟其實(shí)不是很繁瑣,其實(shí)最有意義的是這中間找問題的過程,借此機(jī)會(huì)大致弄明白了設(shè)備數(shù)的寫法
也知道了一些驅(qū)動(dòng)方面的知識(shí),后續(xù)等tf卡刷方式速度快點(diǎn)再玩了,準(zhǔn)備的實(shí)驗(yàn)有觸摸,QT寫界面等等,拭目以待吧.
再次吐槽發(fā)燒友的發(fā)帖機(jī)制,太難受,要趕緊把圖片粘貼功能弄出來
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
RISC-V
+關(guān)注
關(guān)注
46文章
2472瀏覽量
48183 -
賽昉科技
+關(guān)注
關(guān)注
3文章
164瀏覽量
14711
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
共建生態(tài),賦能應(yīng)用 | 賽昉科技精彩亮相中國(guó)RISC-V生態(tài)大會(huì)
2025中國(guó)RISC-V生態(tài)大會(huì)于近日在北京圓滿落幕。大會(huì)以“共建生態(tài),共享未來”為主題,匯聚了中外產(chǎn)學(xué)研界各方代表,共同探討RISC-V的最新發(fā)展趨勢(shì)和產(chǎn)業(yè)機(jī)遇。作為中國(guó)RISC-V軟硬件生態(tài)

賽昉科技RISC-V家庭云解決方案:NAS存儲(chǔ)性能升級(jí),隱私安全雙保障
(VisionFive2)單板計(jì)算機(jī),推出全新RISC-V家庭云(NAS)解決方案,為用戶提供高性能、高安全性的私有云存儲(chǔ)服務(wù),滿足家庭及輕量級(jí)企業(yè)場(chǎng)景需求。方案亮點(diǎn)01高性能硬件支持

首屆RISC-V產(chǎn)業(yè)發(fā)展大會(huì)成功舉辦,賽昉攜手產(chǎn)業(yè)伙伴共繪RISC-V新藍(lán)圖
12月28日,由中國(guó)電子工業(yè)標(biāo)準(zhǔn)化技術(shù)協(xié)會(huì)RISC-V工作委員會(huì)(以下簡(jiǎn)稱“RISC-V工作委員會(huì)”)主辦的首屆“RISC-V產(chǎn)業(yè)發(fā)展大會(huì)”在北京成功舉辦。作為推動(dòng)RISC-V生態(tài)發(fā)展

賽昉科技將亮相RISC-V產(chǎn)業(yè)發(fā)展大會(huì),帶來應(yīng)用、軟件、人才三大核心主題分享
為積極響應(yīng)全球RISC-V技術(shù)發(fā)展趨勢(shì),加速構(gòu)建并完善RISC-V產(chǎn)業(yè)生態(tài)體系,進(jìn)一步推動(dòng)RISC-V產(chǎn)業(yè)在標(biāo)準(zhǔn)引領(lǐng)下的健康、可持續(xù)發(fā)展。由

賽昉科技亮相ICCAD-Expo 2024,共探RISC-V技術(shù)最新發(fā)展
與會(huì)觀眾共探RISC-V技術(shù)的最新發(fā)展和行業(yè)應(yīng)用。RISC-V架構(gòu)的開放性和靈活性使其成為中國(guó)芯片行業(yè)的重要機(jī)遇。賽昉科技資深銷售總監(jiān)周杰在“IP與IC設(shè)計(jì)服務(wù)”專

賽昉科技發(fā)布全新RISC-V處理器內(nèi)核Dubhe-83
RISC-V軟硬件生態(tài)企業(yè)賽昉科技近日宣布,正式推出其全新RISC-V處理器內(nèi)核——Dubhe-83(昉?天樞-83),該內(nèi)核專為AI應(yīng)用與
官宣!OpenWrt正式支持賽昉科技JH-7110 RISC-V應(yīng)用處理器
OpenWrt官方近日發(fā)布了全新的LTS(長(zhǎng)期支持)版本——OpenWrt24.10,并正式支持賽昉科技的昉·驚鴻-7110(JH-7110)RIS

賽昉科技亮相世界互聯(lián)網(wǎng)大會(huì),精彩呈現(xiàn)RISC-V創(chuàng)新成果
豐富的RISC-V創(chuàng)新成果,包括昉·驚鴻-7110(JH-7110)RISC-V應(yīng)用處理器,昉·星光2(VisionFive2)

預(yù)售啟動(dòng)!昉·星光 2 AI套件正式發(fā)布,基于RISC-V構(gòu)建AI算力
10月24日,昉·星光2(VisionFive2)AI套件正式開啟預(yù)售。該套件由中國(guó)RISC-V軟硬件生態(tài)領(lǐng)導(dǎo)者賽昉科技攜手邊緣人工智能(A

賽昉科技產(chǎn)品亮相RISC-V開源創(chuàng)新中心,雙方達(dá)成戰(zhàn)略合作
RISC-V開源創(chuàng)新中心:“我們非常高興能與賽昉科技公司建立戰(zhàn)略合作伙伴關(guān)系。賽昉科技的技術(shù)創(chuàng)新,結(jié)合中心的教育資源,將為雙方帶來巨大的協(xié)同效應(yīng)。”

如何讓RISC-V企業(yè)賺錢?賽昉科技展現(xiàn)全場(chǎng)景RISC-V解決方案
今年的RISC-V中國(guó)峰會(huì),圓桌論壇的主題格外引人注目——如何讓RISC-V企業(yè)賺錢?賽昉科技給出的答案是“應(yīng)用”。如果把RISC-V浪潮比

賽昉科技RVspace生態(tài)社區(qū)雙周報(bào)(8月刊)
持續(xù)與各方伙伴攜手共建RISC-V生態(tài)社區(qū),為RISC-V生態(tài)建設(shè)貢獻(xiàn)力量。rvspace.orgRVspace社區(qū)動(dòng)態(tài)01將VisionFive2單板計(jì)算機(jī)改造

Ubuntu現(xiàn)已適配RISC-V單板計(jì)算機(jī)Milk-V Mars
近期,Canonical宣布優(yōu)化的Ubuntu24.04鏡像已可用于RISC-V單板計(jì)算機(jī)Milk-VMars。Milk-VMars由深圳市群芯閃耀科技有限公司(Milk-V)設(shè)計(jì)并推

評(píng)論