原创 freertos(第十一課,multi-task程序架構)

基於freertos的程序架構,可以結合front-middle-rear stage,進行任務劃分。 整個系統仍然是一個event driven system。但是由於有了RTOS進行任務管理,所以在任務劃分上,更加清晰,並且實

原创 freertos(第十課,基於standalone移植freertos)

我們來看看SDK中已經移植好的freertos,具體做了哪些事情。 在BSP文件夾下,除了常規的standaloneOS所提供的模塊,還多了一個freertos901_xilinx_v1_1文件夾。 打開system.mss,可以

原创 freertos(第五課 softtimer)

freertos提供了soft timer,需要爲softtimer掛接callback,當時間到達後,就會觸發callback執行。 callback在timer的服務任務中執行的,所以,不能使用可能阻塞任務的API。 一般使用

原创 linux驅動(第二十二課 INPUT SUBSYSTEM)

輸入設備是典型的CDEV。 一般的工作機制時,按鍵或者觸摸板在產生了數據後,發送一箇中斷,或者內核通過TIMER進行輪詢,然後CPU通過SPI,I2C,USB等BUS,讀取數據,並放入一個InputBuffer,CDEV的驅動,負

原创 linux驅動(第二十五課,FRAMEBUFFER)

FB是一個典型的CDEV。 framebuffer是對顯示區的抽象,屏蔽顯示硬件的底層差異。 對於幀緩衝設備而言,只要在緩衝區中寫入對應的數據,對應的就會自動在屏幕上顯示出來。 drivers/video/fbdev/core/f

原创 linux驅動(第二十四課 PWM)

PWMDEV是一個典型的CDEV。 內核實現了PWMCORE,向上提供一個CDEV的用戶接口,向下,調用不同的PWMCONTROLLER提供服務。 類似於GPIOCHIP,在kernel中,PWMCHIP就是用來控制PWMCONT

原创 linux驅動(第二十三課 RTC)

RTC是一種典型的CDEV。 drivers/rtc/rtc-dev.c實現了RTC的通用驅動層,稱爲RTCCORE。 RTCCORE實現了FOPS,並向底層導出了一些結構體和API。 分層的結果是,底層RTC驅動無需關心RTC作

原创 linux驅動(第十七課,USBBUS)

USB也是主從結構的總線。整體呈樹狀結構。 USBHOST,由它發起傳輸。 USB設備,分爲HUB和FUNCTION。我們所用的外設,就是FUNCTION。 USB樹中,最多能有6層。 USB設備地址,是7位的。其中,地址0是一個

原创 linux驅動(第十六課,SPIBUS)

和I2CBUS類似,SPIBUS上的物理設備,也是分爲SPIMASTER和SPISLAVE。 不同的是,SPIBUS上,只能有一個MASTER。 在linux中,對應定義了兩種對象,spi_master 和 spi_device。

原创 linux驅動(第十八課,PINCTRL,GPIO, GPIO_CHIP, IRQ_CHIP)

在linux中,pinctrl被定義爲一個子系統。pinmux功能被pinctrl子系統所管理。 這個功能通常有SOC廠商提供。我們需要關心的是,如何使用它的功能。 pin_configuration_node 是一個多維向量,通

原创 linux驅動(第十九課 MISCDEV)

linux驅動是分層設計的,所以各個具體設備都能找到歸屬的類型,從而套用對應的框架。這樣,就只需要實現最底層的部分。 但是也有一部分設備並不能確定它的類型,這時,可以使用miscdevice的框架。 本質上,miscdevice也

原创 linux驅動(第十五課,I2CBUS)

I2CBUS,在協議標準裏,分爲MASTER和SLAVE。 linux裏,I2CMASTER被稱爲adaptor,對應的,I2CSLAVE被稱爲client。 爲了區別於SPIBUS。 I2C是可以允許多個主機的,所以叫做MAST

原创 linux驅動(第二十一課,IRQ COMPLETION)

如果需要驅動進程和設備操作同步,就需要用到IRQ和 Completion。 進程執行到同步點時,將自己阻塞休眠到completion這個event上,而在IRQACTION中負責喚醒阻塞休眠在對應event上的進程。 例如,我們需

原创 linux驅動(第二十課 TTY)

console=ttySAC0,115200 這是bootargs 裏最常見的一句。它被用來選擇從哪個設備輸出內核、驅動的printk信息。 這究竟是什麼意思? 串行端口終端(/dev/ttySn) 計算機把每個串行端口都看作是

原创 linux驅動(第十三課,BDEV, eMMC)

BDEV和CDEV在IO操作上有很大的不同。 CDEV是直來直去的,用戶進程請求文件操作syscall,syscall調用FOPS,整個調用棧就完成了。 但是BDEV要用到內核的更多機制,例如緩衝,IO調度,請求隊列等。 BDEV