ACPI (FreeBSD के उदाहरण पर) लोड करने के प्रारंभिक चरण में उपकरणों को कॉन्फ़िगर करना

कई साल पहले, जब कार्डबस और फायरवायर (IEEE 1394) अभी भी अपेक्षाकृत "उपयोग में" थे, तो कई लैपटॉप निर्माताओं ने अपने उत्पादों में टेक्सास इंस्ट्रूमेंट्स PCIXX21 और PCIXX11 परिवार के नियंत्रकों का इस्तेमाल किया: एक छोटी चिप ने न केवल वर्णित इंटरफेस के लिए समर्थन प्रदान किया, बल्कि कई लोकप्रिय के लिए भी। हटाने योग्य मेमोरी कार्ड मानकों।

इस तरह के एक चिप (अर्थात्, PCI7411) भी मेरे NEC Versa S950 में है। मेरे समय में इस छोटे से ज्ञात लैपटॉप ने भी थिंकपैड-सीरीज़ को लगभग विशेष रूप से पसंद किया क्योंकि फ्रीबीएसडी (विशेष रूप से सामान्य और स्लीप मोड में उपकरण) के लिए बेहतर समर्थन के कारण - मैंने खरीदने से पहले विशेष रूप से नोवोसिबिर्स्क टेक्नोसिटी में इसका परीक्षण किया। लंबे समय तक मैं बिल्ट-इन कार्ड रीडर का उपयोग नहीं करता था, आदत से बाहर यूएसबी सीटी का उपयोग करता था। लेकिन मुझे हाल ही में पता चला कि फ्रीबीएसडी अभी भी इसका समर्थन नहीं करता है। और अगर पांच या छह साल पहले यह इन नियंत्रकों के लिए एक सामान्य ड्राइवर की कमी से समझाया जा सकता है (यह कुछ डाउनलोड करने और खुद को इकट्ठा करने के लिए आवश्यक था), अब मुझे यह सुनिश्चित करने के लिए पता था कि वे FreeBSD में sdhci(4) ड्राइवर द्वारा समर्थित "आउट ऑफ द बॉक्स" हैं sdhci(4) , जो मैनुअल पेज पर स्पष्ट रूप से कहा गया है (और बाद में स्रोत को पढ़कर पुष्टि की गई है)।

मैंने इस विषय पर धीरे-धीरे गूगल करना शुरू कर दिया, और तस्वीर नाखुश होने लगी। यह पता चला कि मेरे जैसे बहुत सारे "भाग्यशाली" हैं। डाक और मंचों पर कई पोस्ट किए गए dmesg और pciconf -lv , ट्रैकर्स में बग्स की शुरुआत की (उदाहरण के लिए, OpenBSD PR i386 / 5843), लेकिन किसी ने भी समाधान की पेशकश नहीं की। इसके अलावा, वास्तव में, इस सवाल का अंत करने के लिए, sdhci(4) ड्राइवर sdhci(4) के लेखक, अलेक्जेंडर मोटिन ने 2010 में फोरम में लिखा था कि उन्होंने चिप के लिए TI प्रलेखन नहीं दिया, जिसका अर्थ है कि अगर निर्माता ने चिप को गलत तरीके से कॉन्फ़िगर किया है, और इसके माध्यम से सेटिंग कर रहा है। BIOS प्रदान नहीं किया गया है, कुछ भी करना मुश्किल है। बदले में, थियो डी रैडट ने शब्दों के साथ i386 / 5843 को बंद कर दिया: "हम वही करते हैं जो हम कर सकते हैं। यह विक्रेता, अन्य के बीच, अपने sdhc नियंत्रकों को बंद कर दिया गया है और थोड़ा अनिर्दिष्ट बिट्स के पीछे छिपा हुआ है। हमने यह जानकारी प्राप्त करने से पहले संघर्ष किया है, और असफल रहे। यदि आप यह जानकारी किसी अन्य ऑपरेटिंग सिस्टम, या कुछ वेंडर प्रलेखन में पा सकते हैं, तो हम रोमांचित हो जाएंगे। ”

हताशा में, मैंने उबंटू लाइवसीडी से बूट किया। और मुझे बहुत आश्चर्य हुआ कि लिनक्स कार्ड रीडर काम करता है। इसलिए ...

बुरी तरह से मारा गया


यह पता चला है कि 2006 में, एलेक्स डबोव ने TI फ्लैशमीडिया पाठकों के लिए एक लिनक्स ड्राइवर लिखा था। मैंने स्रोतों को डाउनलोड किया और उनका अध्ययन करना शुरू किया, बाद में sdhci(4) अंतिम रूप देने या यहां तक ​​कि पूरे ड्राइवर को स्पोर्ट करने की उम्मीद की। सबसे पहले, मैंने "हमारे" ड्राइवर के साथ तुलना करने के लिए समर्थित पीसीआई विक्रेता / डिवाइस आईडी की सूची देखी। यह छोटा निकला:

 $ cat linux/pci_ids.h #define PCI_VENDOR_ID_TI 0x104c #define PCI_DEVICE_ID_TI_XX21_XX11_FM 0x8033 #define PCI_DEVICE_ID_TI_XX12_FM 0x803b #define PCI_DEVICE_ID_TI_XX20_FM 0xac8f 

नंबर 0x8033 पहले से ही मेरे लैपटॉप पर pciconf -lv के आउटपुट से परिचित है (चिप = 0x8033 104c):

 none3@pci0:6:7:3: class=0x018000 card=0x83191033 chip=0x8033104c rev=0x00 hdr=0x00 vendor = 'Texas Instruments (TI)' device = 'PCIxx11/21 Integrated FlashMedia Controller' class = mass storage 

यह वही कार्ड रीडर है जो FreeBSD पर काम नहीं करता है, लेकिन लिनक्स पर काम करता है। और यहाँ sdhci.c (FreeBSD) से कोड का एक टुकड़ा है:

 static const struct sdhci_device { uint32_t model; uint16_t subvendor; char *desc; u_int quirks; } sdhci_devices[] = { { 0x08221180, 0xffff, "RICOH R5C822 SD", SDHCI_QUIRK_FORCE_DMA }, { 0xe8221180, 0xffff, "RICOH SD", SDHCI_QUIRK_FORCE_DMA }, { 0xe8231180, 0xffff, "RICOH R5CE823 SD", SDHCI_QUIRK_LOWER_FREQUENCY }, { 0x8034104c, 0xffff, "TI XX21/XX11 SD", SDHCI_QUIRK_FORCE_DMA }, 

आप देख सकते हैं कि डिवाइस पहचानकर्ता TI XX21 / XX11 SD (0x803 4 104c) एक अंक की सटीकता के साथ मेरा (0x803 3 104c) जैसा है। इसके अलावा, मैंने देखा कि कार्डबस (0x8031104c) और फायरवायर (0x8032104c) नियंत्रकों में न केवल समान आईडी है, बल्कि सभी उपकरणों के पीसीआई चयनकर्ता केवल फ़ंक्शन संख्या में भिन्न होते हैं, और वे सभी एक ही डिवाइस हैं:

 none1@pci0:6:7:0: class=0x060700 card=0x83191033 chip=0x8031104c rev=0x00 hdr=0x02 vendor = 'Texas Instruments (TI)' device = 'PCIxx21/x515 Cardbus Controller' class = bridge subclass = PCI-CardBus none2@pci0:6:7:2: class=0x0c0010 card=0x83191033 chip=0x8032104c rev=0x00 hdr=0x00 vendor = 'Texas Instruments (TI)' device = 'OHCI Compliant IEEE-1394 FireWire Controller' class = serial bus subclass = FireWire 

साशा मोतिन के शब्दों को याद करते हुए कि चिप वास्तव में दोनों नियंत्रकों (एसडीएचसीआई और फ्लैशमीडिया) को लागू करती है, मैंने और अधिक उद्देश्यपूर्ण तरीके से खोजना शुरू किया, और जल्द ही एक और पोस्ट आया, और फिर फ्रीबस्ड-मोबाइल पर एक संदेश एक समान (लेकिन थोड़ा) HP NC6220 पर एक और) समस्या। कहीं भी, सभी चर्चाओं के विपरीत, एक काम करने वाला समाधान पेश नहीं किया गया था, जो "ड्राइवर के नवीनतम संस्करण को आज़माने के लिए" या "माफ करना, लेकिन ऐसा लगता है कि आप उड़ान में हैं" जैसे बेवकूफ सुझावों पर उबले हुए हैं, अब, कम से कम, यह स्पष्ट हो गया है कि चिप विन्यास किसी तरह पीसीआई फ़ंक्शन डंप में प्रदर्शित होता है (जिसका अर्थ है कि इसे बदलना संभव है), और सबसे महत्वपूर्ण बात, प्रलेखन अभी भी उपलब्ध है: PCIXXX21 / PCIXXX11 कार्यान्वयन गाइड । और यहाँ यह मेरे लिए वास्तव में दिलचस्प हो गया।

आगे देखते हुए, मैं कहूंगा कि सबसे आश्चर्यजनक बात यह है कि लोगों ने एक "मूडी" चिप पर व्यावहारिक रूप से एक डेटशीट खोदी है, समस्या को हल करने से एक कदम दूर रोक दिया। मैंने कभी भी किसी से एक नुस्खा नहीं पाया कि कैसे ठीक से प्रलेखन का उपयोग करें (जिसने मुझे यह पोस्ट लिखने के लिए प्रेरित किया)। लेकिन पहले बातें पहले।

PCIXXX21 / PCIXXX11 कार्यान्वयन गाइड - इन नियंत्रकों के आधार पर हार्डवेयर डिजाइनरों के लिए 117-पृष्ठ का दस्तावेज़। इसका विस्तार से विश्लेषण करने का कोई मतलब नहीं है; सबसे महत्वपूर्ण बात जो मैंने इससे सीखी: नियंत्रक वास्तव में पांच कार्यों को लागू करता है: कार्डबस, 1394, फ्लैशमीडिया, एसडी होस्ट और स्मार्टकार्ड; प्रारंभिक कॉन्फ़िगरेशन आमतौर पर EEPROM से लिया जाता है। मुख्य विन्यास रजिस्टर - सामान्य नियंत्रण रजिस्टर (अनुभाग 12.4.28, पी। 65) - रॉम में 1Eh-1Fh पतों पर स्थित है (हम केवल बाइट शून्य में रुचि रखते हैं, क्योंकि यह वह जगह है जहां चिप कार्य नकाबपोश हैं) और शून्य फ़ंक्शन 86 के PCI ऑफसेट 86 से मेल खाती है डिवाइस। अब -

व्यापार के लिए


सबसे पहले, देखते हैं कि pciconf(8) उपयोगिता हमें चिप के "हेड" (शून्य) फ़ंक्शन के पीसीआई कॉन्फ़िगरेशन स्पेस के बारे में बताती है, जो कि फ्रीबीएसडी शब्दावली में है, pci0:6:7:0 चयनकर्ता। संक्षिप्तता के लिए, मैं सभी 256 बाइट्स को डंप नहीं करूंगा, लेकिन मैं खुद को केवल उन लोगों तक ही सीमित कर दूंगा, जिनकी भरपाई 86h में की जाती है:

 # pciconf -rb pci0:6:7:0 0x86 d3 

यह तो इंटरेस्टिंग है। हम पीडीएफ़एस के 65 वें पृष्ठ पर प्लेट को देखते हैं, हम देखते हैं कि निचले नीबले (कुतरना) में ट्रिपल शीर्ष स्तर के मध्यस्थता के लिए जिम्मेदार बिट्स के विशिष्ट मूल्य के बराबर है, स्मार्टकार्ड सॉकेट पावर कंट्रोल और ओएचसीआई 1394, यह हमारे लिए बहुत कम रुचि है। लेकिन शीर्ष निबल सिर्फ मास्क (चालू / बंद) बाकी नियंत्रकों के तर्क (मैं पूरी मेज नहीं देता, फिर से, अंतरिक्ष को बचाने के लिए):

scpu022a.pdf खंड 12.4.28


0xD 1101 है, अर्थात DISABLE_SC, DISABLE_SD और DISABLE_SKTB बिट सेट हो गए हैं, और DISABLE_FM बिट साफ़ हो गया है। इसलिए, SD होस्ट कंट्रोलर को "पुनर्जीवित" करने के लिए, हमें, तार्किक रूप से, DISABLE_SD (सक्षम) और DISABLE_FM को इसके विपरीत, सेट (अक्षम) करने की आवश्यकता है। मास्क 1011 मान 0xB से मेल खाता है, अर्थात वास्तव में, हमें बाइट 0xD3 से 0xB3 को बदलना होगा । हालाँकि, समस्या यह है कि आपको यह पहले से बहुत अच्छी तरह से करने की आवश्यकता है, इससे पहले कि चिप को आरंभीकृत किया जाए, या इसके बजाय, यह निर्धारित किया जाए कि इसमें कौन से नियंत्रक शामिल हैं। सिस्टम बूट हो जाने के बाद, कॉन्फ़िगरेशन बदलना बेकार है: सभी डिवाइस पहले से ही "ऑपरेशन में" हैं। और यहाँ हमारी सहायता के लिए आता है

ACPI


मुझे समझ नहीं आया कि ACPI क्या है और इसकी आवश्यकता क्यों है: यह विषय के दायरे से परे है, इसके अलावा, इस विषय पर Habré पर पहले से ही एक अच्छी पोस्ट थी। इस मामले में, हमारे लिए महत्वपूर्ण प्रश्न यह है: क्या चिप को प्रारंभ करने से पहले DSDT को पैच करना संभव है, ताकि यह वांछित नियंत्रक (एसडी होस्ट) को चालू करता है और अनावश्यक को बंद कर देता है, जिसके लिए हमारे पास ड्राइवर (फ्लैशमैडिया) नहीं है।

आइए देखें कि एसीपीआई के दुभाषिया ("आभासी मशीन") के ढांचे के भीतर डिबगिंग और आउटपुट जानकारी के लिए हमारे पास क्या मतलब है। एसीपीआई विनिर्देश (पैराग्राफ 19.5.25, पी। 733) में एक विशेष Debug ऑब्जेक्ट का उल्लेख है जिसे ऑपरेटिंग सिस्टम को उपयोगकर्ता को "संदेश" देना होगा। FreeBSD पर, debug.acpi.enable_debug_objects सिस्टम वैरिएबल, जिसे एक पर सेट किया जाना चाहिए, इसके लिए जिम्मेदार है:

 # sysctl debug.acpi.enable_debug_objects=1 debug.acpi.enable_debug_objects: 0 -> 1 

अब हम Debug में मनमानी लाइनें लिख सकते हैं, और फ्रीबीएसडी कर्नेल उन्हें कंसोल में आउटपुट करेगा। यह पता लगाने के लिए बना हुआ है कि एसीपीआई को वह जानकारी कैसे जारी करनी चाहिए जिसकी हम मांग में रुचि रखते हैं। शुरू करने के लिए, हम लैपटॉप के डीएसडीटी को डंप और डिसाइड करेंगे, और हम इसका अध्ययन करेंगे:

 # acpidump -dt > s950.asl 

मैंने एक ऐसी विधि खोजने का फैसला किया, जिसे कुछ बाहरी प्रभाव (या आंतरिक, लेकिन आवधिक, जैसे कि बैटरी को फैलाना) के माध्यम से कहा जाता है, जबकि व्यावहारिक रूप से "लोहा" के संचालन को प्रभावित नहीं करता है। DSDT कोड का अध्ययन, मैं एक जिज्ञासु के हिस्से में आया:

 Method (_Q0C, 0, NotSerialized) { If (\_SB.PCI0.PEGA) { \_SB.PCI0.PEGP.VGA.SWIH () } Else { Store (0x01, TLST) HKDS (0x0A) } } 

कहीं और विधि \_SB.PCI0.PEGP.VGA.SWIH कहा जाता है, और इसका नाम संकेत देता है कि यह किसी प्रकार का प्रदर्शन स्विच है। कई लैपटॉप के कीबोर्ड पर, एफएन-संशोधक के संयोजन में फ़ंक्शन कुंजियों में से एक वीडियो डिस्प्ले को आंतरिक डिस्प्ले से बाहरी एक पर स्विच करता है। मेरे "संस्करण" पर यह F3 है। आइए निम्नानुसार विधि कोड को संशोधित करने का प्रयास करें:

  Method (_Q0C, 0, NotSerialized) { + Store ("Fn-F3 pressed", Debug) If (\_SB.PCI0.PEGA) { 

ASL का पुनर्निर्माण करें:

 # iasl s950-patched.asl Intel ACPI Component Architecture ASL Optimizing Compiler version 20101013-32 Copyright (c) 2000 - 2010 Intel Corporation ASL Input: s950-patched.asl - 7749 lines, 280987 bytes, 2840 keywords AML Output: /tmp/acpidump.aml - 24863 bytes, 640 named objects, 2200 executable opcodes Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 958 Optimizations # cp /tmp/acpidump.aml /root/s950-patched.aml 

FreeBSD को बूट में हमारी तालिका का उपयोग करने के लिए, निम्नलिखित पंक्तियों को /boot/loader.conf :

 acpi_dsdt_load="YES" acpi_dsdt_name="/root/s950-patched.aml" 

यदि सब कुछ सही ढंग से किया गया है, और हमारी गणना उचित है, तो जब आप Fn-F3 पर क्लिक करते हैं, तो हम कंसोल पर कर्नेल संदेश (उच्च चमक) देखेंगे जो Fn-F3 कुंजी दबाया गया है। अब जब हम एसीपीआई के साथ बातचीत करने में सक्षम हैं, तो यह कोशिश करने का समय है

रजिस्टर पर दस्तक 86h


विभिन्न उपकरणों (रैम, इनपुट / आउटपुट पोर्ट, एक्सपेंशन कार्ड, सीएमओएस, आईपीएमआई, आदि) के भौतिक पता स्थान तथाकथित के रूप में एसीपीआई नाम स्थान पर मैप किए जाते हैं। परिचालन क्षेत्र (ऑपरेशनग्रेजियन), जिसके अंदर बिट फ़ील्ड (फ़ील्ड), आमतौर पर "वर्चुअल रजिस्टरों", या फ़ील्ड इकाइयों (पैराग्राफ 19.5.96, विनिर्देश के 782) के नाम से आम तौर पर आवंटित किए जाते हैं। हमारे नियंत्रक के लिए ऑपरेशनरीजन, उदाहरण के लिए, इस तरह दिख सकता है:

 OperationRegion (PCIC, PCI_Config, 0x00, 256) Field (PCIC, AnyAcc, NoLock, Preserve) { Offset (0x86), // General Control Register   86h TLA, 2, // Top level arbitration SCSP, 1, // SmartCard socket power OHCI, 1, // Disable OHCI 1394 controller function SKTB, 1, // Disable CardBus socket B FM, 1, // Disable FlashMedia function SD, 1, // Disable SD host controller function SC, 1, // Disable SmartCard function } 

या और भी सरल, यदि सभी 256 बाइट्स ऑपरेशनराइजेशन में घोषित नहीं किए जाते हैं, लेकिन हम केवल रुचि रखते हैं और हम कॉन्फ़िगरेशन रजिस्टर में व्यक्तिगत बिट्स का चयन नहीं करते हैं:

 OperationRegion (PCIC, PCI_Config, 0x86, 0x01) Field (PCIC, AnyAcc, NoLock, Preserve) { GCR0, 8, // General Control Register (Byte 0) } 

यह नोटिस करना आसान है कि अपने आप में ऐसी परिभाषा बेकार है: यह किसी भी उपकरण से बंधा नहीं है, अनिवार्य रूप से एक ज्ञात ऑफसेट पर केवल एक बाइट की एक संरचना है। DSDT में Device कीवर्ड Device (पैराग्राफ 19.5.30, पी। 735) के माध्यम से निर्दिष्ट किए जाते हैं; सभी उपकरणों की समग्रता एक प्रकार का वृक्ष है। इसलिए, सभी PCI डिवाइस अक्सर डिवाइस स्पेस \_SB.PCI0 अंदर स्थित \_SB.PCI0 , जो रूट PCI बस से मेल खाती है (आमतौर पर केवल एक बस होती है, लेकिन सैद्धांतिक रूप से एक PCI डोमेन में 256 तक हो सकती है)।

डिवाइस को बस में पहचानने के लिए, आपको उसका पता फॉर्म में सेट करना होगा (डिवाइस << 16) | समारोह। हमारे मामले में ( pciconf -lv के आउटपुट को याद रखें?) फ़ंक्शन = 0, डिवाइस = 7, बस = 6. अर्थात, डिवाइस, जाहिरा तौर पर, कुछ इस तरह दिखना चाहिए:

 Device (XX11) { Name (_ADR, 0x00070000) // pci0:6:7:0 } 

ठीक है, लेकिन छठा टायर कहां से आया? और वह डीएसडीटी में कहां है? आइए देखें कर्नेल बूट लॉग ( dmesg ):

 $ dmesg | grep pci6 pci6: <ACPI PCI bus> on pcib4 pci6: <bridge, PCI-CardBus> at device 7.0 (no driver attached) pci6: <serial bus, FireWire> at device 7.2 (no driver attached) pci6: <mass storage> at device 7.3 (no driver attached) pci6: <network> at device 8.0 (no driver attached) $ dmesg | grep pcib4 pcib4: <ACPI PCI-PCI bridge> at device 30.0 on pci0 pci6: <ACPI PCI bus> on pcib4 

यह पता चला है कि पीसीआई-पीसीआई पुल पर pci6 एक अतिरिक्त, "वर्चुअल" बस है। नंबर 6 (साथ ही पुल के लिए 4) उसे मिला क्योंकि FreeBSD ने उपकरणों का वितरण किया था। डीएसडीटी के अंदर, निश्चित रूप से, छह बसें और चार पुल नहीं हैं। पुल - Device (PCIB) - जैसा कि अपेक्षित है, ठीक वैसा ही है। हमारा पूरा विवरण इस तरह दिखना चाहिए (मैं एक संक्षिप्त संस्करण देता हूं, रजिस्टर को अलग-अलग बिट्स में विघटित किए बिना):

 Scope (\_SB.PCI0.PCIB) { Device (XX11) { Name (_ADR, 0x00070000) // pci0:6:7:0 OperationRegion (PCIC, PCI_Config, 0x86, 0x01) Field (PCIC, AnyAcc, NoLock, Preserve) { GCR0, 8, } } } 

अब हम अपने डिबगिंग कोड को _Q0C विधि _Q0C कुछ और सार्थक के _Q0C बदल सकते हैं:

  Method (_Q0C, 0, NotSerialized) { + Store (Concatenate("GCR0 = 0x", \_SB.PCI0.PCIB.XX11.GCR0), Debug) If (\_SB.PCI0.PEGA) { 

ASL का पुनर्निर्माण करें, रिबूट करें, Fn-F3 दबाएं। यदि हमने सब कुछ सही किया है, तो हमें वही मूल्य देखना चाहिए जो हमने पहले pciconf(8) माध्यम से पढ़ा था:

वेनिला pciconf -lv


(वीडियो मेमोरी में सीधे रजिस्टर मूल्य लिखने के लिए फ़ंक्शन का कार्यान्वयन पाठक के लिए एक आसान अभ्यास के रूप में छोड़ दिया गया है।)

यह हमारे लिए सबसे महत्वपूर्ण प्रश्न का उत्तर देने के लिए बना हुआ है: क्या रजिस्टर के मूल्य को बदलना और चिप को अपने आप को कॉन्फ़िगर करने के लिए मजबूर करना संभव होगा?

ACPI मानक उपकरणों को आरम्भ करने के लिए एक विशेष विधि को परिभाषित करता है, _INI (पैराग्राफ 6.5.1, पृष्ठ 349)। हमारे डिवाइस में निम्नलिखित कोड जोड़ें:

 Method (_INI) { Store (0xB3, GCR0) /*     : Store (0x01, FM) Store (0x00, SD) */ } 

हम ASL संकलित करते हैं, परिणामी AML फ़ाइल को /root/s950-patched.aml पर /root/s950-patched.aml , और फिर से रीबूट करें। को देखो

परिणाम


pciconf -lv प्लेबैक के बाद


सबसे पहले, ध्यान दें कि 0x803 3 104c (FlashMedia) नियंत्रक pciconf -lv से गायब हो गया, लेकिन 0x803 4 104c (SD होस्ट) दिखाई दिया। हम आवश्यक कर्नेल मॉड्यूल लोड करते हैं, कार्ड सम्मिलित करते हैं और इसे माउंट करने का प्रयास करते हैं:

 # kldload sdhci mmc mmcsd # ls /dev/mmcsd0* /dev/mmcsd0 /dev/mmcsd0s1 # mount -t msdosfs /dev/mmcsd0s1 /mnt/tmp # ls /mnt/tmp/DCIM/100CANON IMG_0403.JPG IMG_0424.JPG IMG_0450.JPG IMG_0494.JPG IMG_0515.JPG IMG_0406.JPG IMG_0425.JPG IMG_0451.JPG IMG_0498.JPG IMG_0517.JPG IMG_0407.JPG IMG_0427.JPG IMG_0452.JPG IMG_0499.JPG IMG_0518.JPG IMG_0409.JPG IMG_0429.JPG IMG_0453.JPG IMG_0500.JPG IMG_0520.JPG IMG_0410.JPG IMG_0430.JPG IMG_0467.JPG IMG_0501.JPG IMG_0522.JPG IMG_0412.JPG IMG_0439.JPG IMG_0473.JPG IMG_0506.JPG IMG_0525.JPG IMG_0413.JPG IMG_0440.JPG IMG_0474.JPG IMG_0507.JPG IMG_0526.JPG IMG_0414.JPG IMG_0445.JPG IMG_0475.JPG IMG_0508.JPG IMG_0534.JPG IMG_0415.JPG IMG_0447.JPG IMG_0478.JPG IMG_0510.JPG IMG_0535.JPG IMG_0421.JPG IMG_0448.JPG IMG_0492.JPG IMG_0512.JPG IMG_0537.JPG IMG_0423.JPG IMG_0449.JPG IMG_0493.JPG IMG_0514.JPG IMG_0538.JPG # tar cf /dev/null /mnt/tmp/DCIM/100CANON ; echo $? tar: Removing leading '/' from member names 0 

ऐसा लगता है कि सब कुछ अच्छा, अच्छा काम करता है। आप डीएसडीटी से डिबगिंग कोड को हटा सकते हैं और कार्ड रीडर का उपयोग करके जीवन का आनंद ले सकते हैं

Source: https://habr.com/ru/post/In150887/


All Articles