123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- TSIF driver serves piece of hardware found in Qualcomm MSM's.
- It deals with Digital Mobile Broadcast.
- If you are dealing with Qualcomm MSM that have relevant piece of hardware,
- read on.
- There are various Digital Mobile Broadcast (DMB) systems developed to receive
- audio and/or television broadcast programs by Mobile Station Modem (MSM).
- (in simplified words - cellular phone)
- All of these systems have similar architecture. They use radio link which
- is different from primary handset link and hence use the additional antenna.
- RF signal from the broadcast tuner goes to de-modulator.
- Regardless of actual tuner and de-modulator, all systems present
- ITU-T H.222.0 (also known as MPEG2) Transport Stream (HTS)
- to the Mobile Station Modem (MSM).
- TSIF stands for Transport Stream Interface;
- this is hardware block in MSM that receives HTS signal from the de-modulator.
- TSIF use serial interface with de-modulator;
- it buffers data received in internal registers.
- TSIF support data copying from its internal registers to the RAM
- with the Data Mover (DM).
- TSIF driver prevent MSM from sleeping while TSIF hardware is active.
- To achieve this, driver holds wake lock.
- For access to TSIF data, TSIF driver provides kernel API
- that may be used by another kernel module. As example for API usage,
- simple TSIF chardev adapter provided. It provides character device
- /dev/tsif0. This device may be opened by single process at a time.
- When read, it provides TS stream.
- Quick start:
- ### copy modules to the target
- adb push msm_tsif.ko /data/local/tmp/
- adb push tsif_chrdev.ko /data/local/tmp/
- ### Load modules on the target:
- adb shell mount -t debugfs debugfs /sys/kernel/debug
- adb shell insmod /data/local/tmp/msm_tsif.ko
- adb shell insmod /data/local/tmp/tsif_chrdev.ko
- ### Run capture:
- adb shell cat /dev/tsif0 > /data/local/tmp/tsif.dump
- # tests:
- adb shell mount -t debugfs debugfs /sys/kernel/debug
- adb shell rmmod tsif_chrdev
- adb shell rmmod msm_tsif
- adb shell insmod /data/local/tmp/msm_tsif.ko
- adb shell insmod /data/local/tmp/tsif_chrdev.ko
- adb shell 'echo 60 > /sys/devices/platform/msm_tsif.0/time_limit'
- adb shell 'echo "16 * 8" > /sys/devices/platform/msm_tsif.0/buf_config'
- # separate xterm:
- watch adb shell cat /sys/devices/platform/msm_tsif.0/stats
- # separate xterm:
- watch adb shell cat /sys/kernel/debug/msm_tsif.0/dma
- # separate xterm:
- adb shell dd if=/dev/tsif0 of=/dev/null
- Mode of operation
- TSIF hardware have 2 modes of operation: mode1 and mode 2.
- They differ in serial interface signals. Mode used should match demodulator
- chip interface.
- In addition to these 2 modes of operation, TSIF driver have pseudo-mode 3
- that means "debug mode" where all operation controlled through debug interfaces.
- Client configure TSIF mode of operation using tsif_set_mode().
- Alternatively, mode of operation may be configured using device attribute file:
- echo 1 > /sys/devices/platform/msm_tsif.0/mode
- Time limit
- TSIF driver maintains time limit value. Its value corresponds
- to the TSIF_TIME_LIMIT register in TSIF hardware.
- Value in ticks of tsif_ref_clk. If time between the end of previous
- packet and end of current one exceeds this value, timeout status reported
- for the current TSIF packet.
- Client configure TSIF time limit using tsif_set_time_limit().
- Alternatively, time limit may be configured using device attribute file:
- echo 100 > /sys/devices/platform/msm_tsif.0/time_limit
- TSIF packet format
- TSIF driver uses 192 byte packets; where first 188 packets is HTS packet;
- last 4 bytes consists of :
- 3 bytes TTS in bytes 188..190; and status byte ib byte 191.
- Status byte contains the following fields:
- Bit Name Comment
- 0 Valid Always set to 1 to indicate valid HTS packet and status.
- If set to 0, this packet is not valid and should be ignored
- 1 First packet When set, indicates 1-st packet of a new stream or
- 1-st valid packet after one or more packets were lost.
- 2 Overflow When set, indicates overflow condition in TSIF hardware;
- one or more packets were lost. Current packet is valid.
- 3 Error Indicates the tsif_error signal status
- 4 Null Indicates the tsif_null signal status
- 5 Reserved Don't care
- 6 Timeout Indicates the 1-st packet after timeout.
- First packet flag will also be set.
- Debug facilities
- TSIF driver provides extensive debugging facilities to assist debug both
- TSIF input and TSIF client interfaces. 2 mechanisms used:
- Device attribute, accessible through usual /sys hierarchy under
- /sys/devices/platform/msm_tsif.0, provides status and statistics information.
- Debugfs exposes more hardware and software details. In order to use debugfs,
- one need to mount it:
- adb shell mount -t debugfs debugfs /sys/kernel/debug
- When debugfs mounted, TSIF entries may be found under
- /sys/kernel/debug/msm_tsif.0
- Register access
- All TSIF hardware registers accessible through debugfs.
- $ adb shell ls -l /sys/kernel/debug/msm_tsif.0
- -r--r--r-- root root 0 1980-01-07 16:15 dma
- --w------- root root 0 1980-01-07 16:15 action
- -r--r--r-- root root 0 1980-01-07 16:15 gpios
- -r-------- root root 0 1980-01-07 16:15 data_port
- -r--r--r-- root root 0 1980-01-07 16:15 test_current
- -rw-r--r-- root root 0 1980-01-07 16:15 test_export
- --w------- root root 0 1980-01-07 16:15 test_reset
- -rw-r--r-- root root 0 1980-01-07 16:15 test_mode
- -rw-r--r-- root root 0 1980-01-07 16:15 test_ctl
- -rw-r--r-- root root 0 1980-01-07 16:15 lpbk_data
- -rw-r--r-- root root 0 1980-01-07 16:15 lpbk_flags
- -rw-r--r-- root root 0 1980-01-07 16:15 clk_ref
- -rw-r--r-- root root 0 1980-01-07 16:15 time_limit
- -rw-r--r-- root root 0 1980-01-07 16:15 sts_ctl
- TSIF clocks are off when TSIF is not running.
- To control TSIF through low level register access, it should be set to the
- mode 3 ("debug"); in addition, TSIF start/stop actions may be executed using
- debugfs action file:
- adb shell 'echo open > /sys/kernel/debug/msm_tsif.0/action'
- Possible actions are "open" and "close".
- DMA activity
- DMA activity may be queried using debugfs dma file:
- $ adb shell cat /sys/kernel/debug/msm_tsif.0/dma
- ri 16 | wi 24 | dmwi 40 | [ 24]{ 32} [ 32]{ 40}
- This file provides ri/wi/dmwi indexes
- (dmwi is for Data Mover write index - index for first location where
- next DMA may be scheduled);
- and 2 Data Mover transfer tasks, each in [wi] {next_wi} format.
- Here, wi is index DMA is scheduled for; next_wi is where driver's
- wi will be set after DMA completion.
- Driver status
- Driver status available through stats device attribute:
- $ adb shell cat /sys/devices/platform/msm_tsif.0/stats
- Device msm_tsif.0
- Mode = 1
- Time limit = 60
- State running
- Client = bf036f68
- Pkt/Buf = 64
- Pkt/chunk = 8
- --statistics--
- Rx chunks = 3288898
- Overflow = 4606
- Lost sync = 0
- Timeout = 1
- DMA error = 0
- Soft drop = 0
- IFI = 48
- --debug--
- GLBL_CLK_ENA = 0x637dfe23
- ROW_RESET = 0x000008c1
- CLK_HALT_STATEB = 0xde6d80ff
- TV_NS_REG = 0xf8e00b44
- TSIF_NS_REG = 0x00000b40
- GPIO
- Current GPIO values may be read using debugfs gpio file:
- $ adb shell cat /sys/kernel/debug/msm_tsif.0/gpios
- tsif_clk: 0
- tsif_en: 0
- tsif_data: 0
- tsif_sync: 0
- In normal regime, signals changed too fast for this facility to provide
- change by change log; it should be seen as random time capture.
- When debugging TSIF input connectivity, it may be helpful to run
- watch -d adb shell cat /sys/kernel/debug/msm_tsif.0/gpios
- to see if input ever changes. If nothing changes at all; it is indication
- for mis-configured input.
- Another tip: in case of wire connection between components, one may connect
- TSIF input pin to logical 1 instead of actual signal source,
- to verify this is the pin required.
- Inter frame interval
- To estimate incoming bit rate, TSIF driver measure average time interval
- between packets. Interval measured in tsif_ref_clk ticks. Actually, TSIF
- gets TTS from 1-st and last packets in chunk and use this time to calculate
- inter frame interval.
- Inter frame interval available as part of device statistics.
- Tip: to measure tsif_ref_clk frequency, this approach may be used:
- adb shell cat /sys/kernel/debug/msm_tsif.0/clk_ref; sleep 10; adb shell cat /sys/kernel/debug/msm_tsif.0/clk_ref
- 0x8db70ec8
- 0x8dc6974b
- Then, calculate (0x8dc6974b - 0x8db70ec8)/10 that is 101798.7 Hz
|