W!o+ 的《小伶鼬工坊演義》︰ 一窺全豹之系統設計‧探索‧戊

己一

己二

己三

《説文解字》:己,中宮也。象萬物辟藏詘形也。己承戊,象人腹。凡己之屬皆从己。

造字本義:在繩子上繫圈、打結,用以記數和記事,或標明物品的歸屬者。

……

所謂『食色性也,人之大欲存焉。』本就自然而然,只不過

你是誰? Who are you ?

你是怎樣的人? What are you ?

指出了重點,求學中,常常會發現『問題』比『答案』重要!或者至少一樣『重要』!!

因此師法古今中外的『楷模典範』人物,通常容易『思路開闊』,要是還能有個自己的『座右銘』,或許更好的吧。

昭明文選‧崔瑗‧座右銘

崔子玉范曄後漢書曰:崔瑗,字子玉,涿郡人也。早孤,銳志好學,盡能傳其父業。舉茂才,為汲令,遷濟北相,疾卒。

無道人之短,無說己之長。施人慎勿念,受施慎勿忘。戰國策,唐雎謂信陵君曰:人之有德於我,不可忘也;吾之有德於人,不可不忘也。世譽不足慕,唯仁為紀綱。隱心而後動,謗議庸何傷?劉熙孟子注曰:隱,度也。周易曰:君子安其身而後動,易其心而後語。呂氏春秋曰:內反於心不慚,然後動也。無使名過實,守愚聖所臧。越絕書,范子曰:名過實者滅,聖人不使名過實。家語,孔子曰:聰明睿智,守之以愚;功被天下,守之以讓。在涅貴不淄,曖曖內含光。論語,子曰:不曰堅乎?磨而不磷;不曰白乎?涅而不淄。晏子春秋,仲尼曰:星之昭昭,不如月之曖曖。周易曰:含弘光大,品物咸亨。柔弱生之徒,老氏誡剛強。老子曰:人生也柔弱,其死也堅強;萬物草木生也柔脆,其死也枯槁。故堅強者死之徒,柔弱者生之徒也。又曰:柔弱勝剛強。河上公曰:柔弱者久長,剛強者先亡也。行行鄙夫志,悠悠故難量。論語曰:閔子侍側,誾誾如也。子路,行行如也。子曰:若由也不得其死然。鄭玄曰:行行,剛強貌。慎言節飲食,知足勝不祥。周易曰:君子以慎言語,節飲食。老子曰:知足不辱。行之苟有恆,久久自芬芳。郭璞三蒼曰:苟,誠也。

因為最終人成為了自己『習慣』作的那種人!這也就是『信念』的重要性!需知養成良好的『習慣』並非『教條』,而是一種『學習過程』的成果。

─── 摘自《《派生》 Python 作坊【己】楷模典範

 

歲末年終之時,喜聞『 Hexxeh/rpi-firmware 』更新,樹莓派將進入『 VC4/DRM 』顯示加速的時代︰

rpi-4.1.y pull: vc4: kernel-side fix for X rendering lag, plus 3D testing fix #1268

Next up I’ll send updates for userspace to be rebuilt, but this is a major bugfix for vc4 DRM.

Also note the /debug/dri/0/bo_stats and /gem_exec debugfs nodes, which may be useful to watch when bug reporting for issues like the rendering lag/OOM ones we’ve had.

……

# Overlay

Name:   vc4-kms-v3d
Info:   Enable Eric Anholt's DRM VC4 HDMI/HVS/V3D driver. Running startx or
        booting to GUI while this overlay is in use will cause interesting
        lockups.
Load:   dtoverlay=vc4-kms-v3d
Params: <None>

 

此刻正進入

# rpi-update 主流版本

pi@retropie:~ cat /proc/version  Linux version 4.1.17-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #834 SMP Mon Feb 1 15:17:54 GMT 2016 pi@raspberrypi ~ 

 

隨著斗轉星移,過去曾經麻煩的事情

Bit-banged I²C kernel driver

by kadamski » Tue Apr 16, 2013 10:10 am

I’ve made a handy kernel module for everybody wanting to use bit-banged host instead (or in addition to) hardware one. It’s like a wrapper for i2c-gpio kernel built-in module that let you dynamically create and remove i2c hosts on different gpio pins. It can be handy if you experience problems with hardware i2c clock stretching or you need more i2c hosts for some reason.

The code and some instructions can be found on my github. You need a custom kernel (with CONFIG_I2C_GPIO enabled) in order to use it. It got some limited testing so it should work but of course I don’t guarantee anything.

Anybody interested in testing this?

……

也已經簡單了。

# Overlay

Name:   i2c-gpio
Info:   Adds support for software i2c controller on gpio pins
Load:   dtoverlay=i2c-gpio,<param>=<val>
Params: i2c_gpio_sda             GPIO used for I2C data (default "23")

        i2c_gpio_scl             GPIO used for I2C clock (default "24")

        i2c_gpio_delay_us        Clock delay in microseconds
                                 (default "2" = ~100kHz)

※請參考『 Linux/drivers/i2c/busses/i2c-gpio.c

 

或許我們也應從善如流,一探春花春景的耶!!

【 dtoverlay=i2c-gpio 】

使用 i2c-gpio 預設值︰ GPIO23 是 SDA , GPIO24 為 SCL ,串接回硬體 I2C : GPIO0 SDA , GPIO1 SCL 。因此樹莓派上有兩個 I2C Master 。

Bit-Banging-I2C

 

pi@raspberrypi ~ ls /dev/i2c* -l crw-rw---- 1 root i2c 89, 1  1月 29 14:52 /dev/i2c-1 crw-rw---- 1 root i2c 89, 3  1月 29 14:52 /dev/i2c-3 pi@raspberrypi ~ 

 

都可定址 GrovePi 也。

pi@raspberrypi ~ i2cdetect -y 3      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 00:          -- -- 05 -- -- -- -- -- -- -- -- -- --  10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  70: -- -- -- -- -- -- -- --                           pi@raspberrypi ~ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- 05 -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
pi@raspberrypi ~ </pre>    <span style="color: #808080;"><strong>【 Bit-banged I²C 嚐鮮 】</strong></span> <pre class="lang:default decode:true "># 修改 grovepi.py ,選用 bus = smbus.SMBus(3) 。  pi@raspberrypi ~/example python
Python 2.7.9 (default, Mar  8 2015, 00:52:26) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import grovepi
>>> addr = 0x05
>>> grovepi.debugEnable()
>>> potentiometer = 0
>>> grovepi.pinMode(potentiometer,"INPUT")
1
>>> grovepi.analogRead(potentiometer)
0
[11, 2, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
702
>>> ultrasonic_ranger = 2
>>> grovepi.ultrasonicRead(ultrasonic_ranger)
0
[11, 0, 3, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
3
>>> power=7
>>> grovepi.pinMode(power,"OUTPUT")
1
>>> grovepi.digitalWrite(power,1)
1
>>> grovepi.digitalWrite(power,0)
1
>>> grovepi.bus.write_i2c_block_data(5, 1, [3] + [0, 0, 0])
>>> grovepi.bus.read_i2c_block_data(5, 1)
[0, 2, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> grovepi.bus.write_i2c_block_data(5, 1, [3] + [0, 0, 0])
>>> grovepi.read_i2c_byte(addr)
0
>>> grovepi.bus.read_i2c_block_data(5, 1)
[0, 2, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> grovepi.read_i2c_byte(addr)
0
>>> grovepi.read_i2c_block(addr)
[0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> grovepi.read_i2c_block(addr)
[0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> grovepi.read_i2c_block(addr)
[0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> grovepi.read_i2c_block(addr)
[0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> grovepi.read_i2c_block(addr)
[11, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> 

 

pi@raspberrypi ~ $ cat /dev/ttyUSB0
CMD = 5, index =  4

CMD = 3, index =  4

DATA = 0, 2, 190

CMD = 3, index =  0

CMD = 7, index =  4

DATA = 0, 0, 3

CMD = 7, index =  0

CMD = 5, index =  4

CMD = 2, index =  4

CMD = 2, index =  4

CMD = 3, index =  4

CMD = 3, index =  0

DATA = 0, 2, 190

CMD = 3, index =  4

DATA = 0, 2, 190

CMD = 3, index =  0

DATA = 0, 2, 190

DATA = 0, 2, 190

CMD = 1, index =  1

DATA = 0, 2, 190

CMD = 1, index =  2

DATA = 0, 2, 190

CMD = 1, index =  3

DATA = 0, 2, 190

CMD = 1, index =  4

DATA = 0, 2, 190

CMD = 1, index =  0
#